二维复数 FFT 实现

2D complex FFT implementation

我正在使用 Dev-C++ 在 C 中工作

我创建了一个二维复数数组:

#include<complex.h>

double complex **x;

x = malloc(Nx * sizeof *X);

if (x)
{
for (i = 0; i < Nx; i++) 
{
x[i] = malloc(Nx * sizeof *x[i]);

}   

并用数据填充它,我用经过验证和正确的实部和虚部绘制了这些数据。

我只想对这个数据执行 FFT(希望有一个函数只接受数组、它的维度和 fft 方向),这将转换数组并能够执行逆运算。

我看过 FFTW 等库,但尽管我努力理解,但实现对我来说仍然是不可理解的。

有人可以为我解释一下最好的方法吗?谢谢

从头开始,您需要为您的系统获取 FFTW 库。根据您的情况 运行 您的代码可能必须从源代码中获取,如下所示:

http://www.fftw.org/fftw3_doc/Installation-and-Customization.html

配置、制作、制作安装过程可能需要相当长的时间。

完成后,您需要使用

将库包含在您的代码中
    #include<fftw3.h>

这可能会根据您使用的版本而有所不同。要编译代码,您需要使用 -lfftw3 link 库。

现在实际包括 FFT 代码。这可以分解为大约三个步骤:计划、填充输入数组和执行。

二维复数 FFT 的规划阶段可以在此处显示:http://www.fftw.org/fftw3_doc/Complex-Multi_002dDimensional-DFTs.html#Complex-Multi_002dDimensional-DFTs 您只需要计划一次,除非 FFT 的维度发生变化。

第二阶段要求您使用提供的 FFTW 数组。在前面的 link.

中显示了对格式化数组很有用的 link

而第三阶段就像调用"fftw_execute"例程一样简单。一旦调用它,输出数组将填充 FFT 的输出。

我最终通过制作单独的实部和虚部二维数组解决了这个问题。然后编写函数以接收数组,创建双倍长度的一维数组,其中交替的实数值和虚数值表示行和列。这使我能够通过对每一行和每一列连续执行转换来使用简单的代码内 FFT four1 函数(在 C 中的数字食谱中给出)。

不需要库就可以完成这项工作!

请记住在每次转换后包括归一化。