我使用MATLAB编码器来生成处理复数的代码。MATLAB生成的复杂类型的默认类型为:
typedef double real_T;//real number
typedef struct {
real_T re;
real_T im;
} creal_T;//complex number现在,我想使用fftw3对数据执行快速傅立叶变换,问题是在fftw3中,复杂类型被定义为:
typedef double fftw_complex[2];来自“从fftw 2升级”部分的fftw3文档:
数据类型的主要区别在于FFTW 2中的fftw_complex被定义为具有宏、c_re和c_im的结构,用于访问实/虚部分。(--这是在任何机器上与FFTW 3兼容的二进制文件,除了一些较老的Cray(单精度)。) FFTW 3的等效宏是: #定义c_re(c) ((c)) #定义c_im(c) ((c)1)
我是在这里遗漏了什么,还是有一种方法可以安全地将creal_T类型转换为相应的fftw3,而不需要逐个元素地复制数据元素呢?
发布于 2018-05-26 09:16:19
MATLAB编码器使用的复数格式和从FFTW显示的格式是相同的格式,通常称为交错复数。它们是二进制兼容的。因此,您应该能够在不复制数据的情况下执行指针或重新解释强制转换以在它们之间进行转换。
确实,MATLAB历史上在R2018a之前使用了分离(也称为拆分)复杂。但是,这里没有与MATLAB复杂类型进行交互。您正在使用MATLAB编码器生成的复杂类型。
从R2017b开始,MATLAB可以从MATLAB函数中生成代码,这些函数为您调用FFTW:
这将允许您在MATLAB中编写fft(x),并由MATLAB自动为您生成所有FFTW代码。
发布于 2018-05-14 19:25:33
编辑:如果您正在处理MATLAB文件,请阅读此答案.如果您正在处理MATLAB,如OP所示,请阅读赖安·利文斯顿的回答。
--
将FFTW与MATLAB的复杂表示一起使用的唯一正确方法是使用"Guru接口“,它支持所谓的”分割数组“。这是MATLAB使用的格式(实和虚组件是分开的数组)。这是一个指向文档页面的链接。
注意,从MATLAB R2018a开始,MATLAB以“正常”的方式存储复数,将实值和虚值交织在一起。因此,另一种方法是升级MATLAB。见MATLAB支持C MEX函数中的交织复杂API。
https://stackoverflow.com/questions/50336173
复制相似问题