C语言中使用complex.h库来接口fftw的方法

3

我正在使用以下代码创建一个具有复杂数据类型(来自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。谢谢。

3
我已经有一段时间没有使用FFTW了,但我似乎记得fftw_complex默认为复数,如果定义了复数。关于fftw_malloc,你为什么不想使用它?这些算法高度依赖于内存字节对齐。 - Jim Clay
1
除了@Jim上面提到的好处之外,我认为对于原地2D FFT的大小还有一些额外的限制 - 我相信每行需要一些额外的存储空间(一个额外的元素?) - 在FFTW手册中有一个章节介绍这个问题。 - Paul R
2个回答

3

1

FFTW默认使用双精度浮点数。最简单的解决方法是将所有实例中的float更改为double。然而,如果您想继续使用complex float以节省内存或其他原因,则应按照此处所述使用单精度fftw。您应该在所有fftw函数和类型名称中将小写fftw更改为fftwf。例如,fftw_plan变成了fftwf_plan。在编译时,您应该链接到fftw3f而不是fftw3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接