FFTW - FFTW_REDFT00和FFTW_DHT标志之间的差异

时间:2013-12-06 17:41:01

标签: fft fftw

我有兴趣在实际数据上使用FFTW进行一维FFT。

为此,我使用频率等于10 Hz且采样频率为sizex * frequency_signal的cosinus信号,其中sizex为采样点数。

将标志(FFTW_DHT)导入fftw_plan_r2r_1d(sizex, Array, Array, FFTW_DHT, FFTW_ESTIMATE);,我得到f = 10 Hz的dirac冲击,这里是输出(第1列:k * f_sampling / size x和第2列:X_k )在前进fft之后:

0.000000 7.304123e-14
10.000000 5.000000e+01
20.000000 -2.227743e-14
30.000000 -1.300521e-14
40.000000 -3.774757e-15
50.000000 -2.989904e-15
60.000000 -4.879698e-15
70.000000 -2.838093e-15
80.000000 -5.479074e-16
90.000000 1.605429e-15
100.000000 -1.491050e-15
110.000000 -2.587601e-16

...

但是对于FFTW_REDFT00,我无法在f = 10 Hz时产生dirac冲击。在这种情况下,我有以下输出:

0.000000 -1.998027e+00
10.000000 2.682414e+00
20.000000 9.843837e+01
30.000000 -1.543229e+00
40.000000 6.493255e-01
50.000000 -3.723752e-01
60.000000 2.449150e-01
70.000000 -1.744771e-01
80.000000 1.310807e-01
90.000000 -1.023168e-01
100.000000 8.221456e-02
110.000000 -6.758738e-02
...

我可以用FFTW_REDFT00标志获得f = 10 Hz的dirac吗?

这两个标志之间究竟有什么区别,即如何找到FFTW_DHTFFTW_REDFT00标志的相同结果。

fftw DFT doc开始,我认为这两个标志产生了相同的结果,但事实并非如此。

我想从一个切换到另一个。如果我知道如何反转它们,它可以帮助我使用FFTW_REDFT00标志的代码。

1 个答案:

答案 0 :(得分:1)

首先,请注意http://www.fftw.org/fftw3_doc/1d-Real_002deven-DFTs-_0028DCTs_0029.html, 在余弦的论证中,REDFT00在π之前错过了2倍。这就是为什么你看到20Hz左右而不是10Hz的峰值。

其次,REDFT00特别棘手,因为它需要你分配一个额外的元素。也就是说,Array应该包含sizex + 1个元素,您应该将计划创建为

fftw_plan_r2r_1d(sizex + 1, Array, Array, FFTW_REDFT00, FFTW_ESTIMATE);

如果没有额外的1,峰值就会扩大,如你所见。

避免峰值扩大。遵循这些规则。如果您准备信号为

for (i = 0; i <= n; i++) a[i] = cos(2*M_PI*10*i/n);

然后通过以下方式检测:

fftw_plan_r2r_1d(n + 1, a, a, FFTW_REDFT00, FFTW_ESTIMATE);

如果您准备信号

for (i = 0; i < n; i++) a[i] = cos(2*M_PI*10*(i+0.5)/n);

然后通过以下方式检测:

fftw_plan_r2r_1d(n, a, a, FFTW_REDFT10, FFTW_ESTIMATE);

如果您准备信号

for (i = 0; i < n; i++) a[i] = cos(2*M_PI*10.25*i/n);

然后通过以下方式检测:

fftw_plan_r2r_1d(n, a, a, FFTW_REDFT01, FFTW_ESTIMATE);

如果您准备信号

for (i = 0; i < n; i++) a[i] = cos(2*M_PI*10.25*(i + .5)/n);

然后通过以下方式检测:

fftw_plan_r2r_1d(n, a, a, FFTW_REDFT11, FFTW_ESTIMATE);