Свёртка сигналов
Свёртка сигналов в Engee
Введение
Свёртка — одна из фундаментальных операций цифровой обработки сигналов. Она описывает отклик линейной стационарной системы на произвольное входное воздействие и широко применяется при анализе фильтров, моделировании каналов связи, обработке изображений и в задачах автоматического управления.
Математически операция свёртки для непрерывных сигналов записывается как интеграл:
а для дискретных последовательностей как сумма:
Смысл операции состоит в следующем: одна из последовательностей зеркально отражается, сдвигается относительно другой, поэлементно перемножается с ней, а результаты перемножения суммируются. Сдвиг повторяется на каждом шаге до тех пор, пока последовательности не перестанут перекрываться.
В данном примере рассматривается численная реализация свёртки двух сигналов в среде Julia:
-
импульсная характеристика - линейно убывающая функция на интервале с;
-
входной сигнал - прямоугольный импульс единичной амплитуды на интервале с.
Цель работы - продемонстрировать пошаговое выполнение дискретной свёртки, корректно учесть шаг дискретизации и визуализировать исходные сигналы вместе с результатом.
Исходные данные
Инициализируем временную область, импульсную характеристику, и функцию входного сигнала:
dt = 0.01 # временной шаг
t1 = 0:dt:2
ft = 2 .- t1 # импульсная характеристика
t2 = -2:dt:2
gt = 3 .* ones(length(t2)) # входной сигнал
Операция свёртки
Применим операцию свёртки из библиотеки EngeeDSP к импульсной характеристике и входному сигналу:
yt = dt .* EngeeDSP.Functions.conv(ft, gt) # применение операции свёртки
ytx = dt .* (1:length(yt)) .+ first(t2)
Ожидаемый результат — трапециевидный выходной сигнал: нарастание на участке перекрытия последовательностей, плоская вершина и симметричный спад. Такая форма закономерна: свёртка прямоугольного импульса с линейно убывающей функцией даёт кусочно-линейный отклик.
Визуализация
Построим графики импульсной характеристики, входного и выходного сигнала:
# графики импульсной характеристики, входного и выходного сигнала
p1 = plot(t1, ft, color=:red, linewidth=3, title="Импульсная характеристика", xlabel="", ylabel="Амплитуда", grid=true, xlim=(-2, 2), legend=false)
p2 = plot(t2, gt, color=:green, linewidth=3, title="Входной сигнал", xlabel="время, с", ylabel="Амплитуда", grid=true, ylim=(0, 3.5), legend=false)
p3 = plot(ytx, yt, color=:blue, linewidth=3, title="Выходной сигнал", xlabel="время, с", ylabel="Амплитуда", grid=true, legend=false)
plot(p1, p2, p3)
Операция дискретной свёртки выполнена.
Заключение
В данном примере реализована дискретная свёртка двух последовательностей. Выходной сигнал получил трапециевидную форму, что подтверждает корректность алгоритма и учёт шага дискретизации. Пример показывает, как из простых сигналов формируется более сложный отклик системы. Свёртка широко применяется на практике: в цифровых фильтрах, при передаче сигналов по каналам связи, в радиолокации, обработке изображений и звука, в медицинской диагностике, системах управления и в свёрточных нейросетях.
В Engee для таких задач есть библиотека EngeeDSP с готовыми функциями свёртки, фильтрации и спектрального анализа. Это позволяет сосредоточиться на логике алгоритма, не реализуя вычисления вручную. Использование EngeeDSP.Functions.conv в скрипте это подтверждает. Данный пример может служить общей иллюстрацией свёртки и отправной точкой для более сложных задач обработки сигналов в Engee.