[英]FFT implementation produces a glitch
我在FFT圖表中遇到了一個奇怪的毛刺:白噪聲:
我檢查了參考程序,而噪音文件似乎還不錯。 這是實施中的錯誤嗎?
void four1(float data[], int nn, int isign) {
int n, mmax, m, j, istep, i;
float wtemp, wr, wpr, wpi, wi, theta;
float tempr, tempi;
n = nn << 1;
j = 1;
for (int i = 1; i < n; i += 2) {
if (j > i) {
tempr = data[j];
data[j] = data[i];
data[i] = tempr;
tempr = data[j + 1];
data[j + 1] = data[i + 1];
data[i + 1] = tempr;
}
m = n >> 1;
while (m >= 2 && j > m) {
j -= m;
m >>= 1;
}
j += m;
}
mmax = 2;
while (n > mmax) {
istep = 2 * mmax;
theta = TWOPI / (isign * mmax);
wtemp = sin(0.5 * theta);
wpr = -2.0 * wtemp * wtemp;
wpi = sin(theta);
wr = 1.0;
wi = 0.0;
for (m = 1; m < mmax; m += 2) {
for (i = m; i <= n; i += istep) {
j = i + mmax;
tempr = wr * data[j] - wi * data[j + 1];
tempi = wr * data[j + 1] + wi * data[j];
data[j] = data[i] - tempr;
data[j + 1] = data[i + 1] - tempi;
data[i] += tempr;
data[i + 1] += tempi;
}
wr = (wtemp = wr) * wpr - wi * wpi + wr;
wi = wi * wpr + wtemp * wpi + wi;
}
mmax = istep;
}
}
除了一些小的更改,此代碼似乎從C的第二版《數字食譜》中刪除。此函數的文檔(摘自本書)指出:
如果
isign
輸入為1,則用其離散傅里葉變換替換data[1..2*nn]
; 或如果isign
輸入為-1,則用data[1..2*nn]
的nn
倍替換其離散傅里葉逆變換。data
是長度為nn
的復數數組,或者等效為長度為2*nn
的實數數組。nn
必須為2的整數次冪(不檢查!)。
給定具有基於1的索引的輸入數組,此實現可產生正確的結果。 您可以通過分配大小為2*nn+1
的C數組並從索引1開始填充數組來選擇使用相同的索引約定。或者,您可以傳遞大小為2*nn
的數組,該數組已從索引0開始填充,但調用four1(data-1, nn, isign)
(注意data
數組上的-1
偏移量)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.