![]() |
|||||
![]() ![]() |
|||||
![]() |
![]() |
![]() |
![]() |
![]() |
|
|
Описание работы с библиотекой численного преобразования Фурье FFTWПодробно выполнение численного преобразования Фурье разбирается в лабораторной работе №5. Библиотека FFTW - свободно распространяемая библиотека для выполнения быстрого дискретного преобразования Фурье. Описание функций библиотеки FFTWПлан БПФДля выполнения преобразования Фурье при помощи библиотеки fftw необходимо вначале создать план, т.е. заполнить настройки БПФ: // создание одномерного плана БПФ // n - размерность выборки // in - указатель на исходную выборку комплексных чисел // out - указатель на результирующую выборку комплексных чисел // (в качестве результирующей выборки можно задать ту же выборку, что и исходная) // direction - направление (FFTW_FORWARD - прямое, FFTW_BACKWARD - обратное) // flags - флаги, можно задать флаг FFTW_ESTIMATE (используются внутренние настройки по умолчанию) fftw_plan fftw_plan_dft_1d(int n, fftw_complex* sample_in, fftw_complex* sample_out, fftw_direction direction, int flags); Двумерный план создается аналогично: fftw_plan fftw_plan_dft_2d(int n, int m, fftw_complex* sample_in, fftw_complex* sample_out, fftw_direction direction, int flags); Удаление плана после выполнения БПФ: // удаление плана БПФ // plan - план БПФ void fftw_destroy_plan(fftw_plan plan); Выполнение БПФПростое (не сдвиговое) преобразование Фурье можно выполнить при помощи функции: // выполнение одномерного простого БПФ в соответствии с планом // plan - план БПФ void fftw_execute(fftw_plan plan); Чтобы выполнить полное сдвиговое приобразование Фурье нужно выполнить следующую последовать действий: // смещение выборки ... // простое БПФ fftw_execute(m_plan); // домножение полученного спектра на комплексное число с вещ. 1/sqrt(n*m) и мним. 0 ... // смещение спектра ... Пример выполнения одномерного преобразования Фурье///////////////////////////////////////////////////////////////////////////// // Тест: проверка работы библиотеки fftw // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include <fstream> #include <complex> #include <vector> #include <fftw3.h> using namespace std; ///////////////////////////////////////////////////////////////////////////// void main() { // создаем одномерную выборку, все значения которой равны 1 vector<complex<double> > data(64, 1.); // создаем план для библиотеки fftw fftw_plan plan=fftw_plan_dft_1d(data.size(), (fftw_complex*) &data[0], (fftw_complex*) &data[0], FFTW_FORWARD, FFTW_ESTIMATE); // преобразование Фурье fftw_execute(plan); fftw_destroy_plan(plan); // выводим в файл результат преобразования Фурье (должна получиться Дельта-функция) ofstream out("speсtr.txt"); for(size_t i=0; i<data.size(); ++i) { out<<data[i]<<endl; } } ///////////////////////////////////////////////////////////////////////////// После выполнения программы, если все настроено верно, должен создаться файл "spectr.txt".
|