Семплинг и реконструкция на практике

Замыкаем цепочку оцифровки: как из отсчётов собрать обратно непрерывный сигнал и не испортить его.

Реконструкция — восстановление непрерывного сигнала из отсчётов. Теорема Котельникова гарантирует точность через идеальный sinc-фильтр; на практике используют приближения и восстанавливающий ФНЧ.

Мы много говорили про путь «аналог → цифра». Но звук из колонок, изображение на экране, сигнал на антенне — это путь обратно: «цифра → аналог», которым занимается ЦАП. И здесь свои тонкости: наивное восстановление вносит искажения, а правильное требует восстанавливающего фильтра. Разберём, как из списка чисел получить гладкий сигнал.

Ступенчатое восстановление (ZOH)

Самый простой способ ЦАП: держать каждое значение до следующего отсчёта — фиксация нулевого порядка (Zero-Order Hold, ZOH). Получаются «ступеньки». Просто, но грубо: ступеньки содержат лишние высокие частоты.

def zero_order_hold(samples, factor):
    out = []
    for v in samples:
        out.extend([v] * factor)      # повторяем каждое значение
    return out

samples = [0.0, 1.0, 0.0, -1.0]
print("Отсчёты:    ", samples)
print("ZOH (x2):   ", zero_order_hold(samples, 2))

Вывод:

Отсчёты:     [0.0, 1.0, 0.0, -1.0]
ZOH (x2):    [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, -1.0, -1.0]

Каждое значение продержалось два шага — вышла «лесенка». Угловатость лесенки — это паразитные высокие частоты, которые потом убирает аналоговый фильтр.

Линейная интерполяция: глаже

Лучше соединять отсчёты прямыми линиями — линейная интерполяция (фиксация первого порядка). Промежуточные точки считаются как взвешенное среднее соседей.

def linear_interp(samples, factor):
    out = []
    for i in range(len(samples) - 1):
        for f in range(factor):
            t = f / factor
            out.append(round(samples[i] * (1 - t) + samples[i + 1] * t, 3))
    out.append(samples[-1])
    return out

samples = [0.0, 1.0, 0.0, -1.0]
print("Линейная (x2):", linear_interp(samples, 2))

Вывод:

Линейная (x2): [0.0, 0.5, 1.0, 0.5, 0.0, -0.5, -1.0]

Между отсчётами появились промежуточные значения (0.5, -0.5) — переходы стали плавнее, чем ступеньки ZOH. Линейная интерполяция ближе к истинной кривой, хотя углы на самих отсчётах остаются.

Восстанавливающий фильтр

По теореме Котельникова идеальное восстановление даёт sinc-интерполяция: каждый отсчёт «размазывается» функцией sinc, и их сумма точно воспроизводит исходный сигнал (если он был ниже Найквиста). Идеальный sinc бесконечен и нереализуем, поэтому на выходе ЦАП ставят аналоговый ФНЧ — восстанавливающий (reconstruction) фильтр. Он сглаживает ступеньки ZOH, убирая паразитные высокочастотные «образы» и оставляя гладкий сигнал. По сути это близнец антиалиасингового фильтра, только на выходе, а не на входе.

Передискретизация: облегчаем аналог

Современные ЦАП используют передискретизацию (oversampling): цифровой сигнал сначала повышают по частоте в несколько раз (вставляя интерполированные отсчёты цифровым фильтром), и лишь потом подают на простой аналоговый ФНЧ. Зачем? Чем выше частота дискретизации, тем дальше паразитные образы отодвигаются от полезной полосы, тем мягче (дешевле и качественнее) может быть аналоговый фильтр. Так аудио-ЦАП работают на 4×, 8×, 128× частоте, перенося основную работу с «дорогого» аналога на «дешёвую» цифру.

Как работает под капотом

Почему ступеньки ZOH портят сигнал? В частотной области ZOH — это умножение спектра на sinc-образную АЧХ, которая слегка «заваливает» верх полезной полосы и пропускает образы спектра вокруг частот, кратных fs. Восстанавливающий ФНЧ срезает эти образы, но завал в полосе остаётся — его компенсируют цифровым корректором (inverse-sinc). Вся цепочка «АЦП → обработка → ЦАП» симметрична: на входе антиалиасинговый фильтр и дискретизация, на выходе — реконструкция и восстанавливающий фильтр. Понимая обе стороны, вы видите полный путь сигнала через цифровую систему.

Частые ошибки

  • Забыть восстанавливающий фильтр. Без него ступеньки ЦАП дадут слышимые/видимые высокочастотные артефакты (образы спектра).
  • Считать ZOH «точным». Ступенчатое восстановление вносит завал АЧХ и паразитные образы; это приближение, а не идеал.
  • Реконструировать сигнал, нарушавший Котельникова. Если при оцифровке был алиасинг, никакая реконструкция не вернёт оригинал.

Итог

  • Реконструкция восстанавливает непрерывный сигнал из отсчётов (работа ЦАП).
  • ZOH даёт грубые ступеньки; линейная интерполяция — глаже; идеал — sinc.
  • На выходе ЦАП стоит восстанавливающий ФНЧ, убирающий образы спектра.
  • Передискретизация переносит работу с аналогового фильтра на цифровой.
Проверьте себя
1. Что такое фиксация нулевого порядка (ZOH) при восстановлении?
AИдеальное sinc-восстановление
BУдержание каждого отсчёта до следующего — «ступеньки»
CЛинейное соединение отсчётов
DУдаление каждого второго отсчёта
2. Зачем на выходе ЦАП ставят восстанавливающий фильтр (ФНЧ)?
AЧтобы усилить сигнал
BЧтобы сгладить ступеньки и убрать паразитные высокочастотные образы спектра
CЧтобы добавить шум
DОн не нужен
3. Чем полезна передискретизация (oversampling) в ЦАП?
AУменьшает объём данных
BОтодвигает паразитные образы дальше, позволяя использовать более простой аналоговый фильтр
CУбирает необходимость в ЦАП
DПовышает разрядность автоматически