【问题标题】:Implementation of FFT 2D arrayFFT二维数组的实现
【发布时间】:2015-04-22 20:52:00
【问题描述】:

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

此方法使用 C 中的 Numerical Recipes 中的 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;
    }
}

【问题讨论】:

  • 您可以通过对所有行进行 1D FFT,然后对列进行 1D FFT 来实现 2D FFT。不过,您可能想查看 2D FFT 库,例如 FFTW。

标签: c 2d fft


【解决方案1】:

既然一维 FFT 代码已经准备好了,您可以通过行列方法构造二维 FFT,即先对每一行执行一维 FFT,然后对每一列执行一维 FFT,或者先对每一行执行一维 FFT列然后对每一行执行一维 FFT。这种方法基于 2D FFT 的可分离特性。注意,一维 FFT 是就地处理,即前一维 FFT 的数据可能是实数类型,但在第二阶段已成为复数类型。

【讨论】:

  • 谢谢,这很有用。我了解该过程,并且现在似乎已经制作了一个二维数组。你知道如何使用我展示的函数只对二维数组的一列或一行进行操作,以便我实现该过程吗?
  • 由于二维数组(注意复数类型)是按行顺序排列的,如果选择先行后列方案,则每行第一行 1D FFT 很容易;您只需将每行的地址和长度传递给一维 FFT 函数,但是,以下列 FFT 还没有准备好;您可以分配一个大小等于列长度的一维数组(注意复数类型),将每个列的数据复制到数组中,对数组数据执行一维 FFT,然后将结果复制回二维数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多