c中带有complex.h的fftw接口

c中带有complex.h的fftw接口,c,fftw,complex-numbers,C,Fftw,Complex Numbers,我使用这段代码创建了一个数据类型为complex的二维数组(来自c中的complex.h)。然后我想找到该阵列的fft“就地”。然而,它给出了分段错误,我担心这是由于指针的不正确投射造成的。我们如何为fftw使用复杂数据类型 //a is a 2d array of size blockSize*NO_INPUTS complex float* a=(complex float*)malloc(sizeof(complex float)*NO_INPUTS*blockSize); //***

我使用这段代码创建了一个数据类型为complex的二维数组(来自c中的complex.h)。然后我想找到该阵列的fft“就地”。然而,它给出了分段错误,我担心这是由于指针的不正确投射造成的。我们如何为fftw使用复杂数据类型

//a is a 2d array of size blockSize*NO_INPUTS

complex float* a=(complex float*)malloc(sizeof(complex float)*NO_INPUTS*blockSize);

//****** Put data in a*******//
//blah//
//blah//

//a has data now//

fftw_plan p;
p=fftw_plan_dft_2d(blockSize,NO_INPUTS,(fftw_complex*)a,(fftw_complex*)a,FFTW_FORWARD,FFTW_ESTIMATE);

fftw_execute(p);

fftw_destroy_plan(p);
请注意,我不想使用fftw_complex或fftw_malloc。
谢谢。

fftw\u复数
相当于
复数双精度
,您使用的是
复数浮点
。这可能是断层的来源

尝试在
fftw3.h
之前包含
complex.h
,您将不需要执行任何强制转换


FFTW默认情况下使用双精度浮点。最简单的修复方法就是将
float
的所有实例更改为
double
。但是,如果出于内存或其他原因想继续使用
复数浮点
,则应使用单精度fftw,如所述。您应该将所有fftw函数和类型名称中的小写字母
fftw
更改为
fftwf
。例如
fftw\u计划
变成
fftwf\u计划
。在编译时,您应该链接到
fftw3f
,而不是
fftw3

我已经有一段时间没有使用FFTW了,但我似乎记得如果定义了complex,FFTW_complex默认为complex。关于fftw_malloc,你为什么不想使用它?这些算法高度依赖于字节对齐的内存。除了上面@Jim的优点外,我认为对于就地2D FFT,2D数组的大小还有一些额外的限制-我认为每行需要一些额外的存储(一个额外的元素?)-FFTW手册中有一节介绍了这一点。