Александр Иванов – Цифровая обработка сигналов на Python. От инженера к разработчику. (страница 6)
signal_power = np.mean(y ** 2)
snr = 10 * np.log10(signal_power / noise_power) if noise_power > 0 else float('inf')
print(f"{bits} бит: отношение сигнал/шум = {snr:.1f} дБ")
print("Файлы сохранены. Прослушайте и сравните качество.")
Прослушайте файлы. 16 бит звучит идеально чисто — это стандарт CD-качества. 12 бит — почти незаметная разница. 8 бит — слышно лёгкое шипение, особенно в паузах. 6 бит — шум становится неприятным, голос искажается. 4 бита — речь ещё можно разобрать, но качество ужасное, как через старую рацию.
Интересный факт: отношение сигнал/шум при квантовании можно оценить по простой формуле: примерно 6 децибел на каждый бит. 16 бит × 6 = 96 дБ — именно столько составляет динамический диапазон CD. 24 бита × 6 = 144 дБ — это уже больше, чем способно различить человеческое ухо. Именно поэтому 24-битная запись считается стандартом для профессиональной студийной работы: она даёт огромный запас по динамическому диапазону, позволяя записывать и очень тихие, и очень громкие звуки без риска клиппинга или потери деталей в шуме.
Связь дискретизации и квантования
Дискретизация и квантование работают вместе. Дискретизация решает, как часто мы измеряем сигнал во времени. Квантование решает, с какой точностью мы записываем каждое измерение. Вместе они определяют качество цифровой записи.
Стандартный аудиофайл формата WAV с параметрами 44 100 Гц, 16 бит, моно хранит 44 100 измерений в секунду, каждое из которых занимает 2 байта (16 бит = 2 байта). Одна минута такой записи занимает примерно 5 мегабайт. Час — около 300 мегабайт. Если использовать стерео вместо моно, размер удваивается. Если использовать 24 бита вместо 16 — увеличивается в полтора раза.
Форматы со сжатием, такие как MP3, используют психоакустические модели, чтобы уменьшить размер файла без заметной потери качества. Они выбрасывают частоты, которые человеческое ухо всё равно плохо слышит, особенно в присутствии более громких звуков на соседних частотах. Это называется маскировкой. Благодаря маскировке MP3 может быть в десять раз меньше WAV, но звучать почти так же. Однако для промежуточной обработки всегда лучше использовать несжатые форматы, потому что каждое пережатие MP3 добавляет новые артефакты.
Практический эксперимент: слышим ли мы разницу
Давайте проведём практический эксперимент, который закрепит всё, что мы узнали о дискретизации и квантовании. Мы возьмём одну и ту же запись, оцифруем её с разными параметрами и сравним.
python
def resample_audio(y, orig_sr, target_sr):
"""Передискретизирует аудио на новую частоту."""
duration = len(y) / orig_sr
new_length = int(duration * target_sr)
t_old = np.linspace(0, duration, len(y), endpoint=False)
t_new = np.linspace(0, duration, new_length, endpoint=False)
y_new = np.interp(t_new, t_old, y)
return y_new, target_sr
# Загружаем качественную запись
y, sr = librosa.load('voice_sample.wav', sr=44100)
print(f"Исходный файл: {sr} Гц, {len(y) / sr:.1f} сек")
# Варианты обработки
configs = [
{'label': 'CD качество', 'target_sr': 44100, 'bits': 16},
{'label': 'Подкаст', 'target_sr': 22050, 'bits': 16},
{'label': 'Телефон', 'target_sr': 8000, 'bits': 8},
{'label': 'Рация', 'target_sr': 8000, 'bits': 4},
{'label': 'Алиасинг (без фильтра)', 'target_sr': 8000, 'bits': 16, 'no_filter': True},
]
for cfg in configs:
y_resampled, new_sr = resample_audio(y, sr, cfg['target_sr'])
# Для варианта с алиасингом не применяем антиалиасинговый фильтр
if not cfg.get('no_filter'):
y_resampled = anti_alias_filter(y_resampled, new_sr)
y_quantized = quantize(y_resampled, cfg['bits'])
filename = f"experiment_{cfg['label'].replace(' ', '_')}.wav"
sf.write(filename, y_quantized, new_sr)
print(f"Создан: {cfg['label']} -> {filename}")
print("\nПрослушайте все файлы и обратите внимание:")
print("- Как меняется качество с уменьшением частоты дискретизации")
print("- Как появляется шум при уменьшении разрядности")
print("- Как алиасинг искажает высокие частоты")
Этот код создаёт пять версий одного и того же аудио. Первая версия — эталонная, CD-качество. Вторая — качество подкаста, половина частоты дискретизации, но 16 бит. Третья — телефонное качество, 8 000 Гц и 8 бит. Четвёртая — качество рации, 8 000 Гц и всего 4 бита. Пятая — умышленно испорченная версия: низкая частота дискретизации без антиалиасингового фильтра. Прослушайте все пять и обратите внимание на характер искажений в каждом случае.
За кулисами: история теоремы Найквиста
Гарри Найквист работал в компании Bell Labs в 1920-х годах. Он занимался проблемой передачи телеграфных сигналов по проводам и обнаружил, что для точной передачи сигнала нужно делать измерения с частотой как минимум вдвое выше, чем самая высокая частота в сигнале. Его работа 1928 года «Certain Topics in Telegraph Transmission Theory» заложила основу для всей цифровой связи.
Клод Шеннон, также работавший в Bell Labs, в 1948 году опубликовал знаменитую работу «A Mathematical Theory of Communication», в которой обобщил и строго доказал результаты Найквиста. Теорема стала называться теоремой Найквиста-Шеннона. Шеннон пошёл дальше и показал, что теорема верна не только для телеграфных сигналов, но и для любых сигналов, включая звук. Эта работа стала фундаментом теории информации и сделала возможной цифровую революцию.
Интересно, что сам Найквист не думал о звуке, когда формулировал свою теорему. Он думал о точках и тире в телеграфных линиях. Но математика оказалась универсальной. Теорема, придуманная для передачи сообщений азбукой Морзе, сегодня обеспечивает работу всего цифрового аудио — от телефонных звонков до стриминговых сервисов.
Лаборатория ошибок
После передискретизации звук стал глухим, без высоких частот. Вы использовали слишком низкую частоту дискретизации и не применили антиалиасинговый фильтр. Высокие частоты отразились и превратились в шум. Всегда применяйте фильтр нижних частот с частотой среза чуть ниже частоты Найквиста перед понижением частоты дискретизации.
После квантования в паузах слышно шипение. Это шум квантования. Вы использовали слишком мало бит. Для чистой записи нужно минимум 16 бит. Если вы работаете с 8-битным аудио — например, из старой игры или архивной записи, — примените шумоподавление после квантования, чтобы убрать шипение в паузах.
Файл после обработки стал занимать неожиданно много места. Проверьте параметры сохранения. Возможно, вы сохранили 8-битный файл с 16-битным заголовком или наоборот. Библиотека soundfile по умолчанию сохраняет WAV с теми параметрами, которые вы указали при создании массива, но лучше явно указывать разрядность.
При попытке загрузить файл с нестандартной частотой дискретизации библиотека выдаёт ошибку или предупреждение. Некоторые библиотеки ожидают только стандартные частоты: 8 000, 11 025, 16 000, 22 050, 44 100, 48 000, 96 000 Гц. Если вы создали файл с нестандартной частотой, некоторые плееры могут отказаться его проигрывать. Придерживайтесь стандартных значений.
Алиасинг не всегда звучит плохо. В некоторых музыкальных жанрах алиасинг используют как творческий эффект — например, в чиптюне и lo-fi музыке. Но для речи и большинства видов контента алиасинг нежелателен. Если вы слышите странные свистящие или звенящие призвуки, которых не было в оригинале, — проверьте частоту дискретизации.
Творческое задание
Запишите свой голос с частотой 44 100 Гц и 16 бит. Затем создайте версии с разными параметрами: 22 050 Гц, 16 бит; 8 000 Гц, 16 бит; 8 000 Гц, 8 бит. Найдите минимальные параметры, при которых ваш голос остаётся разборчивым и приятным на слух. Это знание пригодится, когда нужно будет экономить место или передавать аудио по медленному каналу.
Проведите слепой тест. Дайте другу или коллеге прослушать несколько версий одной записи с разными параметрами дискретизации и квантования. Попросите оценить качество по шкале от 1 до 5. Постройте график зависимости оценки от частоты дискретизации и разрядности. На каком уровне параметров качество перестаёт улучшаться? Это ваш личный порог чувствительности к цифровым артефактам.
Сгенерируйте сигнал с частотой, плавно возрастающей от 1 000 до 30 000 Гц. Оцифруйте его с частотой 44 100 Гц без антиалиасингового фильтра и прослушайте. Вы услышите, как тон сначала повышается, а потом, после пересечения частоты Найквиста, начинает понижаться и уходит вниз. Это классическая демонстрация алиасинга, которая даёт интуитивное понимание эффекта.
В следующей главе мы познакомимся с преобразованием Фурье — главным инструментом анализа звука. Мы узнаем, почему любой звук можно разложить на сумму простых синусоид, и проверим это утверждение кодом. Мы напишем наивное дискретное преобразование Фурье с нуля — оно будет работать правильно, но очень медленно. Мы поймём, почему медленно, и это понимание подготовит нас к третьей главе, где мы ускорим алгоритм в сотни раз с помощью быстрого преобразования Фурье.
Глава 2. Синусоиды, из которых состоит всё
О чём эта глава
В предыдущей главе мы разобрались с тем, как звук становится цифровым. Мы узнали, что микрофон превращает колебания воздуха в электрический сигнал, а аналого-цифровой преобразователь измеряет этот сигнал много тысяч раз в секунду, создавая массив чисел. Но мы пока не ответили на главный вопрос: что с этими числами делать дальше? Как из последовательности измерений громкости понять, какой перед нами звук — голос, музыка, шум ветра или тишина? Как отличить высокий тон от низкого, если оба записаны в виде чисел?