Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Частота дискретизации (Sampling Rate): Полное объяснение
Частота дискретизации (Sampling Rate или Sample Rate) — это количество раз в секунду, с которой непрерывный аналоговый сигнал берётся (измеряется) и преобразуется в цифровой сигнал. Это фундаментальный концепт в цифровой обработке сигналов, аудиотехнике и машинном обучении при работе с временными рядами и аудиоданными.
Единицы измерения
Частота дискретизации измеряется в герцах (Герц, Hz) или килогерцах (кГц, kHz):
- 1 Hz = 1 отсчёт в секунду
- 1 kHz = 1000 отсчётов в секунду
Если частота дискретизации 44100 Hz, это означает, что сигнал измеряется 44100 раз в секунду.
Теорема Найквиста-Шеннона
Фундаментальное правило в цифровой обработке сигналов:
Частота дискретизации должна быть минимум в два раза больше максимальной частоты сигнала (граничной частоты).
fs >= 2 * fmax
Где:
- fs — частота дискретизации
- fmax — максимальная частота в сигнале
Примеры:
- Человеческий слух воспринимает звуки от 20 Hz до 20000 Hz, поэтому для аудио нужна частота дискретизации минимум 40000 Hz (обычно 44100 или 48000 Hz)
- Телефонный сигнал ограничен 4000 Hz, поэтому используется 8000 Hz дискретизации
Стандартные частоты дискретизации
Применение Частота дискретизации
─────────────────────────────────────────────
Телефон 8 kHz
Видео (24-25fps) 25-30 Hz
Аудио (низкое качество) 22.05 kHz
Аудио (CD) 44.1 kHz
Аудио (профессиональное) 48 kHz
Аудио (студийное) 96 kHz
Аудио (мастеринг) 192 kHz
Медицина (ЭКГ) 100-500 Hz
Практические примеры на Python
Работа с аудиофайлами
import librosa
import numpy as np
import soundfile as sf
from scipy import signal
# Загрузка аудиофайла
audio_path = 'example.wav'
y, sr = librosa.load(audio_path) # y - сигнал, sr - частота дискретизации
print(f"Частота дискретизации: {sr} Hz")
print(f"Длительность аудио: {len(y) / sr:.2f} сек")
print(f"Количество отсчётов: {len(y)}")
# Создание синусоидального сигнала
duration = 2 # секунды
sr = 44100 # Hz
freq = 440 # Hz (нота A4)
t = np.linspace(0, duration, int(sr * duration), endpoint=False)
y = np.sin(2 * np.pi * freq * t)
# Сохранение аудиофайла
sf.write('output.wav', y, sr)
Перевыборка (Resampling)
Изменение частоты дискретизации:
import librosa
# Загрузить с исходной частотой
y, sr = librosa.load('audio.wav', sr=None) # sr=None загружает с исходной частотой
print(f"Исходная частота: {sr} Hz")
# Перевыборка на новую частоту
sr_new = 22050 # уменьшение с 44100 на 22050
y_resampled = librosa.resample(y, orig_sr=sr, target_sr=sr_new)
print(f"Новая частота: {sr_new} Hz")
print(f"Новое количество отсчётов: {len(y_resampled)}")
Эффект недостаточной дискретизации (Aliasing)
Когда частота сигнала превышает частоту Найквиста, возникает aliasing:
import matplotlib.pyplot as plt
import numpy as np
sr = 1000 # Hz (частота Найквиста = 500 Hz)
freq = 600 # Hz (выше частоты Найквиста!)
t = np.linspace(0, 1, sr, endpoint=False)
# Исходный непрерывный сигнал (высокочастотный)
t_continuous = np.linspace(0, 1, 10000)
y_continuous = np.sin(2 * np.pi * freq * t_continuous)
# Дискретизированный сигнал
y_sampled = np.sin(2 * np.pi * freq * t)
plt.figure(figsize=(12, 4))
plt.plot(t_continuous, y_continuous, label='Исходный сигнал', alpha=0.7)
plt.scatter(t[:100], y_sampled[:100], color='red', label='Отсчёты (aliased)', zorder=5)
plt.xlabel('Время (сек)')
plt.ylabel('Амплитуда')
plt.title(f'Aliasing: сигнал {freq}Hz дискретизирован на {sr}Hz')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Взаимосвязь параметров
Разрешение времени
sr = 44100 # Hz
duration = 10 # секунды
total_samples = sr * duration
time_resolution = 1 / sr # секунды между отсчётами
print(f"Разрешение по времени: {time_resolution * 1000:.4f} мс")
print(f"Всего отсчётов в {duration} сек: {total_samples}")
Чем выше частота дискретизации, тем выше разрешение по времени.
Объём данных
sr = 44100 # Hz (CD качество)
bits_per_sample = 16 # бит (обычно 16 или 24)
channels = 2 # стерео
duration = 3600 # 1 час
bytes_per_second = (sr * bits_per_sample * channels) // 8
file_size_mb = (bytes_per_second * duration) / (1024 * 1024)
print(f"Размер файла 1 часа аудио: {file_size_mb:.1f} МБ")
Временные ряды в машинном обучении
Для работы с временными рядами важно правильно выбрать частоту дискретизации:
import pandas as pd
# Загрузка временного ряда
df = pd.read_csv('timeseries.csv', parse_dates=['timestamp'])
df.set_index('timestamp', inplace=True)
# Проверка частоты дискретизации
inferred_freq = pd.infer_freq(df.index)
print(f"Инфер информированная частота: {inferred_freq}")
# Переиндексирование на новую частоту
df_resampled = df.resample('1H').mean() # Агрегация по часам
# Интерполяция недостающих значений
df_interpolated = df.resample('1T').interpolate() # На 1 минуту
Влияние на качество
Высокая частота дискретизации (плюсы):
- Более точное воспроизведение высокочастотных компонентов
- Лучше предотвращает aliasing
- Лучше работает для критичных приложений
Высокая частота дискретизации (минусы):
- Больше данных → больше памяти и вычислений
- Медленнее обработка
- Более требовательна к вычислительным ресурсам
Низкая частота дискретизации (плюсы):
- Меньше данных → быстрее обработка
- Экономия памяти и пропускной способности
Низкая частота дискретизации (минусы):
- Риск потери информации
- Aliasing артефакты
- Ниже качество
Практический выбор частоты
def recommend_sampling_rate(max_frequency):
"""
Рекомендовать частоту дискретизации
на основе максимальной частоты сигнала
"""
nyquist_rate = 2 * max_frequency
# На практике используем ~1.1x от Найквиста для margin
recommended_rate = nyquist_rate * 1.1
return recommended_rate
# Пример
max_freq = 10000 # Hz
recommended = recommend_sampling_rate(max_freq)
print(f"Рекомендуемая частота для сигнала до {max_freq}Hz: {recommended:,.0f}Hz")
Частота дискретизации — критический параметр, определяющий качество и объём цифровых данных. Правильный выбор баланса между точностью и производительностью является ключом к успешной обработке сигналов и анализу данных.