2012-07-03 69 views
1

我實現了來自「IEEE Proceedings of the IEEE」的以下代碼,N. Jeremy Kasdin(頁825)pdf。但我不明白這些線,因爲我沒有數字食譜書:使用IIR濾波器生成粉紅噪聲

/* 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]; 
} 

有人可以給我一些方向嗎?

+2

Numerical Recipes在線提供http://nr.com –

+0

這是昂貴的一個問題... – xunien

+1

舊版本是免費的,應該是足夠的這個特定的問題 - 轉到http:// www .nr.com/oldverswitcher.html –

回答

2

NR中的realft函數執行以下操作。你給它一個N個實數的數組。 (N必須是2的冪)。它的離散傅立葉變換由符合共軛對稱關係的N個複數組成:F(k)和F(N-k)是共軛的。特別是,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,而不是排他性。

所以,你已經採取了FT的hfawfa,到位。其餘的代碼只是計算結果的元素乘積 - 前兩行是簡單的實數乘法,其餘的則乘以複數。

我猜測之後會有另一個電話realft-1作爲最後一個參數(意味着做相反的操作)。所以整個事情是:FT的hfawfa;將它們相乘;逆FT。換句話說,卷積。