Задание 4: Свёртка двух сигналов — conv() и вручную
Раздел: 1. Временное и частотное представление сигналов
Тема: 1.5 Свёртка (конволюция). Интеграл Дюамеля
Тип: MATLAB Script
Срок выполнения: 2 ч СРС
Максимальный балл: 2.5
Цель работы
Вычислить линейную свёртку двух сигналов двумя способами: с помощью встроенной функции conv() и вручную через цикл. Убедиться в совпадении результатов.
Теоретическая справка
Непрерывная свёртка:
\[y(t) = x_1(t) * x_2(t) = \int_{-\infty}^{\infty} x_1(\tau)\, x_2(t - \tau)\, d\tau\]Дискретная свёртка (для реализации в MATLAB):
\[y[n] = \sum_{k=0}^{N_1-1} x_1[k] \cdot x_2[n - k]\]Длина результата: если len(x1) = N1, len(x2) = N2, то len(y) = N1 + N2 - 1.
В MATLAB: y = conv(x1, x2) — встроенная реализация (оптимальная через FFT).
Нормировка к непрерывной: после conv() делить на fs — аппроксимация интеграла методом прямоугольников.
Задание
Параметры
fs = 1000 Гц, T = 0.1 с, t = 0:1/fs:T-1/fs
Исходные сигналы
x1 = sin(2*pi*20*t) .* (t < 0.05) % Синус 20 Гц, обрезан в 0.05 с
x2 = exp(-50*t) .* double(t >= 0) % Экспоненциальный спад
Что нужно сделать
Часть А — через conv():
y_conv = conv(x1, x2) / fs
Часть Б — вручную через двойной цикл:
for n = 1 : N_out
for k = 1 : N1
m = n - k + 1
if (m >= 1) && (m <= N2)
y_manual(n) = y_manual(n) + x1(k) * x2(m)
end
end
end
y_manual = y_manual / fs
Часть В: Проверить совпадение: max(abs(y_conv - y_manual)) должно быть < 1e-9.
Графики: 3 подграфика — исходные сигналы, оба результата свёртки, разность.
Файлы задания
| Файл | Назначение |
|---|---|
task04_template.m | Шаблон — заполнить ??? |
task04_grader.m | Автопроверка |
Ожидаемые результаты
| Переменная | Ожидание |
|---|---|
y_conv | Вектор длиной 2*N-1 = 199 |
y_manual | Вектор той же длины |
max_diff | < 1e-9 |
Контрольные вопросы
- Какова физическая интерпретация свёртки входного сигнала с импульсной характеристикой системы?
- Чему равна длина результата свёртки двух векторов длиной N₁ и N₂?
- Почему при численном вычислении свёртки нужно делить на
fs?
Критерии оценки
| Балл | Критерий |
|---|---|
| 2.0 | y_conv и y_manual верны, расхождение < 1e-9, grader ≥ 9/10 |
| 1.5 | y_conv верна, y_manual с небольшой ошибкой |
| 1.0 | Один из способов реализован |
| +0.5 | Комментарии, описывающие каждый шаг цикла |