只分析一维度的
一、fftw_plan_dft_1d
正变换:
fftw_complex *in = fftw_malloc ( sizeof ( fftw_complex ) * n );
fftw_complex *out = fftw_malloc ( sizeof ( fftw_complex ) * n );
plan_forward = fftw_plan_dft_1d ( n, in, out, FFTW_FORWARD, FFTW_ESTIMATE );
fftw_execute ( plan_forward );
n就是总体个数,不是啥一半还是一半加一那种,in和out都是fftw_complex这种类型
反变换:
fftw_complex *in2 = fftw_malloc ( sizeof ( fftw_complex ) * n );
plan_backward = fftw_plan_dft_1d ( n, out, in2, FFTW_BACKWARD, FFTW_ESTIMATE );
fftw_execute ( plan_backward );
这时候的in2并不是原来的in,要除以n才可以完全回去和最初的align
matlab中的 ifft()/n
使用完之后,释放内存:
fftw_destroy_plan ( plan_forward );
fftw_destroy_plan ( plan_backward );
fftw_free ( in );
fftw_free ( in2 );
fftw_free ( out );
matlab code: fft(a) 和 ifft(a)
二、fftw_plan_dft_r2c_1d 和 fftw_plan_dft_c2r_1d
double *in = fftw_malloc ( sizeof ( double ) * n );
nc = ( n / 2 ) + 1;
fftw_complex* out = fftw_malloc ( sizeof ( fftw_complex ) * nc );
plan_forward = fftw_plan_dft_r2c_1d ( n, in, out, FFTW_ESTIMATE );
fftw_execute ( plan_forward );
c code
0 55.000000 0.000000
1 -5.000000 15.388418
2 -5.000000 6.881910
3 -5.000000 3.632713
4 -5.000000 1.624598
5 -5.000000 0.000000
matlab code
fft([1:10]) =
55
-5 + 15.3884176858763i
-5 + 6.88190960235587i
-5 + 3.6327126400268i
-5 + 1.62459848116453i
-5
-5 - 1.62459848116453i
-5 - 3.6327126400268i
-5 - 6.88190960235587i
-5 - 15.3884176858763i
反变换
in2 = fftw_malloc ( sizeof ( double ) * n );
out = fftw_malloc ( sizeof ( fftw_complex ) * nc );
plan_backward = fftw_plan_dft_c2r_1d ( n, out, in2, FFTW_ESTIMATE );
fftw_execute ( plan_backward );
要完全回去还得除以n
in2[i] / ( double ) ( n )