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

Ответ

Частота дискретизации (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()

Ответ 18+ 🔞

Э, слушай, давай разберем эту тему про частоту дискретизации, а то многие её понимают как кот сука собака. Всё просто, если по-человечьи.

Представь, что ты пытаешься нарисовать волну на песке, но вместо плавной линии ты можешь ставить только точки. Частота дискретизации — это просто скорость, с которой ты эти точки ставишь. Сколько точек в секунду — столько и герц. Если ставить редко, получится какая-то хуйня, а не волна.

А теперь главное правило, без которого нихуя не получится — теорема Котельникова-Найквиста. Суть её проще пареной репы: чтобы поймать звук определённой высоты, ты должен щёлкать его (ставить точки) как минимум в два раза чаще, чем он пищит. Если сигнал пилит до 20 000 Гц, то щёлкать надо быстрее 40 000 раз в секунду. Иначе начнётся алиасинг — этакая акустическая галлюцинация, когда высокие ноты начинают прикидываться низкими, и в итоге запись превращается в цифровое месиво. Чтобы этого не было, перед тем как щёлкать, сигнал пропускают через антиалиасинговый фильтр — он как швейцар на входе в клуб, отсекает всех, кто выше определённой частоты (частоты Найквиста).

Где что применяется:

  • Аудио CD: 44.1 кГц. Это овердохуища для уха, ловит всё до 22 кГц, а дальше уже слышат только собаки да аудиофилы с воображением.
  • Кино и студия: 48 кГц, 96 кГц — тут уже разгул, места много.
  • Телефон: 8 кГц. Там речь, ей много не надо, главное, чтобы понятно было «Алло» и «Где деньги?». Получается эдакий полупидор от полноценного звука, но для своего дела сойдёт.

А вот смотри, сейчас будет наглядная хрень на 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()

Видишь? На верхнем графике — красота, точки часто, волна читается. На нижнем — ёпта, точек три штуки, и если по ним восстанавливать, получится какая-то пологая хрень, а не исходная синусоида. Вот это и есть алиасинг в чистом виде. Волнение ебать, когда понимаешь, сколько музыки в своё время запороли из-за незнания этой простой хуйни. Так что, чувак, запомни: хочешь качественный звук — щёлкай часто, и будет тебе хиросима.