FFT二维阵列

时间:2015-04-22 11:26:29

标签: c 2d fft

我目前正在使用一些C代码来显示使用傅立叶方法对一维薛定谔方程的解的演化。

此方法使用C中Numerical Recipes的FFT算法,根据1D列阵列中的函数值计算等式中的二阶导数(在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;
    }
}

1 个答案:

答案 0 :(得分:0)

由于1D FFT代码准备就绪,您可以通过行列方法构建2D FFT,即,首先对每行执行1D FFT,然后对每列执行1D FFT,或者首先对每个执行1D FFT然后,列在每一行上执行1D FFT。该方法基于2D FFT的可分离属性。请注意,1D FFT是就地处理,即第一个1D FFT的数据可能是实数类型,但在第二阶段已成为复杂类型。