Импульсная характеристика системы
Узнаём, как один-единственный тест полностью описывает поведение линейной системы.
Импульсная характеристика
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(x[k]*delta[n-k]). Если система линейна (реакция на сумму = сумма реакций) и стационарна (сдвиг входа во времени сдвигает выход, не меняя форму), то реакция на каждый delta[n-k] — это сдвинутая копия h, умноженная на x[k]. Складываем все копии — и получаем ровно формулу свёртки y[n] = sum(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. - Идея работает только для линейных и стационарных систем.