Добавил:
до поступления в лэти я 11 лет играл в подкидного на фофаны, а потом... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
14.09.2026
Размер:
1 Мб
Скачать
☆

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ТОР

отчЕт

по лабораторной работе №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 – Код для формирования исходного сигнала (стр. 1-17)

Риc. 2 – Исходный дискретный сигнал

  1. Расчёт ДПФ

Риc. 3 – Код для расчета ДПФ с помощью функции ftt (стр. 18-27)

Риc. 4 – Модуль и фаза спектральных отсчётов

  1. Оценка ширины спектра сигнала

Энергия исходного сигнала: 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 – Исходный и восстановленный дискретные сигналы

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

Рис. 7 – Код для дополнения сигнала нулями (увеличение длительности сигнала в 2 раза) (стр 53-63)

Рис. 8 – Модуль и фаза спектральных отсчётов

  1. Измерение скорости расчетов при вычислении ДПФ непосредственно по теоретической формуле

Коэффициенты аппроксимации: 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 – Зависимость времени вычисления от размера вычисляемой матрицы ДПФ

  1. Измерение скорости расчетов при вычислении ДПФ с использованием быстрого алгоритма

Рис. 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⁻¹⁰.

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