Ответ
Частота дискретизации (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()
Видишь? На верхнем графике — красота, точки часто, волна читается. На нижнем — ёпта, точек три штуки, и если по ним восстанавливать, получится какая-то пологая хрень, а не исходная синусоида. Вот это и есть алиасинг в чистом виде. Волнение ебать, когда понимаешь, сколько музыки в своё время запороли из-за незнания этой простой хуйни. Так что, чувак, запомни: хочешь качественный звук — щёлкай часто, и будет тебе хиросима.