2016-01-29 117 views
0

我得到一個奇怪的故障在FFT圖白噪聲:FFT實現產生毛刺

enter image description here

我參照的程序檢查,同時噪音文件似乎是罰款。 這是實施中的錯誤嗎?

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; 
    } 
} 
+0

輸入數據的大小是多少? – molbdnilo

+0

@molbdnilo數據的大小是nn的兩倍,每個輸入數字是一對actual_real_number和0對於虛部 – defhlt

+0

@ tobi303這個問題最適合調試會話以找出它發生的原因......因爲它是,我不希望任何人實際實施快速傅立葉變換,並給你確切的線路,需要修正。 – Shark

回答

2

除了一些小的改動,似乎該碼被取出來的數值法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偏移)。