Язык DSP: обозначения и термины
Осваиваем словарь DSP, чтобы дальше формулы и код читались без запинки.
Частота дискретизации
fs— сколько отсчётов в секунду снимает АЦП; измеряется в герцах (Гц) или отсчётах/с (sps).
У каждой инженерной области свой язык. В DSP десяток ключевых обозначений, и если их освоить сразу, дальше всё пойдёт легко. Этот урок — справочник, к которому стоит возвращаться.
Отсчёт, индекс, время
Сигнал в коде — список x, где x[n] — отсчёт с номером n. Если частота дискретизации fs, то отсчёт n снят в момент времени t = n / fs. Например, при fs = 44100 отсчёт №100 соответствует 100/44100 ≈ 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 / fs — доля от частоты дискретизации, всегда от 0 до 1. А ещё чаще пишут w = 2*pi*f/fs — угловую частоту в радианах на отсчёт. Диапазон полезных частот — от 0 до fs/2, что в нормированных единицах от 0 до 0.5, а в радианах от 0 до pi. Почему именно половина — узнаем из теоремы Котельникова.
| Единица | Диапазон | Смысл |
Гц (f) | 0 .. fs/2 | колебаний в секунду |
нормированная (f/fs) | 0 .. 0.5 | доля частоты дискретизации |
радианы/отсчёт (w) | 0 .. pi | фаза, набегающая за отсчёт |
Два кирпичика: импульс и ступень
В DSP есть два эталонных сигнала, через которые выражают почти всё.
Единичный импульс delta[n] равен 1 при n = 0 и 0 во всех остальных точках. Это «укол» в нулевой момент. Реакция системы именно на него — её полная характеристика (импульсный отклик).
Единичная ступень u[n] равна 0 при n < 0 и 1 при n ≥ 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]
Импульс и ступень связаны: ступень — это накопленная сумма импульсов, а импульс — разность соседних значений ступени. Эта пара — основа описания систем.
Как работает под капотом
Зачем столько обозначений? Нормированная частота делает алгоритмы независимыми от fs: фильтр, спроектированный «убрать всё выше 0.25», работает и на 8 кГц, и на 48 кГц — меняется лишь реальная граница в герцах. Импульс важен потому, что любой дискретный сигнал — это сумма сдвинутых и масштабированных импульсов: x[n] = sum(x[k]*delta[n-k]). На этом простом факте держится вся теория линейных систем и свёртки, к которой мы придём в разделе 4.
Частые ошибки
- Забыть про
fsпри разговоре о частоте. «Частота 1000» бессмысленна безfs: 1000 Гц приfs=2000— это уже предел Найквиста. - Путать импульс и ступень. Импульс — один ненулевой отсчёт; ступень — «включилось и осталось».
- Считать, что нормированная частота больше 0.5 имеет смысл. Выше 0.5 начинается зеркальное отражение (алиасинг) — об этом отдельный урок.
Итог
- Отсчёт
x[n]снят в моментt = n/fs;fs— частота дискретизации в Гц. - Частоту удобно нормировать:
f/fs(0..0.5) илиw = 2*pi*f/fs(0..pi). - Единичный импульс
delta[n]и единичная ступеньu[n]— два базовых сигнала DSP. - Любой сигнал — сумма сдвинутых импульсов; на этом строится теория свёртки.