簡體   English   中英

FFT實施產生故障

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM