【问题标题】:fftw interface with complex.h in cfftw接口与c中的complex.h
【发布时间】:2011-05-19 19:21:26
【问题描述】:

我正在使用此代码创建一个具有复杂数据类型的二维数组(来自 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 以来已经有一段时间了,但我似乎记得如果定义了 complex,则 fftw_complex 默认为 complex。关于fftw_malloc,你为什么不想用呢?这些算法高度依赖于字节对齐的内存。
  • 除了上面@Jim 的优点之外,我认为对于就地 2D FFT 的 2D 数组的大小还有一些额外的限制 - 我相信每行需要一些额外的存储空间(一个额外的元素?) - FFTW 手册中有一节关于此。

标签: c fftw complex-numbers


【解决方案1】:

fftw_complex 等价于complex double,你使用的是complex float。这可能是段错误的来源。

尝试在fftw3.h 之前添加complex.h,您将不需要进行任何转换。

http://www.fftw.org/fftw3_doc/Complex-numbers.html

【讨论】:

    【解决方案2】:

    FFTW 默认使用双精度浮点数。最简单的解决方法是将float 的所有实例更改为double。但是,如果您出于内存或其他原因想继续使用complex float,那么您应该使用here 中概述的单精度fftw。您应该将所有 fftw 函数中的小写 fftw 更改为 fftwf。例如,fftw_plan 变为 fftwf_plan。在编译时,您应该链接到fftw3f 而不是fftw3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2012-01-31
      • 2021-07-17
      • 2010-09-06
      • 2013-02-24
      相关资源
      最近更新 更多