首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFTW - FFTW_REDFT00和FFTW_DHT标志之间的差异

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

Stack Overflow用户
提问于 2013-12-07 01:41:01
回答 1查看 514关注 0票数 1

我对在真实数据上用FFTW做一维FFT很感兴趣。

为此,我使用频率等于10 Hz的余弦信号,采样频率为sizex*frequency_signal,采样点数为sizex。

代码语言:javascript
复制
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的狄拉克脉冲了。在本例中,我的输出如下:

代码语言:javascript
复制
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标志的代码。

EN

回答 1

Stack Overflow用户

发布于 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个元素,并且您应该将计划创建为

代码语言:javascript
复制
fftw_plan_r2r_1d(sizex + 1, Array, Array, FFTW_REDFT00, FFTW_ESTIMATE);

如果没有额外的1,如您所见,峰值将加宽。

以避免峰值加宽。遵循以下规则。如果您将信号准备为

代码语言:javascript
复制
for (i = 0; i <= n; i++) a[i] = cos(2*M_PI*10*i/n);

然后通过以下方式检测它:

代码语言:javascript
复制
fftw_plan_r2r_1d(n + 1, a, a, FFTW_REDFT00, FFTW_ESTIMATE);

如果您将信号准备为

代码语言:javascript
复制
for (i = 0; i < n; i++) a[i] = cos(2*M_PI*10*(i+0.5)/n);

然后通过以下方式检测它:

代码语言:javascript
复制
fftw_plan_r2r_1d(n, a, a, FFTW_REDFT10, FFTW_ESTIMATE);

如果您将信号准备为

代码语言:javascript
复制
for (i = 0; i < n; i++) a[i] = cos(2*M_PI*10.25*i/n);

然后通过以下方式检测它:

代码语言:javascript
复制
fftw_plan_r2r_1d(n, a, a, FFTW_REDFT01, FFTW_ESTIMATE);

如果您将信号准备为

代码语言:javascript
复制
for (i = 0; i < n; i++) a[i] = cos(2*M_PI*10.25*(i + .5)/n);

然后通过以下方式检测它:

代码语言:javascript
复制
fftw_plan_r2r_1d(n, a, a, FFTW_REDFT11, FFTW_ESTIMATE);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20430200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档