使用fftw3和fftw复杂类型

时间:2018-05-14 17:46:04

标签: c matlab fftw matlab-coder

我正在使用MATLAB编码器生成处理复数的代码。 MATLAB生成的复杂类型的默认typedef是:

typedef double real_T;//real number
typedef struct {
  real_T re;
  real_T im;
} creal_T;//complex number

现在,我想使用fftw3对数据执行fft,问题是在fftw3中复杂类型定义为:

typedef double fftw_complex[2];

来自fftw版本2"中的fftw3文档。部分:

  

数据类型的主要区别在于FFTW 2中的fftw_complex   定义为具有宏c_re和c_im的结构,用于访问   实部/虚部。 (这与任何的FFTW 3二进制兼容   机器除了可能是单精度的一些较旧的Crays。)   FFTW 3的等效宏是:

 #define c_re(c) ((c)[0])
 #define c_im(c) ((c)[1])

我在这里遗漏了什么,或者有没有办法安全地将creal_T类型转换为相应的fftw3而不实际按元素复制数据元素?

2 个答案:

答案 0 :(得分:2)

编辑:如果您正在处理MATLAB MEX文件,请阅读此答案。如果你正在处理MATLAB Coder,就像OP一样,请改为阅读Ryan Livingston’s answer

-

将FFTW与MATLAB的复杂表示结合使用的唯一正确方法是使用“Guru接口”,它支持“分割数组”。这是MATLAB使用的格式(实部和虚部是单独的数组)。 Here is a link to the documentation page.

请注意,从MATLAB R2018a开始,MATLAB以“正常”方式存储复数,交错实数和虚数值。所以另一种方法是升级MATLAB。请参阅"MATLAB Support for Interleaved Complex API in C MEX Functions"

答案 1 :(得分:2)

MATLAB Coder使用的复数格式以及您从FFTW显示的格式是相同的格式,通常称为交错复数。它们是二进制兼容的。所以你应该能够做一个指针或重新解释强制转换,以便在不复制数据的情况下进行转换。

确实,MATLAB历史上在R2018a之前使用了单独的(aka split)复合体。但是,您没有在此处与MATLAB复杂类型进行交互。您正在使用MATLAB Coder生成的复杂类型。

从R2017b开始,MATLAB编码器可以从MATLAB FFT函数生成代码,为您调用FFTW:

https://www.mathworks.com/help/coder/ug/speed-up-fast-fourier-transforms-in-generated-standalone-code-by-using-fftw-library-calls.html

这样你就可以在MATLAB中编写fft(x)并让MATLAB Coder自动为你生成所有的FFTW代码。