Язык 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.
  • Любой сигнал — сумма сдвинутых импульсов; на этом строится теория свёртки.
Проверьте себя
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&lt;0 и 1 при n≥0
Dn при любом n
3. Какой диапазон у нормированной частоты f/fs для полезных частот?
Aот 0 до 1
Bот 0 до 0.5
Cот 0 до fs
Dот -1 до 1