itmo.ru aco.ifmo.ru c-visionlab.ru
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


2. Описание работы с библиотекой численного преобразования Фурье FFTW

Библиотека FFTW - свободно распространяемая библиотека для выполнения быстрого дискретного преобразования Фурье.

2.1. Установка и подключение библиотеки для работы в Visual Studio

Установка бибилиотеки

  • скачать с официального сайта (https://www.fftw.org/install/windows.html) архив "64-bit version: fftw-3.3.5-dll64.zip (3.1MB)", и распаковать его, например в
    C:\lib\fftw64
  • согласно инструкции по установке для Visual C++ создаем lib, а именно в Visual Studio запускаем командную строку (Инструменты>Командная строка>Командная строка разработчика или Tools->Command Line->Development PowerShell):
    cd C:\lib\fftw64
    lib /machine:x64 /def:libfftw3-3.def
  • Для работы нам понадобятся только три файла, остальное можно удалить или перенести в другое место:
    fftw3.h
    libfftw3-3.dll
    libfftw3-3.lib
  • В переменные окружения PATH добавить путь к библиотеке.

Подключение библиотеки в Visual Studio

Для того, чтобы использовать библиотеку FFTW нужно изменить свойства проекта (пункт меню Project->[имя проекта] Properties):

  • Выбрать конфигурацию "All Configurations"
  • В разделе "Свойства конфигурации -> Каталоги VC++" добавить в "Каталоги включения" и "Каталоги библиотек" путь к библиотеке:

  • В разделе "Свойства конфигурации -> Компоновщик -> Ввод" добавить в "Дополнительные зависимости" библиотеку libfftw3-3.lib;

Подключение бибилиотеки в Visual Studio при помощи CMake

Если проект для Visual Studio создается с использованием CMake, нужно добавить в CMakeLists.txt:
# установка путей
set(FFTW_PATH "C:/lib/fftw64")

# подключение библиотеки fftw
include_directories(${FFTW_PATH})
set(FFTW_LIB "${FFTW_PATH}/libfftw3-3.lib")

# добавить FFTW_LIB в проект
target_link_libraries(${PROJECT} ${FFTW_LIB})

2.2. Подключение библиотеки в Qt Creator

Чтобы подключить библиотеку FFTW к проекту в Qt Creator необходимо в файле проекта (*.pro) добавить строки:

INCLUDEPATH += C:/Qt/lib/fftw/
LIBS += C:/Qt/lib/fftw/libfftw3-3.a\

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".