2015-04-24 26 views
0

我在C工作与开发 - C++2D复杂的FFT实现

我已经创建了复数的二维数组这样:

#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这样的图书馆,但尽管我努力去理解,但实现仍然让我难以理解。

有人能解释一下我最好的办法吗?谢谢

+0

实现一个高效的fft这真的是一个棘手的任务,这就是fftw存在的原因。对于复合大小,请查看[Cooley Tuckey算法](http://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm)。 – francis

+0

一个很好的简单的FFT库是[KissFFT](http:// sourceforge。net/projects/kissfft /) - 比FFTW更容易掌握 - 试一试。 –

+3

您可能想要减少到两个(甚至一个)内存分配。分配'x [0] =(X *)malloc(Nx * Nx * sizeof(X))'和循环'x [k + 1] = x [k] + Nx'。单点故障,您可以通过访问列x'[j] [k] = x [0] [k + j * Nx]','j = 0,...,Nx-1',即通过算术索引序列变成平面阵列。它也可能有助于垂直FFT。 – LutzL

回答

0

我最终通过制作单独的实数和虚数二维数组来解决这个问题。然后写入函数以获取数组,创建双倍长度的1D数组,其中交替的实数和虚数值表示行和列。这允许我通过连续地对每一行和每列执行变换来使用简单的编码内部FFT four1函数(在C中的Numerical Recipes中给出)。

这样做没有库需要的工作!

只记得在每次转换后包含标准化。

2

从一开始就需要为系统获取FFTW库。根据您正在运行的代码,您可能必须从源代码,使其如下所示:

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

的配置,制作,make install的过程可能需要相当长一段时间。

一旦完成,你需要使用

#include<fftw3.h> 

这可能取决于你所使用的版本变化包括在你的代码库。要编译代码,您需要使用-lfftw3链接库。

现在实际包含FFT代码。这可以分解为三个步骤:计划,填充输入数组,然后执行。

2d复数FFT的计划阶段如下所示:http://www.fftw.org/fftw3_doc/Complex-Multi_002dDimensional-DFTs.html#Complex-Multi_002dDimensional-DFTs 除非FFT的尺寸发生变化,否则只需计划一次。

第二阶段要求您使用提供的FFTW阵列。上一个链接中显示了一个用于格式化数组的有用链接。

第三阶段就像调用“fftw_execute”例程一样简单。一旦这个被调用,输出数组将被填充FFT的输出。