Импульсная характеристика системы
Узнаём, как один-единственный тест полностью описывает поведение линейной системы.
Импульсная характеристика $h[n]$ — это реакция системы на единичный импульс $\delta[n]$. Для линейной стационарной системы она содержит всю информацию о системе.
Удивительный факт DSP: чтобы узнать, что система сделает с любым сигналом, достаточно подать на её вход один «укол» — единичный импульс — и записать реакцию. Эта реакция, импульсная характеристика, и есть «паспорт» системы. Дальше выход на любой вход считается свёрткой входа с этим паспортом.
Снимаем импульсную характеристику
Возьмём систему «полусумма соседей»: $y[n] = 0.5\,x[n] + 0.5\,x[n-1]$. Подадим импульс и посмотрим, что выйдет.
def system(x):
# y[n] = 0.5*x[n] + 0.5*x[n-1]
y = []
prev = 0
for s in x:
y.append(round(0.5 * s + 0.5 * prev, 3))
prev = s
return y
impulse = [1, 0, 0, 0, 0]
h = system(impulse)
print("Импульсная характеристика h:", h)
Вывод:
Импульсная характеристика h: [0.5, 0.5, 0.0, 0.0, 0.0]
Реакция на «укол» — это $[0.5, 0.5]$. Два ненулевых коэффициента полностью задают систему: $h = [0.5, 0.5]$.
Зная h, считаем выход на любой вход
Теперь проверим главное утверждение: выход на произвольный сигнал равен свёртке этого сигнала с $h$. Сравним прямой расчёт системы и свёртку.
def system(x):
y = []
prev = 0
for s in x:
y.append(round(0.5 * s + 0.5 * prev, 3))
prev = s
return y
def convolve(x, h):
y = [0.0] * (len(x) + len(h) - 1)
for i in range(len(x)):
for j in range(len(h)):
y[i + j] += x[i] * h[j]
return [round(v, 3) for v in y]
x = [4, 4, 4, 4]
h = [0.5, 0.5]
print("через систему:", system(x))
print("через свёртку: ", convolve(x, h)[:4])
Вывод:
через систему: [2.0, 4.0, 4.0, 4.0] через свёртку: [2.0, 4.0, 4.0, 4.0]
Результаты совпадают. Мы заменили работу системы простой свёрткой с её импульсной характеристикой — в этом её сила.
Как работает под капотом
Почему так получается? Любой дискретный сигнал — это сумма сдвинутых и масштабированных импульсов: $x[n] = \sum_k x[k]\,\delta[n-k]$. Если система линейна (реакция на сумму = сумма реакций) и стационарна (сдвиг входа во времени сдвигает выход, не меняя форму), то реакция на каждый $\delta[n-k]$ — это сдвинутая копия $h$, умноженная на $x[k]$. Складываем все копии — и получаем ровно формулу свёртки $y[n] = \sum_k x[k]\,h[n-k]$. Вот почему импульсный отклик исчерпывающе описывает линейную стационарную систему: вход разбирается на импульсы, каждый даёт известную реакцию, реакции складываются.
delta --[система]--> h (снимаем "паспорт") x = a*delta + b*delta(сдвиг) + ... y = a*h + b*h(сдвиг) + ... = x * h
Частые ошибки
- Применять идею к нелинейной системе. Если в системе есть возведение в квадрат, ограничение (клиппинг) или порог — импульсный отклик её НЕ описывает.
- Забыть про стационарность. Если коэффициенты системы меняются со временем, единый $h$ не работает.
- Считать $h$ всегда коротким. У систем с обратной связью (IIR) импульсная характеристика бесконечна.
Итог
- Импульсная характеристика $h[n]$ — реакция системы на единичный импульс.
- Для линейной стационарной системы $h$ содержит всю информацию о ней.
- Выход на любой вход = свёртка входа с $h$.
- Идея работает только для линейных и стационарных систем.