Дискретизация по времени

Первый шаг оцифровки: как из непрерывной линии получают список чисел и какую роль играет частота дискретизации.

Дискретизация (sampling) — снятие значений непрерывного сигнала через равные интервалы времени; результат — последовательность отсчётов x[n] = x(n/fs).

Компьютер не умеет хранить непрерывную линию — у него конечная память. Поэтому АЦП «фотографирует» сигнал через равные промежутки: измерил, записал число, подождал, снова измерил. Эти моменты задаёт частота дискретизации.

Частота и период дискретизации

Частота дискретизации fs — сколько отсчётов в секунду. Период дискретизации Ts = 1/fs — промежуток между соседними отсчётами. При fs = 44100 Гц (стандарт CD) отсчёты идут каждые 1/44100 ≈ 22.7 микросекунды.

Применениеfs, ГцПочему так
Телефония8000речь до ~3.4 кГц, хватает разборчивости
Аудио CD44100слух до ~20 кГц, нужен запас по Найквисту
Студийная запись48000 / 96000запас для обработки
ЭКГ250 .. 1000полезные частоты сердца до ~150 Гц

Дискретизируем синусоиду

Возьмём аналоговый тон 50 Гц и «снимем» его с частотой 1000 Гц. Получим список отсчётов — ровно то, что увидит DSP.

import math

f = 50.0      # частота тона, Гц
fs = 1000.0   # частота дискретизации, Гц
duration = 0.02  # 20 мс = один период тона

N = int(duration * fs)         # число отсчётов
samples = [round(math.sin(2 * math.pi * f * n / fs), 3) for n in range(N)]

print(f"Период дискретизации Ts = {1/fs*1000:.2f} мс")
print(f"Снято отсчётов: {N}")
print("Отсчёты:", samples)

Вывод:

Период дискретизации Ts = 1.00 мс
Снято отсчётов: 20
Отсчёты: [0.0, 0.309, 0.588, 0.809, 0.951, 1.0, 0.951, 0.809, 0.588, 0.309, -0.0, -0.309, -0.588, -0.809, -0.951, -1.0, -0.951, -0.809, -0.588, -0.309]

20 отсчётов на один период — синусоида читается прекрасно. На графике-столбиках это видно нагляднее.

import math

fs, f = 16.0, 1.0
samples = [math.sin(2 * math.pi * f * n / fs) for n in range(16)]
for v in samples:
    bar = "#" * int(round((v + 1) * 12))   # сдвигаем в 0..24
    print(f"{v:+.2f} | {bar}")

Вывод:

+0.00 | ############
+0.38 | #################
+0.71 | ####################
+0.92 | #######################
+1.00 | ########################
+0.92 | #######################
+0.71 | ####################
+0.38 | #################
+0.00 | ############
-0.38 | #######
-0.71 | ####
-0.92 | #
-1.00 | 
-0.92 | #
-0.71 | ####
-0.38 | #######

Каждый столбик — длина пропорциональна амплитуде отсчёта; «качель» вверх-вниз — это и есть синусоида во времени.

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

Внутри дискретизация — это умножение сигнала на «гребёнку Дирака»: последовательность бесконечно узких импульсов через каждые Ts. Результат — отсчёты в моменты n*Ts. У этого умножения во временной области есть зеркальное последствие в частотной: спектр сигнала копируется и повторяется вдоль оси частот с шагом fs. Эти копии и есть корень будущей проблемы алиасинга: если копии перекроются, восстановить исходник нельзя. Поэтому перед АЦП ставят аналоговый антиалиасинговый фильтр — он срезает всё выше fs/2 ещё до оцифровки.

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

  • Снимать слишком редко. Если fs меньше двойной максимальной частоты сигнала, форма теряется безвозвратно (алиасинг — отдельный урок).
  • Снимать слишком часто без нужды. Завышенная fs раздувает объём данных и нагрузку, не добавляя информации сверх предела Найквиста.
  • Забывать антиалиасинговый фильтр. Без него высокие частоты и шум «сложатся» в полезный диапазон и испортят сигнал.

Итог

  • Дискретизация — снятие отсчётов через равные интервалы Ts = 1/fs.
  • fs выбирают под максимальную частоту сигнала; стандарты: 8 кГц речь, 44.1 кГц аудио.
  • Дискретизация копирует спектр с шагом fs; перекрытие копий — это алиасинг.
  • Перед АЦП ставят антиалиасинговый фильтр, срезающий частоты выше fs/2.
Проверьте себя
1. Что такое период дискретизации Ts?
AПолная длительность записи
BВремя между соседними отсчётами, равное 1/fs
CЧисло отсчётов в секунду
DМаксимальная частота сигнала
2. Почему для аудио-CD выбрали fs = 44100 Гц?
AЭто максимум, который умеет процессор
BСлух воспринимает примерно до 20 кГц, и нужен запас выше двойного значения
CЧтобы файлы были меньше
DСлучайное историческое число без причины
3. Зачем перед АЦП ставят антиалиасинговый фильтр?
AЧтобы усилить сигнал
BЧтобы срезать частоты выше fs/2 до оцифровки и избежать наложения спектров
CЧтобы добавить шум
DОн не нужен