Новосибирский Государственный Университет
Опубликован: 25.03.2011 | Доступ: свободный | Студентов: 627 / 19 | Оценка: 4.17 / 2.67 | Длительность: 02:24:00
Специальности: Программист
Лекция 8:

Дискретное преобразование Фурье

< Лекция 1 || Лекция 8
Аннотация: Дискретное преобразование Фурье  и его реализация в библиотеке Intel® MKL. Практика: Применение функций преобразования Фурье при решении конкретной задачи.

Преобразование Фурье. В общем виде преобразование Фурье выглядит следующим образом — свертка двух функций. Есть прямое преобразование Фурье, есть обратное. Используется для приведения функции в частотный спектр (прямое) и из частотного спектра назад в свое истинное значение (обратное). Часто используется для анализа временных последовательностей, фильтрации сигналов и так далее.

В многомерном случае уже будет не одиномерный интеграл, а интеграл по простанству и, соответственно, будет стоять другой коэффициент при прямом преобразовании и при обратном. Это все в непрерывном пространстве.

Естественно, когда вы работаете с сигналами, которые вы измеряете, получаете как-то, у вас всегда есть дискретная выборка. Есть дискретное преобразование Фурье, которое записывается следующим образом (слайд). То есть интеграл заменяется на сумму и если в непрерывном случае коэффициент ставился перед прямым и перед обратным преобразованием Фурье, то в дискретном случае коэффициент принято ставить только перед обратным преобразованием Фурье.

Дискретное – понятно, почему. Потому что есть отсчеты, по которым у нас все идет. При этом один из вариантов ДПФ есть быстрое преобразование Фурье. Это в том случае, когда у нас количество отсчетов есть степень двойки. Тоже используется очень часто, потому что позволяет существенно сократить количество операций и значений, которые надо вычислять.

Для того, чтобы использовать те функции MKL, которые касаются дискретного преобразования Фурье, в Fortran'е необходимо подключить модуль MKL_DFTI (mkl_dfti.f90), в С/С++ подключаем заголовочный файл mkl_dfti.h

Есть несколько групп функций: это функции подготовки к вычислениям, собственно вычислений и обработки ошибок. Для того, чтобы нам произвести вычисление, мы должны подготовить некий дескриптор (descriptor), план вычисления, в котором укажем, что мы будем делать. Потом, собственно, произвести вычисления: либо прямое (forward), либо обратное преобразование (backward). И после вычисления освободить ресурсы: план и дескриптор.

На слайде пример, написанный с использованием широко распространенной библиотеки fftw и синим – тот же самый пример с использованием MKL'ных функций.

Давайте сначала рассмотрим код без использования MKL, то, что черным написано. Есть переменные 32 штуки типа комплекс. Мы над ними желаем выполнить прямое преобразование Фурье. Объявляем, что у нас есть план (plan), его формируем, создаем этот план, говорим, что у нас будет 32 числа, будет прямое преобразование Фурье, после чего выполняем преобразование Фурье над вектором x. Флаги – то, что будет вектор х заменен на свой образ (in_place). После чего выводим наш результат и освобождаем наш дескрипт с планом.

В MKL аналогично. У нас есть дескриптор, мы говорим, что будем работать в одинарной точности, что мы будем обрабатывать комплексные числа с, что одномерный вектор длиной 32 элемента. После чего говорим, что дескприптор этот необходимо создать, выполнить прямое преобразование Фурье над вектором х, также вывести полученый результат и освободить этот самый декскриптор.

При формировании план, вы говорите, что у вас будет одномерное преобразование Фурье, двумерное преобразование Фурье, над комплексными, над вещественными числами и так далее.

Собственно, функции DftiComputeForward, ComputeBackward преобразование Фурье и выполняют.

< Лекция 1 || Лекция 8
Владимир Т
Владимир Т

Что делать, помогите?