Язык 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.
  • Любой сигнал — сумма сдвинутых импульсов; на этом строится теория свёртки.
Проверьте себя
1. В какой момент времени снят отсчёт x[n] при частоте дискретизации fs?
At = n
Bt = fs / n
Ct = n / fs
Dt = n * fs
2. Чему равна единичная импульсная функция delta[n]?
A1 для всех n
B1 при n=0 и 0 в остальных точках
C0 при n<0 и 1 при n≥0
Dn при любом n
3. Какой диапазон у нормированной частоты f/fs для полезных частот?
Aот 0 до 1
Bот 0 до 0.5
Cот 0 до fs
Dот -1 до 1
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →