Дискретизация по времени
Первый шаг оцифровки: как из непрерывной линии получают список чисел и какую роль играет частота дискретизации.
Дискретизация (sampling) — снятие значений непрерывного сигнала через равные интервалы времени; результат — последовательность отсчётов
x[n] = x(n/fs).
Компьютер не умеет хранить непрерывную линию — у него конечная память. Поэтому АЦП «фотографирует» сигнал через равные промежутки: измерил, записал число, подождал, снова измерил. Эти моменты задаёт частота дискретизации.
Частота и период дискретизации
Частота дискретизации fs — сколько отсчётов в секунду. Период дискретизации Ts = 1/fs — промежуток между соседними отсчётами. При fs = 44100 Гц (стандарт CD) отсчёты идут каждые 1/44100 ≈ 22.7 микросекунды.
| Применение | fs, Гц | Почему так |
| Телефония | 8000 | речь до ~3.4 кГц, хватает разборчивости |
| Аудио CD | 44100 | слух до ~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.