Теорема Котельникова и частота Найквиста
Главное правило оцифровки: сколько отсчётов нужно, чтобы ничего не потерять.
Теорема Котельникова (на Западе — Найквиста-Шеннона): сигнал с максимальной частотой
fmaxполностью восстанавливается из отсчётов, если частота дискретизацииfs > 2*fmax.
Это краеугольный камень всей цифровой обработки. Он отвечает на вопрос «не теряем ли мы информацию, заменяя линию точками?». Ответ: при соблюдении условия — не теряем, отсчёты содержат сигнал целиком и точно.
Почему именно вдвое
Чтобы распознать колебание, на один его период нужно хотя бы две точки: одна на «горб», одна на «впадину». Если точек меньше двух за период — мы не отличим эту частоту от более низкой. Граничная частота fs/2 называется частотой Найквиста: это самая высокая частота, которую данная fs ещё способна корректно представить.
Период синуса и минимум точек на него:
2 точки/период (минимум по Котельникову):
o o o
\ / \ /
\ / \ /
o o o o
1 точка/период (нарушение — частота потеряна):
o o o o o
все на одной высоте — колебание "исчезло"
Считаем минимальную частоту дискретизации
def min_fs(fmax):
return 2 * fmax # нижняя граница по Котельникову
signals = [
("Речь по телефону", 3400),
("Музыка (слух)", 20000),
("ЭКГ", 150),
("FM-радио (звук)", 15000),
]
for name, fmax in signals:
print(f"{name:<20} fmax={fmax:>6} Гц -> fs > {min_fs(fmax)} Гц")
Вывод:
Речь по телефону fmax= 3400 Гц -> fs > 6800 Гц Музыка (слух) fmax= 20000 Гц -> fs > 40000 Гц ЭКГ fmax= 150 Гц -> fs > 300 Гц FM-радио (звук) fmax= 15000 Гц -> fs > 30000 Гц
На практике берут с запасом: для аудио не 40 кГц, а 44.1, чтобы антиалиасинговый фильтр успел плавно срезать частоты возле границы.
Восстановление: отсчёты содержат всё
Теорема не только говорит «можно дискретизировать», но и даёт формулу восстановления непрерывного сигнала из отсчётов через функции sinc. Проверим идею на простом случае: сигнал из двух тонов ниже Найквиста точно представляется отсчётами, а его значения между отсчётами однозначно определены.
import math
fs = 20.0 # частота дискретизации
f1, f2 = 2.0, 5.0 # обе частоты ниже fs/2 = 10 Гц -> условие выполнено
def signal(t):
return math.sin(2 * math.pi * f1 * t) + 0.5 * math.sin(2 * math.pi * f2 * t)
# Отсчёты
samples = [round(signal(n / fs), 3) for n in range(10)]
print("Частота Найквиста:", fs / 2, "Гц")
print("Максимальная частота сигнала:", f2, "Гц -> условие fs>2*fmax:", fs > 2 * f2)
print("Отсчёты:", samples)
Вывод:
Частота Найквиста: 10.0 Гц Максимальная частота сигнала: 5.0 Гц -> условие fs>2*fmax: True Отсчёты: [0.0, 1.088, 0.951, 0.451, 0.588, 0.5, -0.588, -1.451, -0.951, -0.088]
Как работает под капотом
Вспомним: дискретизация копирует спектр с шагом fs. Если весь спектр сигнала лежит ниже fs/2, соседние копии не перекрываются — между ними есть «зазор». Тогда идеальный ФНЧ с границей fs/2 вырежет ровно одну исходную копию и восстановит сигнал. Если же сигнал содержит частоты выше fs/2, копии налезут друг на друга, зазора нет, и никакой фильтр уже не разделит перемешанное. Вот геометрический смысл «вдвое»: нужен зазор между копиями спектра, а он появляется ровно при fs > 2*fmax.
Частые ошибки
- Считать, что
fs = 2*fmaxдостаточно ровно. Теорема требует строгого неравенстваfs > 2*fmax; на самой границе синус, попавший узлами в нули, теряется. - Брать
fmaxкак «частоту голоса», забыв про шум. Если на входе есть высокочастотный шум вышеfs/2, он тоже наложится — отсюда необходимость антиалиасингового фильтра. - Думать, что отсчёты — «приближение». При выполненном условии они содержат сигнал точно, без потерь.
Итог
- Теорема Котельникова:
fs > 2*fmaxгарантирует точное восстановление сигнала из отсчётов. - Частота Найквиста
fs/2— верхняя граница корректно представимых частот. - Минимум две точки на период — иначе колебание не распознать.
- Геометрически условие даёт зазор между копиями спектра, который и позволяет восстановить оригинал.