2015-04-24 2 views
0

Я работаю в C с Dev-C++2D реализация комплекса FFT

Я создал 2D массив комплексных чисел, как, например:

#include<complex.h> 

double complex **x; 

x = malloc(Nx * sizeof *X); 

if (x) 
{ 
for (i = 0; i < Nx; i++) 
{ 
x[i] = malloc(Nx * sizeof *x[i]); 

} 

и наполнил ее с данными, которые я» построены с реальными и мнимыми частями, которые проверены и правильны.

Я просто хотел бы выполнить БПФ на этих данных (надеюсь, с помощью функции, принимающей только массив, его размеры и направление fft), которые преобразуют массив и также смогут выполнять инверсию.

Я смотрел такие библиотеки, как FFTW, но реализация остается непонятной для меня, несмотря на мои попытки понять.

Может кто-нибудь, пожалуйста, объяснит мне лучший способ сделать это? Спасибо

+0

Реализация эффективного fft это действительно сложная задача, и именно поэтому fftw существует. Для композитных размеров взгляните на алгоритм [Cooley Tuckey] (http://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm). – francis

+0

Хорошая простая библиотека FFT - [KissFFT] (http: // sourceforge.net/projects/kissfft /) - гораздо проще справиться с FFTW - попробуйте. –

+3

Возможно, вы захотите уменьшить до двух (или даже одного) распределения памяти. Выделите 'x [0] = (X *) malloc (Nx * Nx * sizeof (X))' и цикл 'x [k + 1] = x [k] + Nx'. Единственная точка отказа, и вы можете получить доступ к столбцам как «x [j] [k] = x [0] [k + j * Nx]', 'j = 0, ..., Nx-1', т.е. последовательность арифметических индексов в плоскую матрицу. Это также может помочь с вертикальным БПФ. – LutzL

ответ

0

Я решил решить эту проблему, создав отдельные реальные и воображаемые 2D-массивы. Затем функции записывались в массивы, создавали массивы с двойной длиной 1D с переменными реальными и мнимыми значениями, представляющими строки и столбцы. Это позволило мне использовать простую встроенную функцию FFT four1 (приведенную в Numerical Recipes in C), выполнив преобразование по каждой строке и столбцу последовательно.

Это делает работу без каких-либо библиотек!

Просто не забудьте включить нормализацию после каждого преобразования.

2

С самого начала вам нужно получить библиотеку FFTW для вашей системы. В зависимости от того, что вы работаете код на вас, возможно, придется сделать его из исходного кода, как показано здесь:

http://www.fftw.org/fftw3_doc/Installation-and-Customization.html

Настроить, заставит процесс установки может занять некоторое время.

После завершения этого вам нужно будет включать библиотеку в вашем коде, используя

#include<fftw3.h> 

Это может измениться в зависимости от того, какую версию вы используете. Чтобы скомпилировать код, вам необходимо связать библиотеку с помощью -lfftw3.

Теперь на самом деле включить код FFT. Это можно разбить на три этапа: Планировать, заполнять входной массив и выполнять.

Этап планирования для 2-го комплексного БПФ может быть показан здесь: http://www.fftw.org/fftw3_doc/Complex-Multi_002dDimensional-DFTs.html#Complex-Multi_002dDimensional-DFTs Вам нужно всего лишь запланировать один раз, если не изменить размеры БПФ.

На втором этапе требуется, чтобы вы использовали предоставленные массивы FFTW. Полезная ссылка для форматирования массивов показана в предыдущей ссылке.

И третий этап такой же простой, как и вызов подпрограммы «fftw_execute». Как только это называется, выходной массив будет заполнен выходом БПФ.

Смежные вопросы