1

我实现了来自 ''Proceedings of the IEEE'', N. Jeremy Kasdin (page 825) pdf的以下代码。但我不明白这些行,因为我没有数字食谱书:

/* perform the discrete Fourier transform */  
realft (hfa,n_pts, 1); 
realft (wfa,n_pts, 1);

wfa[1]=wfa[1]*hfa[1]; 
wfa[2]=wfa[2]*hfa[2]; 

for(i=3;i<=nn;i+=2) { 
wr=wfa[i]; 
wi=wfa[i+1]; 
wfa[il=wr*hfa[i]-wi*hfa[i+1]; 
wfa[i+l]=wr*hfa[i+1]+wi*hfa[i];
}

有人可以给我一些指示吗?

4

1 回答 1

3

NR 中的realft函数执行以下操作。你给它一个由 N 个实数组成的数组。(N 必须是 2 的幂。)它的离散傅立叶变换由 N 个遵循共轭对称关系的复数组成:F(k) 和 F(Nk) 是共轭的。特别是,F(0) 和 F(N/2) 是实数。所以realft返回N个实数,如下:F(0),F(N/2),F(1)的实部,F(1)的虚部,F(2)的实部,...,虚部F(N/2-1) 的一部分。

NR 最初都是 Fortran,并且(至少在旧版本中)使用基于 1 的索引而不是基于 0 的索引。即使在 C 中也是如此。这就是为什么代码从对元素 1 进行操作开始并以nn包含方式而不是排他方式运行的原因。

因此,您已经采用了hfa和的 FT wfa。其余的代码只是计算结果的元素乘积——前两行是简单的实数乘法,其余的是复数相乘。

我猜在那之后还有另一个调用realftwith-1作为最后一个参数(意思是做逆运算)。所以整个事情是:FT of hfaand of wfa; 将它们逐元素相乘;逆FT。换句话说,卷积。

于 2012-07-04T01:03:31.820 回答