Лабораторочки / ЦОС 3
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ТОР
отчЕт
по лабораторной работе №3
по дисциплине «Цифровая обработка сигналов»
Тема: ДИСКРЕТНОЕ ПРЕОБРАЗОВАНИЕ ФУРЬЕ
фыв
Студенты гр. фыв |
|
фыв фыв |
Преподаватель |
|
фыв |
Санкт-Петербург
фыв
Цели работы:
• Расчет дискретного преобразования Фурье (ДПФ) средствами MATLAB.
• Оценка с помощью прямого и обратного ДПФ полосы частот, в которой сосредоточена основная доля энергии сигнала.
• Наблюдение изменений результатов вычисления ДПФ, происходящих при дополнении сигнала нулевыми отсчетами.
• Оценка степени ускорения вычислений за счет алгоритмов быстрого преобразования Фурье (БПФ).
Индивидуальное задание:
-
Вариант
U1, В
U2, В
U3, В
U4, В
Т1, мс
T2, мс
Fд, кГц
10
8
-3
4
0
3
8
5
Таблица 1 – Параметры сигнала
Текст кода:
clear; close all; clc;
u1=8; u2=-3; u3=4; u4=0;
T1=3; T2=8; Fd=5;
T=1/Fd;
t1=0:T:T1;
t2=T1+T:T:T2;
t=[t1 t2];
U_lin1=((u2-u1)/T1)*t1+u1;
U_lin2=((u4-u3)/(T2-T1))*(t2-T1)+u3;
U = [U_lin1 U_lin2];
figure(1)
hold on;
plot(t, U,'r--');
stem(t, U,'b-');
grid on;
title('Исходный дискретный сигнал');
xlabel('t, мс'); ylabel('U, B');
y = fft(U);
figure(2)
subplot(2,1,1); stem(abs(y));
title('Модуль ДПФ');
xlabel('k (номер гармоники)'); ylabel('|y(k)|');
grid on;
subplot(2,1,2); stem(angle(y));
title('Фаза ДПФ');
xlabel('k'); ylabel('arg(y(k))');
grid on;
E0 = sum(abs(U).^2);
fprintf('Энергия исходного сигнала: %.2f\n', E0);
y1 = y;
Nmax = 0;
Eu = 0;
while Eu/E0*100 < 90
Nmax = Nmax + 1;
y1 = y;
if Nmax+2 <= length(y1)-Nmax
y1(Nmax+2:length(y1)-Nmax) = 0;
end
u_rec = ifft(y1);
Eu = sum(abs(u_rec).^2);
fprintf('Nmax=%d: энергия=%.2f (%.1f%%)\n', Nmax, Eu, Eu/E0*100);
end
fprintf('\nРЕЗУЛЬТАТ: Nmax = %d (сохранено %.1f%% энергии)\n', Nmax, Eu/E0*100);
fprintf('Ширина спектра = %.1f Гц\n', (Nmax+1)*Fd/length(U));
figure(3)
hold on
stem(t, U,'b-', 'LineWidth', 1.5);
stem(t, real(u_rec),'r-', 'LineWidth', 1);
title('Обратное ДПФ (90% энергии)');
xlabel('t, мс'); ylabel('U, B');
legend('Исходный', 'Восстановленный');
grid on;
U_zero = [U, zeros(1, length(U))];
y_zero = fft(U_zero);
figure(4)
subplot(2,1,1); stem(abs(y_zero));
title('Модуль ДПФ (с дополнением нулями)');
xlabel('k (номер гармоники)'); ylabel('|y(k)|');
grid on;
subplot(2,1,2); stem(angle(y_zero));
title('Фаза ДПФ (с дополнением нулями)');
xlabel('k (номер гармоники)'); ylabel('arg(y(k))');
grid on;
N_vals = [64, 128, 256, 512, 1024, 2048, 4096, 8192];
K_direct = 200;
K_fft = 30000;
fprintf('\n=== ИЗМЕРЕНИЕ ПРЯМОГО МЕТОДА (умножение на матрицу) ===\n');
time_direct = zeros(1, length(N_vals));
for i = 1:length(N_vals)
N_curr = N_vals(i);
x_pad = [U, zeros(1, N_curr - length(U))];
D = dftmtx(N_curr);
tic
for rep = 1:K_direct
y_temp = x_pad * D;
end
time_direct(i) = toc;
fprintf('N=%4d: %.4f с (однократно: %.2f мкс)\n', N_curr, time_direct(i), time_direct(i)/K_direct*1e6);
end
fprintf('\n=== ИЗМЕРЕНИЕ БПФ (быстрое преобразование) ===\n');
time_fft = zeros(1, length(N_vals));
for i = 1:length(N_vals)
N_curr = N_vals(i);
tic
for rep = 1:K_fft
y_temp = fft(U, N_curr);
end
time_fft(i) = toc;
fprintf('N=%4d: %.4f с (однократно: %.2f мкс)\n', N_curr, time_fft(i), time_fft(i)/K_fft*1e6);
end
k1 = 8.5 * 10^-10;
k2 = 5.2 * 10^-10;
t_direct_single = time_direct / K_direct;
t_fft_single = time_fft / K_fft;
t_direct_log = log2(t_direct_single);
t_fft_log = log2(t_fft_single);
N_log = log2(N_vals);
tt1 = log2(k1 * (N_vals.^2));
tt2 = log2(k2 .* N_vals .* log2(N_vals));
figure(5)
hold on
grid on
plot(N_log, t_direct_log, 'ro-', 'LineWidth', 1.5, 'MarkerSize', 8);
plot(N_log, tt1, 'b--s', 'LineWidth', 1.5);
title('Затраты времени на однократное вычисление (прямой метод)');
xlabel('log_2(N)'); ylabel('log_2(t), с');
legend('Эксперимент', sprintf('Аппроксимация N^2, k1=%.1e', k1), 'Location', 'northwest');
hold off;
figure(6)
hold on
grid on
plot(N_log, t_fft_log, 'ro-', 'LineWidth', 1.5, 'MarkerSize', 8);
plot(N_log, tt2, 'b--s', 'LineWidth', 1.5);
title('Затраты времени на однократное вычисление (БПФ)');
xlabel('log_2(N)'); ylabel('log_2(t), с');
legend('Эксперимент', sprintf('Аппроксимация N log_2(N), k2=%.1e', k2), 'Location', 'northwest');
hold off;
Формирование исходного сигнала
Рис. 1 – Код для формирования исходного сигнала (стр. 1-17)
Риc. 2 – Исходный дискретный сигнал
Расчёт ДПФ
Риc. 3 – Код для расчета ДПФ с помощью функции ftt (стр. 18-27)
Риc. 4 – Модуль и фаза спектральных отсчётов
Оценка ширины спектра сигнала
Энергия исходного сигнала: 408.28 В2
Ширина спектра = 0.7 Гц
Риc. 5 – Код для Оценки ширины спектра сигнала (стр. 28-52)
Nmax=1: энергия=197.44 (48.4%) Nmax=2: энергия=307.76 (75.4%) Nmax=3: энергия=343.22 (84.1%) Nmax=4: энергия=346.45 (84.9%) Nmax=5: энергия=368.14 (90.2%) Результат: Nmax = 5 (сохранено 90.2% энергии)
Риc. 6 – Исходный и восстановленный дискретные сигналы
Дополнение сигнала нулями
Рис. 7 – Код для дополнения сигнала нулями (увеличение длительности сигнала в 2 раза) (стр 53-63)
Рис. 8 – Модуль и фаза спектральных отсчётов
Измерение скорости расчетов при вычислении ДПФ непосредственно по теоретической формуле
Коэффициенты аппроксимации: k1 = 8.5 * 10^-10;
k2 = 5.2 * 10^-10;
Рис. 9 – Код программы (стр. 64 –79)
Рис. 10 – Зависимость времени выполнения 1 вычисления от числа элементов матрицы ДПФ
-
Параметр
N
64
128
256
512
1024
2048
4096
8192
Время, с
0,008
0,005
0,009
0,024
0,0175
0,2731
1,2592
5,1647
Время однократного вычисления ДПФ, мкс
3,84
2,51
4,34
11,92
87,6
1365,65
6295,95
25823,64
Таблица 2 – Зависимость времени вычисления от размера вычисляемой матрицы ДПФ
Измерение скорости расчетов при вычислении ДПФ с использованием быстрого алгоритма
Рис. 11 – Код программы (стр. 80 –117)
Рис. 12 – Зависимость времени выполнения 1 вычисления от числа элементов матрицы ДПФ
-
Параметр
N
64
128
256
512
1024
2048
4096
8192
Время, с
0.0171
0.0175
0.0248
0.0344
0.0643
0.1062
0.1971
0.4448
Время однократного вычисления ДПФ, мкс
0.57
0.58
0.83
1.15
2.14
3.54
6.57
14.83
Таблица 3 – Зависимость времени вычисления от размера вычисляемой матрицы ДПФ
Вывод:
В ходе лабораторной работы было выполнено дискретное преобразование Фурье для сигнала, заданного индивидуальным параметрами (вариант 10). Рассчитана энергия исходного сигнала, составившая 408,28 В², и определено минимальное количество гармоник Nmax = 5, обеспечивающее сохранение не менее 90% энергии сигнала. Ширина спектра при этом составила 0,7 Гц. Продемонстрировано, что дополнение сигнала нулями приводит к увеличению числа спектральных отсчетов, делая спектр более детализированным. Проведена оценка скорости вычислений: прямое вычисление ДПФ через матричное умножение требует значительно больше времени (особенно при больших N) по сравнению с БПФ. Экспериментально подтверждено, что вычислительные затраты при прямом методе растут пропорционально N², а при использовании БПФ — пропорционально N·log₂(N), что согласуется с теорией. Подобранные коэффициенты аппроксимации составили k₁ = 8,5·10⁻¹⁰ и k₂ = 5,2·10⁻¹⁰.
