【问题标题】:Using fftw3 with fftw complex type将 fftw3 与 fftw 复杂类型一起使用
【发布时间】:2018-10-24 11:01:30
【问题描述】:

我正在使用 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 的任何 机器除了一些旧的 Cray 单精度。) FFTW 3 的等效宏是:

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

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

【问题讨论】:

    标签: c matlab fftw matlab-coder


    【解决方案1】:

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

    在 R2018a 之前,MATLAB 历史上确实使用过单独的(也称为拆分)复数。但是,您不会在此处与 MATLAB 复数类型进行交互。您正在使用 MATLAB Coder 生成的复杂类型。

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

    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 代码。

    【讨论】:

      【解决方案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"

      【讨论】:

      • MATLAB Coder 复数数据始终是交错复数,即使 MATLAB 使用拆分复数。
      • @RyanLivingston:我不知道,谢谢。重新阅读问题,看来我回答了一个不同的问题......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多