Использование fftw3 с комплексным типом fftw - PullRequest
0 голосов
/ 14 мая 2018

Я использую кодировщик MATLAB для генерации кода, который имеет дело с комплексными числами.Typedef по умолчанию для сложного типа, сгенерированного MATLAB:

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];

Из документации fftw3 в разделе «Обновление с fftw Version 2»:

Основное отличие типов данных заключается в том, что fftw_complex в FFTW 2 был определен как структура с макросамиc_re и c_im для доступа к реальным / мнимым частям.( Это двоичная совместимость с FFTW 3 на любом компьютере, за исключением, возможно, некоторых старых Crays с одинарной точностью. ) Эквивалентные макросы для FFTW 3:

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

Am Iздесь чего-то не хватает или есть способ безопасно привести тип creal_T к соответствующему fftw3 без фактического копирования элемента данных по элементу?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Формат комплексного числа, используемый MATLAB Coder, и то, что вы показываете из FFTW, - это один и тот же формат, обычно называемый чередованным комплексом. Они двоично совместимы. Таким образом, вы должны иметь возможность делать указатель или переинтерпретировать приведение между ними без копирования данных.

Это правда, что 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

Это позволит вам написать fft(x) в MATLAB, и весь код FFTW будет автоматически создан для вас MATLAB Coder.

0 голосов
/ 14 мая 2018

РЕДАКТИРОВАТЬ: Если вы имеете дело с MATLAB MEX-файлами, прочитайте этот ответ. Если вы имеете дело с MATLAB Coder, как кажется с ОП, прочитайте ответ Райана Ливингстона .

-

Единственный правильный способ использовать FFTW со сложным представлением MATLAB - это использовать «интерфейс Guru», который поддерживает «разделенные массивы», как они его называют. Это формат, который использует MATLAB (реальные и мнимые компоненты - это отдельные массивы). Вот ссылка на страницу документации.

Обратите внимание, что начиная с MATLAB R2018a, MATLAB хранит комплексные числа "обычным" способом, чередуя действительные и мнимые значения. Таким образом, альтернатива заключается в обновлении MATLAB. См. «Поддержка MATLAB для чередующегося сложного API в функциях C MEX» .

...