Линейные стационарные системы (LTI)
Разбираем класс систем, ради которого построена вся классическая теория DSP.
LTI-система (Linear Time-Invariant, линейная стационарная) — система, которая линейна (соблюдает суперпозицию) и стационарна (её свойства не меняются во времени).
Почему вся теория фильтров крутится вокруг LTI? Потому что для таких систем есть полная, красивая и предсказуемая математика: импульсный отклик, свёртка, частотная характеристика. Стоит системе быть LTI — и мы знаем о ней всё. Большинство полезных фильтров проектируют именно как LTI.
Линейность: принцип суперпозиции
Система линейна, если выполняются два правила. Аддитивность: реакция на сумму входов = сумма реакций. Однородность: усиление входа в a раз усиливает выход в a раз. Вместе это принцип суперпозиции: сложный сигнал можно разобрать на части, обработать каждую и сложить результаты.
def system(x):
# линейная: y[n] = x[n] - x[n-1] (разность)
y = []
prev = 0
for s in x:
y.append(s - prev)
prev = s
return y
a = [1, 2, 3, 4]
b = [4, 3, 2, 1]
# проверяем аддитивность: system(a+b) == system(a)+system(b)
sum_in = [x + y for x, y in zip(a, b)]
left = system(sum_in)
right = [x + y for x, y in zip(system(a), system(b))]
print("system(a+b):", left)
print("sys(a)+sys(b):", right)
print("Линейна:", left == right)
Вывод:
system(a+b): [5, 0, 0, 0] sys(a)+sys(b): [5, 0, 0, 0] Линейна: True
Стационарность: инвариантность к сдвигу
Система стационарна, если задержка входа просто задерживает выход, не меняя его форму. «Сегодня и завтра система ведёт себя одинаково». Формально: если вход x[n] даёт выход y[n], то x[n-k] даёт y[n-k].
def system(x):
return [round(0.5 * x[i] + 0.5 * x[i - 1], 2) if i > 0 else round(0.5 * x[i], 2)
for i in range(len(x))]
x = [0, 4, 0, 0, 0]
xs = [0, 0, 4, 0, 0] # тот же импульс, сдвинут на 1
print("отклик: ", system(x))
print("отклик(сдвиг):", system(xs))
print("Форма та же, сдвинута:", system(x)[1:] == system(xs)[2:] + [0])
Вывод:
отклик: [0.0, 2.0, 2.0, 0.0, 0.0] отклик(сдвиг): [0.0, 0.0, 2.0, 2.0, 0.0] Форма та же, сдвинута: True
Примеры: что LTI, а что нет
| Система | LTI? | Почему |
y = 0.5x[n] + 0.5x[n-1] | да | линейна и стационарна |
y = x[n]**2 | нет | нелинейна (квадрат) |
y = n*x[n] | нет | коэффициент зависит от времени |
y = max(min(x[n], 1), -1) | нет | ограничение нелинейно |
| скользящее среднее | да | линейная свёртка с постоянным ядром |
Как работает под капотом
Магия LTI в том, что синусы — собственные функции таких систем. Подайте на LTI-систему синус частоты f — на выходе будет синус той же частоты, лишь с изменённой амплитудой и фазой. Множитель (комплексное число), на который умножается синус, зависит только от частоты и называется частотной характеристикой H(f). Она — это преобразование Фурье импульсного отклика h[n]. Отсюда фундаментальная связь: свёртка во времени = умножение в частотной области. Поэтому LTI-фильтр удобно описывать одной кривой H(f) — она показывает, какие частоты система пропускает, а какие душит. Вся теория фильтров (раздел 7) строится на этом.
Частые ошибки
- Считать любую «простую» систему линейной. Возведение в квадрат, модуль, ограничение — всё это нелинейности, частые в реальных схемах.
- Игнорировать нестационарность. Адаптивные фильтры и системы с изменяемыми параметрами не LTI — к ним классическая теория не применима напрямую.
- Думать, что нелинейность всегда плоха. Нелинейные системы нужны (детектирование, компрессоры), просто их анализируют другими методами.
Итог
- LTI = линейная (суперпозиция) + стационарная (инвариантность к сдвигу).
- Для LTI работают импульсный отклик, свёртка и частотная характеристика.
- Синусы — собственные функции LTI: на выходе синус той же частоты.
- Свёртка во времени соответствует умножению в частотной области.