我正在使用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而不实际按元素复制数据元素?
答案 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:
这样你就可以在MATLAB中编写fft(x)
并让MATLAB Coder自动为你生成所有的FFTW代码。