Добавил:
instagram.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба3 / Лаба №3.docx
Скачиваний:
37
Добавлен:
01.12.2024
Размер:
301 Кб
Скачать
☆
  1. Измерение скорости расчётов при вычислении дпф с использованием быстрого алгоритма

Рис.12 – Измерение скорости расчётов при вычислении ДПФ по быстрому алгоритму

Значения N берутся из кода ранее, затем с помощью цикла for для каждого размера ДПФ проводятся вычисления по быстрому алгоритму с таймером, на выходе значения времени собираются в массив tf, а времени для однократного вычисления в массив tf1. Максимально близкая к расчетам аппроксимирующая прямая задается коэффициентом k2 = 0.3 * 10-9 с.

Количество повторений k задается равным 350000, так как при этом значении время вычисления ДПФ размера N = 1024 составляет около 1 с.

Рис.13 – График экспериментальной и теоретической зависимостей для быстрого ДПФ

Таблица 3 – Экспериментальные значения времени БПФ для k = 350000

Параметр

N

64

128

256

512

1024

2048

4096

8192

Время, с

0.3136

0.3318

0.4667

0.6585

1.1054

2.0826

4.4660

10.3641

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

0.8959

0.9479

1.3334

1.8814

3.1582

5.9504

12.76

29.612

ВЫВОД

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

Оценка ширины спектра позволила установить, что даже при удалении всех остальных гармоник, 90% энергии исходного сигнала E0 сосредоточено в двух первых компонентах спектра. Это соответствует тому, что для восстановления сигнала достаточно учитывать только нулевую гармонику (DC-составляющую) и основную гармонику. Восстановленный сигнал сохраняет 90% энергии исходного сигнала, а высшие гармоники содержат лишь 10% энергии и несущественны для восстановления. В итоге восстановленный сигнал почти полностью повторяет исходный.

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

Исследования скоростей алгоритмов ДПФ позволило установить, что БПФ является оптимальным если сигнал имеет большой размер, то есть его спектр содержит большое количество отсчетов. Для небольших сигналов удобно прямое ДПФ так как оно проще в реализации и не требует дополнительных оптимизаций.

Листинг кода

clear;

close all;

clc;

% Задание параметров для сигналов и фильтра

U1 = 9;

U2 = -3;

U3 = -8;

U4 = 5;

T1 = 3;

T2 = 6;

Fd = 5;

T = 1 / Fd;

% 1. Построение исходного сигнала

t1 = 0:T:T1;

t2 = T1+T:T:T2;

t = 0:T:T2;

x1 = U1 + (U2-U1)/T1*t1;

x2 = U3 + (U4-U3)/(T2-T1)*(t2-T1);

xk = [x1 x2];

figure;

hold on;

stem(t, xk, 'k');

xlabel('t, ms');

ylabel('u(t), V');

grid on;

% 2. Спектральный анализ с использованием ДПФ

N = length(xk); % Определяем длину исходного сигнала

n = 0:(N-1); % Формируем вектор индексов для оси X

xd = fft(xk, N); % Применяем ДПФ

% График амплитудного спектра

figure;

subplot(2,1,1);

stem(n,abs(xd), 'k.', MarkerSize=15);

grid on;

title('Spectral sampling magnitude');

xlabel('n');

ylabel('|X(n)|');

% График фазового спектра

subplot(2,1,2);

stem(n,angle(xd), 'k.', MarkerSize=15);

grid on;

title('Spectral sampling phase');

xlabel('n');

ylabel('arg(X(n))');

% 3. Оценка ширины спектра

E0 = sum(abs(xk).^2); % Полная энергия исходного сигнала

Nmax = 0; % Инициализируем переменную

E_th = 0.9 * E0; % Устанавливаем порог энергии

% Цикл для нахождения минимального Nmax, при котором восстановленная энергия достигает порога

while true

xd1 = xd; % Копируем спектр сигнала

