Импульсная характеристика системы

Узнаём, как один-единственный тест полностью описывает поведение линейной системы.

Импульсная характеристика 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.
  • Идея работает только для линейных и стационарных систем.
Проверьте себя
1. Как снять импульсную характеристику системы?
AПодать на вход синус и измерить громкость
BПодать единичный импульс и записать реакцию
CПодать шум и усреднить
DИзмерить частоту дискретизации
2. Зная импульсную характеристику h, как найти выход на произвольный вход x?
AСложить x и h
BВычислить свёртку x с h
CУмножить x на максимум h
DЭто невозможно
3. Для каких систем импульсный отклик полностью описывает поведение?
AДля любых систем
BТолько для линейных и стационарных (LTI)
CТолько для нелинейных
DТолько для аналоговых