Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

DSP / cos_lab3

.pdf
Скачиваний:
28
Добавлен:
10.02.2015
Размер:
750.44 Кб
Скачать

Отчет по лабораторной работе № 3 «Быстрое преобразование Фурье (БПФ)»

дата

Оценка

Бонус за

подпись

 

(max 5)

сложность

 

Цель работы:

Изучение алгоритма быстрого преобразования Фурье, основ языка программирования С.

Задачи работы

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

Краткий конспект теоретической части

Основной алгоритм преобраования Фурье сложности О(N2)

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

Перечислите виды алгоритмов БПФ

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

Опишите организацию цикла в языке С

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

Опишите алгоритм БПФ прореживанием по времени и алгоритм прореживанием по частоте

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

__________________________________________________________________

1. Теоретические сведения

Быстрое преобразование Фурье (БПФ, FFT) — это быстрый алгоритм вычисления дискретного преобразования Фурье (ДПФ). То есть, алгоритм вычисления за количество действий, меньшее чем N2, требуемых для прямого (по формуле) вычисления ДПФ. Иногда под БПФ понимается один из быстрых алгоритмов, называемый алгоритмом прореживания по частоте/времени или алгоритмом по основанию 2, имеющего сложность

O(Nlog(N))

Вывод преобразования из ДПФ

Дискретное преобразование Фурье для вектора , состоящего из N элементов, имеет вид:

элементы матрицы имеют вид: . Пусть N четно, тогда ДПФ можно переписать следующим образом:

Коэффициенты и можно переписать следующим образом (M=N/2):

В результате получаем:

То есть дискретное преобразование Фурье от вектора, состоящего из N отсчетов, свелось к линейной композиции двух ДПФ от отсчетов, и если для первоначальной задачи требовалось N2 операций, то для полученной композиции — .

 

Таким

образом, можно продолжать разбиение исходной последовательности до тех

пор,

пока

возможно деление

последовательности

на две. Очевидно, что

если

 

,

– положительное

целое, мы можем

разделить последовательность

пополам раз. Для () такое разбиение представлено на рисунке.

Разбиение и объединение последовательностей при N = 8

Так вот, если N является степенью двух, то это разделение можно продолжать рекурсивно до тех пор, пока не дойдем до двух точечного преобразования Фурье, которое вычисляется по следующим формулам:

Каждое разбиение делит последовательность на две половинной длительности (красную и синюю), а каждое объединение «собирает » из двух последовательностей одну удвоенной длительности.

Алгоритмы БПФ,

которые используют выборки длиной

, называются

«алгоритмами БПФ по

основанию 2». Данные алгоритмы получили

наибольшее

распространение, из-за того что в машинной арифметике является «круглым» числом.

Очевидно что делить последовательности на две можно по-разному, однако от этого зависит сможем ли мы при объединении получить неискаженный спектр сигнала и чего с точки зрения вычислительных затрат это будет нам стоить. Можно сказать, что эффективность алгоритма БПФ полностью зависит от способа разбиения и объединения последовательности, поскольку если не учитывать операции на разбиение-объединение, то

для расчета спектра требуется раз посчитать ДПФ на 2 точки, в результате общее

количество вычислительных операций составит , то есть количество операций линейно зависит от величины выборки.

Рассмотрим два способа разбиения — объединения: прореживание по времени и прореживание по частоте

БПФ прореживанием по времени

Для начала комплексную экспоненту в выражении (1) обозначим как:

(2)

Тогда выражение (1) принимает вид:

(3)

Прореживание по времени заключается в разбиении исходной

последовательности

отсчетов

,

 

на две

последовательности

длительности

 

и

,

 

,

 

таких

что

,

а

 

,

 

. Другими словами,

последовательность

 

содержит

 

отсчеты

последовательности

с

четными индексами, а

- с нечетными. Прореживание по времени для N = 8

наглядно представлено на рисунке 2.

 

 

 

 

 

 

Рисунок 2: Прореживание по времени для N=8

 

 

Процедура объединения. Граф «Бабочка»

 

Теперь

рассмотрим

вторую

половину

спектра

,

:

 

 

(8)

Рассмотрим подробнее множитель

.

(9)

 

Учтем что

 

 

(10)

 

,

тогда выражение (10) справедливо для любого целого , тогда (9) можно записать с учетом (10):

.

(11)

 

Рассмотрим теперь поворотный коэффициент в (8):

(12)

.

Тогда выражение (8) с учетом (11) и (12) принимает вид:

(13)

Таким образом, окончательно можно записать:

(14)

Выражение (14) представляет собой алгоритм объединения при прореживании по времени. Данную процедуру объединения можно представить в виде графа (рисунок 3), который называется «Бабочка».

