diff options
author | Robert Jonsson <spamatica@gmail.com> | 2009-12-27 11:30:35 +0000 |
---|---|---|
committer | Robert Jonsson <spamatica@gmail.com> | 2009-12-27 11:30:35 +0000 |
commit | b703eab295330e6f81564fbb39a10a1a2fdd2f54 (patch) | |
tree | e46b5c9a6bc22fd661c15d1d2123f5bf631cef80 /muse_qt4_evolution/synti/zynaddsubfx/DSP/FFTwrapper.C | |
parent | 5d5fa0fdf913907edbc3d2d29a7548f0cb658c94 (diff) |
moved old qt4 branch
Diffstat (limited to 'muse_qt4_evolution/synti/zynaddsubfx/DSP/FFTwrapper.C')
-rw-r--r-- | muse_qt4_evolution/synti/zynaddsubfx/DSP/FFTwrapper.C | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/muse_qt4_evolution/synti/zynaddsubfx/DSP/FFTwrapper.C b/muse_qt4_evolution/synti/zynaddsubfx/DSP/FFTwrapper.C new file mode 100644 index 00000000..7c67e631 --- /dev/null +++ b/muse_qt4_evolution/synti/zynaddsubfx/DSP/FFTwrapper.C @@ -0,0 +1,99 @@ +/* + ZynAddSubFX - a software synthesizer + + FFTwrapper.c - A wrapper for Fast Fourier Transforms + Copyright (C) 2002-2005 Nasca Octavian Paul + Author: Nasca Octavian Paul + + This program is free software; you can redistribute it and/or modify + it under the terms of version 2 of the GNU General Public License + as published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License (version 2) for more details. + + You should have received a copy of the GNU General Public License (version 2) + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include <math.h> +#include "FFTwrapper.h" + +FFTwrapper::FFTwrapper(int fftsize_){ + fftsize=fftsize_; + tmpfftdata1=new fftw_real[fftsize]; + tmpfftdata2=new fftw_real[fftsize]; +#ifdef FFTW_VERSION_2 + planfftw=rfftw_create_plan(fftsize,FFTW_REAL_TO_COMPLEX,FFTW_ESTIMATE|FFTW_IN_PLACE); + planfftw_inv=rfftw_create_plan(fftsize,FFTW_COMPLEX_TO_REAL,FFTW_ESTIMATE|FFTW_IN_PLACE); +#else + planfftw=fftw_plan_r2r_1d(fftsize,tmpfftdata1,tmpfftdata1,FFTW_R2HC,FFTW_ESTIMATE); + planfftw_inv=fftw_plan_r2r_1d(fftsize,tmpfftdata2,tmpfftdata2,FFTW_HC2R,FFTW_ESTIMATE); +#endif +}; + +FFTwrapper::~FFTwrapper(){ +#ifdef FFTW_VERSION_2 + rfftw_destroy_plan(planfftw); + rfftw_destroy_plan(planfftw_inv); +#else + fftw_destroy_plan(planfftw); + fftw_destroy_plan(planfftw_inv); +#endif + + delete [] tmpfftdata1; + delete [] tmpfftdata2; +}; + +/* + * do the Fast Fourier Transform + */ +void FFTwrapper::smps2freqs(REALTYPE *smps,FFTFREQS freqs){ +#ifdef FFTW_VERSION_2 + for (int i=0;i<fftsize;i++) tmpfftdata1[i]=smps[i]; + rfftw_one(planfftw,tmpfftdata1,tmpfftdata2); + for (int i=0;i<fftsize/2;i++) { + freqs.c[i]=tmpfftdata2[i]; + if (i!=0) freqs.s[i]=tmpfftdata2[fftsize-i]; + }; +#else + for (int i=0;i<fftsize;i++) tmpfftdata1[i]=smps[i]; + fftw_execute(planfftw); + for (int i=0;i<fftsize/2;i++) { + freqs.c[i]=tmpfftdata1[i]; + if (i!=0) freqs.s[i]=tmpfftdata1[fftsize-i]; + }; +#endif + tmpfftdata2[fftsize/2]=0.0; +}; + +/* + * do the Inverse Fast Fourier Transform + */ +void FFTwrapper::freqs2smps(FFTFREQS freqs,REALTYPE *smps){ + tmpfftdata2[fftsize/2]=0.0; +#ifdef FFTW_VERSION_2 + for (int i=0;i<fftsize/2;i++) { + tmpfftdata1[i]=freqs.c[i]; + if (i!=0) tmpfftdata1[fftsize-i]=freqs.s[i]; + }; + rfftw_one(planfftw_inv,tmpfftdata1,tmpfftdata2); + for (int i=0;i<fftsize;i++) smps[i]=tmpfftdata2[i]; +#else + for (int i=0;i<fftsize/2;i++) { + tmpfftdata2[i]=freqs.c[i]; + if (i!=0) tmpfftdata2[fftsize-i]=freqs.s[i]; + }; + fftw_execute(planfftw_inv); + for (int i=0;i<fftsize;i++) smps[i]=tmpfftdata2[i]; +#endif + +}; + + + + |