将 fftw3 与 fftw 复杂类型一起使用

Using fftw3 with fftw complex type

我正在使用 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];

来自 "Upgrading from fftw Version 2" 部分的 fftw3 文档:

The main difference in data types is that fftw_complex in FFTW 2 was defined as a struct with macros c_re and c_im for accessing the real/imaginary parts. (This is binary compatible with FFTW 3 on any machine except perhaps for some older Crays in single precision.) The equivalent macros for FFTW 3 are:

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

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

编辑: 如果您正在处理 MATLAB MEX 文件,请阅读此答案。如果您正在处理 MATLAB Coder,就像 OP 看起来那样,请改为阅读

——

将 FFTW 与 MATLAB 的复数表示结合使用的唯一正确方法是使用 "Guru interface",它支持他们所说的 "split arrays"。这是 MATLAB 使用的格式(实部和虚部是单独的数组)。 Here is a link to the documentation page.

请注意,从 MATLAB R2018a 开始,MATLAB 以 "normal" 方式存储复数,交错实数值和虚数值。所以替代方案是升级 MATLAB。参见 "MATLAB Support for Interleaved Complex API in C MEX Functions"

MATLAB Coder使用的复数格式和你在FFTW中显示的是同一种格式,通常称为interleaved complex。它们是二进制兼容的。因此,您应该能够执行指针或重新解释转换以在不复制数据的情况下在它们之间进行转换。

的确,MATLAB 在 R2018a 之前一直使用单独的(也称为拆分)复合体。但是,您并未在此处与 MATLAB 复杂类型进行交互。您正在使用 MATLAB Coder 生成的复杂类型。

从 R2017b 开始,MATLAB Coder 可以从 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 代码。