Рисунок 3: Процедура объединения на основе графа « Бабочка »

БПФ прореживанием по частоте

Снова запишем выражение для дискретного преобразования Фурье сигнала :

(1)

В алгоритме БПФ с прореживанием по времени производилось разделение исходного сигнала в соответствии с двоично-инверсной перестановкой. И получали первую и вторую половину спектра. В алгоритме с прореживанием по частоте

наоборот

исходный

сигнал

делится

пополам,

т.е.

и

 

.

Тогда выражение

(1) можно переписать:

 

 

 

(2)

Учтем что

(3)

Тогда

(4)

Рассмотрим теперь четные отсчеты спектра

(5)

Учтем что

(6)

Тогда

(7)

Таким образом, четные отсчеты спектра рассчитываются как ДПФ суммы первой и второй половины исходного сигнала.

Рассмотрим теперь нечетные отсчеты спектра

(8)

Окончательно выражение для четных и нечетных отсчетов спектра:

(9)

Прокомментируем полученный результат, опираясь на все вышесказанное и с оглядкой на алгоритм с прореживанием по времени. При делении сигнала на четные и нечетные отсчеты, в алгоритме с прореживанием по времени получали первую и вторую половины спектра. В данном случае алгоритм с прореживанием по частоте наоборот по первой и второй половине сигнала позволяет рассчитать четные и нечетные спектральные отсчеты (поэтому и называется прореживание по частоте). Разница алгоритмов еще и в том, что при прореживании по времени умножение на поворотные коэффициенты производилось после ДПФ четной и нечетной последовательности, а в данном алгоритме умножение на поворотные коэффициенты производится до ДПФ.

Граф алгоритма с прореживанием по частоте

Граф бабочка для алгоритма с прореживанием по частоте представлен на рисунке 4:

Рисунок 4: Граф бабочка для алгоритма БПФ с прореживанием по частоте

Поворотные коэффициенты в алгоритме с прореживанием по частоте полностью совпадают с поворотными коэффициентами алгоритма БПФ с прореживанием по времени.

Поворотные коэффициенты

 

 

 

Рассмотрим подробнее поворотные коэффициенты

.

 

На первом уровне (выражение (15)) требуется всего один поворотный

коэффициент

, это означает, что на первом уровне расчета спектра

операции умножения не требуются

(умножения

на

называются

тривиальными, так как при умножении на

множитель остается неизменным

или меняет свой знак на противоположный).

 

 

 

На втором уровне имеем два поворотных коэффициента:

(17)

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

На третьем уровне имеем уже 4 поворотных коэффициента:

(18)

Графически поворотные коэффициенты можно представить как векторы на комплексной плоскости:

Рисунок 5: Поворотные коэффициенты алгоритма БПФ с прореживанием по времени при N=8

Можно заметить, что на всех уровнях объединения количество поворотных коэффициентов удваивается, причем все поворотные коэффициенты предыдущего уровня объединения присутствуют и на следующем уровне. Таким образом для того чтобы перейти на следующий уровень необходимо между поворотными коэффициентами текущего уровня вставить поворотные коэффициенты следующего. Графически для перехода на следующий уровень при N =16

необходимо дополнить рисунок 5 как это показано на рисунке 6. Серые вектора показывают поворотные коэффициенты, которые будут присутствовать на

последнем уровне при , которых нет при .

Рисунок 6: Поворотные коэффициенты алгоритма БПФ с прореживанием по времени при N=16

Необходимо также отметить, что все поворотные коэффициенты за

исключением нулевого находятся в нижней полуплоскости комплексной плоскости.

2.Базовые конструкции языка С

2.1Переменные языка С

Вязыке "C" предусмотрено несколько типов данных:

INT

целое

FLOAT

числа с плавающей точкой

CHAR

символ - один байт

SHORT

короткое целое

LONG

длинное целое

DOUBLE

плавающее с двойной точностью

Объявление происходит следующим образом:

INT lower, UPPER, Step=1; FLOAT FAHR, CELSIUS[64];

Число в квадратных скобках означает количество элементов массива данного типа.

2.2 Вывод информации на экран

Для этого существует функция printf Картинка иллюстрирует ее синтаксис

2.3 Организация циклов с помощью оператора for

Рассмотрим организацию цикла на примере программы перевода температур из шкалы Цельсия в шкалу Фаренгейта

main() /* FAHRENHEIT-CELSIUS TABLE */

{

int FAHR;

for (FAHR = 0; FAHR <= 300; FAHR++)

printf("%4D %6.1F\N", FAHR, (5.0/9.0)*(FAHR-32.0));

}

Соседние файлы в папке DSP