簡體   English   中英

FFT 2D陣列的實現

[英]Implementation of FFT 2D array

我目前正在使用一些C代碼來顯示使用傅立葉方法求解一維Schrodinger方程的解的演化。

此方法使用C語言中數字食譜的FFT算法,根據一維列數組中的函數值計算方程式中的二階導數(在k空間中),作為處理的一部分。

我想進入2D解決方案,我猜想在那一點上需要2D數組“網格”來獲取函數的值。

我的問題是:

我還能在NxN陣列上實現相同的FFT嗎? 如果是這樣,怎么辦?

我需要其他的FFT算法嗎?

謝謝。

我用於FFT的源代碼是:

void four1(double data[], int nn, int isign)
{
    int n, mmax, m, j, istep, i;
    double wtemp, wr, wpr, wpi, wi, theta;
    double tempr, tempi;

    n = nn << 1;
    j = 1;
    for (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;
    }
}

由於已經准備好一維FFT代碼,因此可以通過行列方法構造2D FFT,即,首先對每一行執行1D FFT,然后對每一列執行1D FFT,或者首先對每一列執行一維FFT然后執行每行的一維FFT 該方法基於2D FFT的可分離屬性。 注意,一維FFT是就地處理,也就是說,前一維FFT的數據可以是實數類型,但對於第二級來說已變成復雜類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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