Семплинг и реконструкция на практике
Замыкаем цепочку оцифровки: как из отсчётов собрать обратно непрерывный сигнал и не испортить его.
Реконструкция — восстановление непрерывного сигнала из отсчётов. Теорема Котельникова гарантирует точность через идеальный
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.
- На выходе ЦАП стоит восстанавливающий ФНЧ, убирающий образы спектра.
- Передискретизация переносит работу с аналогового фильтра на цифровой.