Язык DSP: обозначения и термины
Осваиваем словарь DSP, чтобы дальше формулы и код читались без запинки.
Частота дискретизации $f_s$ — сколько отсчётов в секунду снимает АЦП; измеряется в герцах (Гц) или отсчётах/с (sps).
У каждой инженерной области свой язык. В DSP десяток ключевых обозначений, и если их освоить сразу, дальше всё пойдёт легко. Этот урок — справочник, к которому стоит возвращаться.
Отсчёт, индекс, время
Сигнал в коде — список x, где $x[n]$ — отсчёт с номером $n$. Если частота дискретизации $f_s$, то отсчёт $n$ снят в момент времени $t = n / f_s$. Например, при $f_s = 44100$ отсчёт №100 соответствует $100/44100 \approx 0.00227$ с.
fs = 1000 # 1000 отсчётов в секунду
n = [0, 100, 250, 500]
for i in n:
print(f"отсчёт {i:>3} -> t = {i / fs:.3f} c")
Вывод:
отсчёт 0 -> t = 0.000 c отсчёт 100 -> t = 0.100 c отсчёт 250 -> t = 0.250 c отсчёт 500 -> t = 0.500 c
Частота: герцы и нормированная частота
Частота сигнала измеряется в герцах (Гц) — число колебаний в секунду. Но в DSP удобнее нормированная частота: $f / f_s$ — доля от частоты дискретизации, всегда от 0 до 1. А ещё чаще пишут $\omega = 2\pi f / f_s$ — угловую частоту в радианах на отсчёт. Диапазон полезных частот — от 0 до $f_s/2$, что в нормированных единицах от 0 до 0.5, а в радианах от 0 до $\pi$. Почему именно половина — узнаем из теоремы Котельникова.
| Единица | Диапазон | Смысл |
| Гц ($f$) | $0 \ldots f_s/2$ | колебаний в секунду |
| нормированная ($f/f_s$) | $0 \ldots 0.5$ | доля частоты дискретизации |
| радианы/отсчёт ($\omega$) | $0 \ldots \pi$ | фаза, набегающая за отсчёт |
Два кирпичика: импульс и ступень
В DSP есть два эталонных сигнала, через которые выражают почти всё.
Единичный импульс $\delta[n]$ равен 1 при $n = 0$ и 0 во всех остальных точках. Это «укол» в нулевой момент. Реакция системы именно на него — её полная характеристика (импульсный отклик).
Единичная ступень $u[n]$ равна 0 при $n \lt 0$ и 1 при $n \ge 0$. Это «включение» сигнала в нулевой момент.
def delta(n):
return 1 if n == 0 else 0
def step(n):
return 1 if n >= 0 else 0
idx = range(-3, 4)
print("n :", list(idx))
print("delta:", [delta(n) for n in range(-3, 4)])
print("step :", [step(n) for n in range(-3, 4)])
Вывод:
n : [-3, -2, -1, 0, 1, 2, 3] delta: [0, 0, 0, 1, 0, 0, 0] step : [0, 0, 0, 1, 1, 1, 1]
Импульс и ступень связаны: ступень — это накопленная сумма импульсов, а импульс — разность соседних значений ступени. Эта пара — основа описания систем.
Как работает под капотом
Зачем столько обозначений? Нормированная частота делает алгоритмы независимыми от $f_s$: фильтр, спроектированный «убрать всё выше 0.25», работает и на 8 кГц, и на 48 кГц — меняется лишь реальная граница в герцах. Импульс важен потому, что любой дискретный сигнал — это сумма сдвинутых и масштабированных импульсов:
$$x[n] = \sum_k x[k]\,\delta[n-k]$$
На этом простом факте держится вся теория линейных систем и свёртки, к которой мы придём в разделе 4.
Частые ошибки
- Забыть про $f_s$ при разговоре о частоте. «Частота 1000» бессмысленна без $f_s$: 1000 Гц при $f_s=2000$ — это уже предел Найквиста.
- Путать импульс и ступень. Импульс — один ненулевой отсчёт; ступень — «включилось и осталось».
- Считать, что нормированная частота больше 0.5 имеет смысл. Выше 0.5 начинается зеркальное отражение (алиасинг) — об этом отдельный урок.
Итог
- Отсчёт $x[n]$ снят в момент $t = n/f_s$; $f_s$ — частота дискретизации в Гц.
- Частоту удобно нормировать: $f/f_s$ (0..0.5) или $\omega = 2\pi f / f_s$ (0..$\pi$).
- Единичный импульс $\delta[n]$ и единичная ступень $u[n]$ — два базовых сигнала DSP.
- Любой сигнал — сумма сдвинутых импульсов; на этом строится теория свёртки.