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