Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР3 Дискретное преобразование Фурье.docx
Скачиваний:
0
Добавлен:
27.01.2026
Размер:
204.7 Кб
Скачать

%% Дополнение сигнала нулями

%Скопируем исходный дискретный сигнал в переменную с новым именем и

%добавим к концу этой копии сигнала нулевые отсчеты в количестве, равном

%длине сигнала (длина вектора, таким образом, увеличится в 2 раза).

u0 = [zeros(1, 31)]; % Сделаем строку из 31 нулевых отсчетов

ots2 = [0:61]; %вектор номеров отсчетов

unull = [u1(1:end-1) u2 u0]; % добавим нулевые отсчеты в конец графика

%Вычислим ДПФ для дополненного нулями сигнала, построим (с помощью функции

%stem) графики модуля и фазы спектральных отсчетов в одном графическом окне

%друг под другом (с помощью функции subplot).

y3 = fft(unull); %y3 — вектор результатов вычисления ДПФ.

figure(6); %построение АЧХ и ФЧХ от номеров отсчетов

subplot(2,1,1);

stem(ots2, abs(y3), 'Linewidth', 1.5);

xlabel('k');

ylabel('А(k)');

ax = gca;

ax.FontSize = 12;

subplot(2,1,2);

stem(ots2, angle(y3), 'Linewidth', 1.5);

xlabel('k');

ylabel('Ф(k)');

ax = gca;

ax.FontSize = 12;

Рис. 7. АЧХ и ФЧХ ДПФ для дополненного нулями сигнала

%% Измерение скорости расчетов при вычислении дпф непосредственно по теоретической формуле

%Функция fft гибко выбирает алгоритм

%вычисления в зависимости от длины преобразуемого сигнала, поэтому изме-

%рить с ее помощью скорость вычислений по прямой формуле не удастся. Для

%реализации такого измерения придется вычислять ДПФ как произвольное

%линейное преобразование — путем перемножения вектора сигнала и квад-

%ратной матрицы преобразования.

dpf_size = [64];% 128 256 512 1024 2048 4096 8192]; % размеры ДПФ

for i = 1:length(dpf_size)

N = dpf_size(i); % выбираем размер ДПФ

u_var_N = [u zeros(1, N-length(u))]; % дополнение сигнала нулями до длины N

D = dftmtx(N); % матрица ДПФ

y = zeros(1, N); % массив для результатов ДПФ

tic % старт таймера

for k = 1:5150 % цикл для измерения времени

y4 = u_var_N * D; % вычисление ДПФ по прямой формуле

end

toc % отображение измеренного времени

end

%Для N = 1024 подобрали число повторений цикла K = 5150, чтобы время

%расчета составляло примерно 1 секунду (elapsed time is ~0.99 seconds)

%Проведем эксперимент для разных значений N, указанных в таблице, не меняя

%подобранное число повторений цикла K.

%Время работы кода растет пропорционально N^2, поэтому долго считается.

%% Измерение скорости расчетов при вычислении дпф с использованием быстрого алгоритма

%Функция fft гибко выбирает алгоритм вычисления в зависимости от длины

%преобразуемого сигнала, и при длине, равной степени двойки, будет

%использован широко известный алгоритм Кули—Тьюки, число операций в

%котором пропорционально Nlog2(N).

dpf_size = [64 128 256 512 1024 2048 4096 8192]; % размеры ДПФ

for i = 1:length(dpf_size)

N = dpf_size(i); % выбираем размер ДПФ

y = zeros(1, N); % массив для результатов ДПФ

tic % старт таймера

for k = 1:370000 % цикл для измерения времени

y = fft(u, N); % вычисление БПФ

end

toc % отображение измеренного времени

end

%Число повторений цикла мы подобрали экспериментально (K = 370000), чтобы

%время расчета при N = 1024 составляло примерно 1 секунду

%(elapsed time is ~1.02 seconds)

Времена вычисления преобразований Фурье прямым и быстрым методами предсталвены в табл. 1 и 2. Последняя строка каждой таблицы была заполнена путем деления измеренных значений времени на использованное число повторений цикла.

Таблица 1. Времена вычисления прямого ДПФ

Параметр

N

64

128

256

512

1024

2048

4096

8192

Время, с

0,008

0,020

0,056

0,122

1,016

10,328

45,582

175,869

Время однократного вычисления ДПФ, мкс

1,5

3,9

10,9

23,7

197,3

2005,4

8850,8

34149,3

Таблица 2. Времена вычисления быстрого ПФ

Параметр

N

64

128

256

512

1024

2048

4096

8192

Время, с

0,245

0,254

0,360

0,492

1,001

1,905

5,013

9,747

Время однократного вычисления ДПФ, мкс

0,66

0,69

0,97

1,33

2,71

5,15

13,55

26,34

Используя значение Nmax, рассчитаем ширину спектра сигнала в герцах.

Nmax = 1, N = 31:

Построим графики затрат времени на однократное вычисление ДПФ прямым и быстрым методами (рис. 8).

Рис. 8. Зависимости времени однократного вычисления ДПФ от N

Экспериментальные графики можно аппроксимировать зависимостями вида:

• для прямого расчета ДПФ: t = k1 N2;

• для быстрого расчета ДПФ: t = k2 N log2(N).

Используя возможности Mathcad, построим аппроксимирующие зависимоси, которые при значениях N = 1024 и 8192 как можно ближе к результатам измерений.

Аппроксимация ДПФ:

Аппроксимация ДБФ:

Выводы

В лабораторной работе мы исследовали функции MATLAB, позволяющие проводить дискретное преобразование Фурье (ДПФ) двумя способами: по общей формуле и «быстро».

Было вычислено ДПФ для дискретного сигнала из индивидуального задания. Построены АЧХ и ФЧХ преобразования от номеров отсчетов.

Отдельным заданием мы нашли минимальное число низкочастотных гармонических составляющих сигнала, которые можно оставить, чтобы осталось не менее 90 % его энергии. Были построены графики АЧХ, ФЧХ и сигнал по низкочастотным гармоникам.

Далее проводилось измерение скорости расчетов при вычислении ДПФ непосредственно по теоретической формуле и быстрым алгоритмом. Число вычислений ДПФ задавалось как степень двойки (от 64 до 8192). Быстрый алгоритм использовал способ Кули-Тьюки, число операций в котором пропорционально N log2(N).

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