我对在真实数据上用FFTW做一维FFT很感兴趣。
为此,我使用频率等于10 Hz的余弦信号,采样频率为sizex*frequency_signal,采样点数为sizex。
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的狄拉克脉冲了。在本例中,我的输出如下:
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的狄拉克吗?
这两个标志到底有什么不同,也就是说,我怎样才能找到带有FFTW_REDFT00标志的FFTW_DHT的相同结果。
在fftw DFT doc中,我认为这两个标志产生了相同的结果,但显然情况并非如此。
我只想从一个切换到另一个。如果我知道如何反转它们,它可以帮助我编写使用FFTW_REDFT00标志的代码。
发布于 2014-02-19 14:17:22
首先,请注意,在http://www.fftw.org/fftw3_doc/1d-Real_002deven-DFTs-_0028DCTs_0029.html中,REDFT00在余弦参数中的π之前遗漏了2的因子。这就是为什么你看到一个峰值在20赫兹,而不是10赫兹。
其次,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);https://stackoverflow.com/questions/20430200
复制相似问题