|
2. Описание работы с библиотекой численного преобразования Фурье FFTWБиблиотека FFTW - свободно распространяемая библиотека для выполнения быстрого дискретного преобразования Фурье. 2.1. Установка и подключение библиотеки для работы в Visual StudioУстановка бибилиотеки
Подключение библиотеки в Visual StudioДля того, чтобы использовать библиотеку FFTW нужно изменить свойства проекта (пункт меню Project->[имя проекта] Properties):
Подключение бибилиотеки в Visual Studio при помощи CMakeЕсли проект для Visual Studio создается с использованием CMake, нужно добавить в CMakeLists.txt: 2.2. Подключение библиотеки в Qt CreatorЧтобы подключить библиотеку FFTW к проекту в Qt Creator необходимо в файле проекта (*.pro) добавить строки: INCLUDEPATH += C:/Qt/lib/fftw/ 2.3. Описание функций библиотеки 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сtrum.txt"); for(size_t i=0; i<data.size(); ++i) { out<<data[i]<<endl; } } ///////////////////////////////////////////////////////////////////////////// После выполнения программы, если все настроено верно, должен создаться файл "spectrum.txt". |