xd1(Nmax+2:length(xd1)-Nmax) = 0; % Обнуляем компоненты

xr = ifft(xd1); % Применяем обратное ДПФ

E_r = sum(abs(xr).^2); % Энергия восстановленного сигнала

if E_r >= E_th

break; % Прерываем цикл, если энергия восстановленного сигнала достигает порога

end

Nmax = Nmax + 1; % Или увеличиваем диапазон частот для восстановления

end

% График исходного и восстановленного сигнала

figure;

hold on;

stem(t, xk, 'k');

stem(t, xr, 'k.', MarkerSize=15);

title('Original and Restored Signal');

xlabel('t, s');

ylabel('u(t), V');

legend('Original Signal', 'Restored Signal');

grid on;

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

figure;

subplot(2, 1, 1);

stem(n, abs(xd1), 'k.', MarkerSize=15);

grid on;

title('Spectral sampling magnitude');

xlabel('n');

ylabel('|X(n)|');

subplot(2, 1, 2);

stem(n, angle(xd1), 'k.', MarkerSize=15);

grid on;

title('Spectral sampling phase');

xlabel('n');

ylabel('arg(X(n))');

% 4. Анализ спектра сигнала дополненного нулями

xk1 = xk; % Копируем исходный сигнал

x0 = [xk1 zeros(1,length(xk1))]; % Добавляем нули в конец сигнала, увеличивая его длину

xd0 = fft(x0); % Применяем ДПФ

n = 0:length(xd0)-1; % Формируем вектор индексов для оси X для нового спектра

% График амплитудного спектра сигнала дополненного нулями

figure;

subplot(2,1,1);

stem(n, abs(xd0), 'k.', MarkerSize=15);

grid on;

title('Spectral Sampling Magnitude of Zero-Padded Signal');

xlabel('n');

ylabel('|X(n)|');

xlim([0 length(n)]);

% График фазового спектра сигнала дополненного нулями

subplot(2,1,2);

stem(n, angle(xd0), 'k.', MarkerSize=15);

grid on;

xlim([0 length(n)]);

title('Spectral Sampling Phase of Zero-Padded Signal');

xlabel('n');

ylabel('arg(X(n))');

% 5. Измерение времени выполнения ДПФ

f = 6:13; % Вектор частот

N = 2.^f; % Создаем массив длин сигналов (N) на основе степеней двойки

for i = 1:8

gx = [xk zeros(1, N(i) - length(xk))]; % Дополняем нулями

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

y = zeros(1,N(i)); % Массив результата

tic % Начинаем измерение времени

for k = 1:6500 % Цикл повторений

y = gx*D; % Прямой расчет ДПФ

end

tx(i) = toc; % Замеряем время выполнения

end

tx1 = tx./6500; % Время одного расчета

tteor = 0.2*N.^2*10^(-9); % Теоретическое время ДПФ

%Построение графиков эффективности алгоритма

figure;

semilogy(log2(N),(tx1),'k-', 'Marker', '.', 'MarkerSize', 15);

hold on;

semilogy(log2(N),tteor,'b--');

xlabel('log2(N)');

ylabel('t, s');

legend('Experiment','Theory');

grid on;

% 6. Измерение времени выполнения БПФ

for i = 1:8

y = zeros(1,N(i)); % Массив результата

tic % Начинаем измерение времени

for k = 1:350000 % Цикл повторений

y = fft(xk,N(i)); % Вычисление БПФ

end

tf(i) = toc; % Замеряем время выполнения

end

tf1 = tf./350000; % Время одного расчета

tteorf = 0.3*N.*log2(N)*10^(-9); % Теоретическое время БПФ

%Построение графиков эффективности алгоритма

figure;

semilogy(log2(N),tf1,'k-', 'Marker', '.', 'MarkerSize', 15);

hold on;

semilogy(log2(N),tteorf,'b--');

xlabel('log2(N)');

ylabel('t,s');

legend('Experiment','Theory');

grid on;

Соседние файлы в папке Лаба3