интерфейс fftw с complex.h в c - PullRequest
3 голосов
/ 19 мая 2011

Я использую этот код для создания двумерного массива, имеющего тип данных 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. Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

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

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

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

1 голос
/ 30 апреля 2012

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

...