Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二维复FFT的实现_C_Multidimensional Array_Fft_Fftw - Fatal编程技术网

C 二维复FFT的实现

C 二维复FFT的实现,c,multidimensional-array,fft,fftw,C,Multidimensional Array,Fft,Fftw,我和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]); } #包括 双复数**x; x=malloc(Nx*sizeof*x); if(x) { 对于(i=0;i

我和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]);

}   
#包括
双复数**x;
x=malloc(Nx*sizeof*x);
if(x)
{
对于(i=0;i
用数据填充它,我用实部和虚部绘制了图,这些都是经过验证和正确的

我只想对这些数据执行FFT(希望函数只考虑数组、数组的维数和FFT方向),这将变换数组并能够执行逆运算

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


有人能为我解释一下这样做的最佳方法吗?谢谢从一开始,您需要为您的系统获取FFTW库。根据您运行的代码,您可能需要从如下所示的源代码中获取它:

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

完成后,您需要在代码中使用

    #include<fftw3.h>
#包括
这可能会因使用的版本而异。要编译代码,需要使用-lfftw3链接库

现在我们来实际包含FFT代码。这可以分为三个步骤:计划、填充输入数组和执行

2d复FFT的规划阶段如下所示: 您只需要计划一次,除非FFT的尺寸发生变化

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


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

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

这项工作不需要库


只需记住在每次变换后包括归一化。

实现有效的fft这确实是一项棘手的任务,这就是fftw存在的原因。对于复合大小,请查看。一个简单明了的fft库是——它比fftw简单得多——尝试一下。您可能希望减少到两个(甚至一个)内存分配。分配
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。作为上述方法的替代方法,您可以尝试my。它使用起来非常简单,并且支持非2^n FFT长度。