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

«Что такое частота дискретизации?» — вопрос из категории Предобработка данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Частота дискретизации (sample rate) — это количество отсчетов (сэмплов) аналогового сигнала, взятых за одну секунду для его преобразования в цифровую форму. Измеряется в герцах (Гц).

Ключевые концепции:

  • Теорема Котельникова-Найквиста: Для точного восстановления сигнала частота дискретизации (f_s) должна быть как минимум вдвое выше максимальной частоты (f_max) в спектре сигнала: f_s > 2 * f_max. Частота f_max называется частотой Найквиста.
  • Алиасинг (наложение спектров): Если условие теоремы нарушено, высокочастотные компоненты сигнала «маскируются» под низкочастотные, искажая цифровую запись. Для борьбы с этим перед дискретизацией применяют антиалиасинговый фильтр.

Практические примеры:

  • Аудио CD: 44.1 кГц (захватывает звуки до ~22.05 кГц, что чуть выше предела слуха человека).
  • Высококачественный звук: 48 кГц, 96 кГц.
  • Телефонная связь: 8 кГц (речь в полосе до 3.4 кГц).

Визуализация на Python:

import numpy as np
import matplotlib.pyplot as plt

# Параметры исходного аналогового сигнала (1 Гц)
f_signal = 1.0  # Гц
T = 2.0         # Длительность в секундах

# 1. Дискретизация с высокой частотой (10 Гц) - хорошая
fs_high = 10.0
t_high = np.arange(0, T, 1/fs_high)
signal_high = np.sin(2 * np.pi * f_signal * t_high)

# 2. Дискретизация с низкой частотой (1.5 Гц) - алиасинг!
fs_low = 1.5
t_low = np.arange(0, T, 1/fs_low)
signal_low = np.sin(2 * np.pi * f_signal * t_low)

# Построение графиков
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))

# Исходный сигнал (непрерывный)
t_cont = np.linspace(0, T, 1000)
signal_cont = np.sin(2 * np.pi * f_signal * t_cont)
ax1.plot(t_cont, signal_cont, 'g-', alpha=0.5, label='Аналоговый сигнал (1 Гц)')
ax1.stem(t_high, signal_high, linefmt='b-', markerfmt='bo', basefmt=' ', label=f'Сэмплы (fs={fs_high} Гц)')
ax1.set_title('Корректная дискретизация (fs > 2 * f_signal)')
ax1.legend()

ax2.plot(t_cont, signal_cont, 'g-', alpha=0.5, label='Аналоговый сигнал (1 Гц)')
ax2.stem(t_low, signal_low, linefmt='r-', markerfmt='ro', basefmt=' ', label=f'Сэмплы (fs={fs_low} Гц) -> Алиасинг!')
ax2.set_title('Некорректная дискретизация (fs < 2 * f_signal)')
ax2.legend()

plt.tight_layout()
plt.show()