интерфейс fftw с complex.h на c

#c #fftw #complex-numbers

#c #fftw #комплексные числа

Вопрос:

Я использую этот код для создания 2D-массива, имеющего тип данных complex (из complex.h на c). Затем я хочу найти fft этого массива «на месте». Однако это приводит к ошибке сегментации, которая, я боюсь, связана с неправильным приведением указателя. Как мы используем сложный тип данных для fftw?

 //a is a 2d array of size blockSize*NO_INPUTS

complex float* a=(complex float*)malloc(sizeof(complex float)*NO_INPUTS*blockSize);

//****** Put data in a*******//
//blah//
//blah//

//a has data now//

fftw_plan p;
p=fftw_plan_dft_2d(blockSize,NO_INPUTS,(fftw_complex*)a,(fftw_complex*)a,FFTW_FORWARD,FFTW_ESTIMATE);

fftw_execute(p);

fftw_destroy_plan(p);
  

Пожалуйста, обратите внимание, что я не хочу использовать fftw_complex или fftw_malloc.
Спасибо.

Комментарии:

1. Прошло некоторое время с тех пор, как я использовал FFTW, но, кажется, я припоминаю, что fftw_complex по умолчанию имеет значение complex, если определен complex. Что касается fftw_malloc, почему вы не хотите его использовать? Эти алгоритмы сильно зависят от выравнивания памяти по байтам.

2. В дополнение к положительным моментам от @Jim выше, я думаю, что существуют некоторые дополнительные ограничения на размер вашего 2D-массива для встроенных 2D-БПФ — вам, я полагаю, требуется дополнительное хранилище для каждой строки (один дополнительный элемент?) — в руководстве FFTW есть раздел, посвященный этому.

Ответ №1:

fftw_complex эквивалентен тому, complex double который вы используете complex float . Вероятно, это источник segfault.

Попробуйте включить complex.h перед fftw3.h , вам не нужно будет выполнять никаких приведений.

http://www.fftw.org/fftw3_doc/Complex-numbers.html

Ответ №2:

По умолчанию в FFTW используются значения с плавающей запятой двойной точности. Самое простое исправление — просто изменить все экземпляры float на double . Однако, если вы хотите продолжить использование complex float из-за нехватки памяти или по другим причинам, вам следует использовать fftw с одинарной точностью, как описано здесь. Вам следует изменить нижний регистр fftw во всех именах функций и типов fftw на fftwf . Например, fftw_plan становится fftwf_plan . При компиляции вы должны ссылаться на fftw3f вместо fftw3 .