%% Дополнение сигнала нулями
%Скопируем исходный дискретный сигнал в переменную с новым именем и
%добавим к концу этой копии сигнала нулевые отсчеты в количестве, равном
%длине сигнала (длина вектора, таким образом, увеличится в 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).
Были построены графики затрат времени на однократное вычисление ДПФ обоими методами (в логарифмических координатах). Пободраны аппроксимирующие зависимости исходя из математических моделей, определяющих времена преобразований.
