fftw与c中的complex.h接口
我正在使用此代码创建一个具有复杂数据类型的二维数组(来自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。 谢谢。
I am using this code to create a 2D array having data type complex (from complex.h in c). Then I want to find the fft of that array 'in place'. However it is giving segmentation fault, which I fear is due to improper casting of the pointer. How do we use complex data type for a 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);
Please note that I do not want to use fftw_complex or fftw_malloc.
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
fftw_complex
相当于complex double
,您使用的是complex float
。这可能是段错误的根源。尝试在
fftw3.h
之前包含complex.h
,您将不需要进行任何强制转换。http://www.fftw.org/fftw3_doc/Complex-numbers.html
fftw_complex
is equivalent tocomplex double
, you are usingcomplex float
. That's probably the source of segfault.Try including
complex.h
beforefftw3.h
you won't need to do any casts.http://www.fftw.org/fftw3_doc/Complex-numbers.html
FFTW 默认使用双精度浮点数。最简单的修复方法是将所有
float
实例更改为double
。但是,如果出于内存或其他原因您想继续使用复杂浮点,那么您应该使用单精度 fftw,如下所述 此处。您应该将所有 fftw 函数中的小写fftw
更改为fftwf
。例如,fftw_plan
变为fftwf_plan
。编译时,您应该链接到fftw3f
而不是fftw3
。FFTW defaults to using double precision floats by default. The simplest fix is just to change all instances of
float
todouble
. If, however, you want to continue usingcomplex float
for memory or other reasons then you should use single precision fftw as outlined here. You should change lowercasefftw
in all fftw function and type names tofftwf
. For examplefftw_plan
becomesfftwf_plan
. On compilation, you should link tofftw3f
instead offftw3
.