Цифровая обработка сигналов
Спектральный анализ: STFT, спектрограммы и MFCC
1964 год, Bell Labs. Инженеры впервые держат в руках распечатку: голос виден как двумерная карта - время слева направо, частота снизу вверх. Через 60 лет тот же принцип лежит в основе Shazam (70 млн треков, поиск за 5 секунд), Whisper, Google Speech-to-Text и Apple Siri. Спектрограмма - это язык, на котором нейросети слышат мир.
- **Shazam** хранит не аудио, а хеши пиков спектрограммы - паттерн из 5-10 точек уникален для каждого трека
- **OpenAI Whisper** принимает 80-канальный mel-log-спектрограмм - ровно то, что строится в этом уроке
- **Spotify** анализирует mel-спектрограммы для классификации жанра, tempos, инструментов в 100+ млн треков
- **Edge ASR** на микроконтроллерах (Arduino Nano 33 BLE) работает с 13 MFCC - 39 чисел на фрейм вместо сотен
STFT и оконные функции
**1964 год, Bell Labs.** Инженер впервые смотрит на распечатку: горизонтальная ось - время, вертикальная - частота, яркость точки - громкость. Это не осциллограф. Это не просто FFT. Голос человека впервые виден как двумерная картина - фонема за фонемой, слово за словом. Vocoder только что получил зрение.
Проблема FFT в том, что она глобальна. Подаёшь 3-секундный фрагмент - получаешь одну корзину частот для всего сигнала разом. Но музыкальная нота в начале и нота в конце - разные события. Глобальная FFT их смешивает.
STFT (Short-Time Fourier Transform) решает это грубо, но гениально: нарезать сигнал на короткие перекрывающиеся кусочки - **фреймы** - и запустить FFT отдельно на каждом. Формально:
Здесь $m$ - номер фрейма, $H$ - шаг (hop size), $w(n)$ - оконная функция. Результат $X(m, k)$ - двумерная матрица: строки - время (фреймы), столбцы - частоты.
Зачем нужны окна - и почему прямоугольник плохой выбор
Обрезать сигнал по краям фрейма без перехода - значит создать резкий скачок. Для FFT этот скачок выглядит как широкополосный шум. **Spectral leakage**: энергия одной частоты расползается по соседним корзинам.
Оконная функция Ханна плавно гасит края до нуля:
На практике берут окно 25 мс, шаг 10 мс, перекрытие 50-75%. Это стандарт Kaldi, Whisper, librosa. Не произвольный выбор - результат 60 лет экспериментов с речью.
**Компромисс разрешения (uncertainty principle):** длинное окно - хорошее частотное разрешение, плохое временное. Короткое - наоборот. Это не баг STFT. Это математическая необходимость: принцип неопределённости Гейзенберга работает не только в квантовой механике.
Что произойдёт, если убрать оконную функцию и просто обрезать фрейм прямоугольно?
Спектрограммы: звук как картинка
Shazam хранит не аудио. Shazam хранит **отпечатки спектрограмм**. Алгоритм за 5 секунд находит пики яркости на частотно-временной матрице, строит хеш из их паттерна - и ищет совпадение в базе на 70 млн треков. Нет спектрограмм - нет Shazam.
Спектрограмма - это просто модуль STFT в квадрате:
Матрица $S$ визуализируется как тепловая карта: горизонталь - время, вертикаль - частота, яркость - мощность. Гласные рисуют горизонтальные полосы (форманты), согласные - размытые вертикальные взрывы, нота на фортепиано - чёткий горизонтальный штрих.
Log-мощность: почему линейная шкала не работает
Динамический диапазон аудио - 60-120 дБ. Тихий шёпот и удар барабана отличаются в миллион раз по мощности. На линейной шкале весь голос превращается в тонкую полоску у нуля, а каждый пик перегрузки съедает весь экран.
Переход в дБ сжимает диапазон:
Маленькая $\epsilon$ (обычно 1e-10) защищает от $\log(0)$. Теперь 120 дБ разброса укладываются в удобную числовую шкалу. Именно так работает librosa.amplitude_to_db и torchaudio.transforms.AmplitudeToDB.
**Для нейросетей:** нормировать спектрограмму к диапазону [-1, 1] или z-score по всему датасету. Ненормированные спектрограммы - одна из топ-3 причин нестабильного обучения аудио-моделей.
Почему при визуализации спектрограммы используют логарифмическую шкалу мощности (дБ), а не линейную?
Mel-шкала и MFCC: как ухо слышит частоты
Человеческое ухо не линейно. Разница между 100 Гц и 200 Гц субъективно огромна. Разница между 8000 Гц и 8100 Гц - почти неслышима. Линейная частотная ось STFT тратит половину корзин на диапазон, где ухо практически слепо.
Mel-шкала сжимает высокие частоты и растягивает низкие, имитируя психоакустику улитки:
На практике строят банк треугольных фильтров равномерно распределённых по mel-шкале (обычно 40-128 фильтров) и применяют их к мощностному спектру. Результат - **mel-спектрограмма** с намного меньшей размерностью, зато выровненная под человеческое восприятие.
MFCC: 13 чисел вместо тысячи
Mel Frequency Cepstral Coefficients - стандарт распознавания речи с 1980-х по сей день. Получают их из mel-спектрограммы тремя шагами: логарифм, дискретное косинусное преобразование (DCT), оставить первые 13 коэффициентов.
DCT здесь декоррелирует каналы mel-банка: соседние mel-полосы сильно коррелированы, DCT вращает пространство так, что первые несколько коэффициентов несут большую часть информации, а остальные можно выбросить.
Whisper от OpenAI принимает 80-канальный mel-log-спектрограмм фиксированного размера 3000 фреймов (30 секунд при 16 кГц). Не MFCC - mel-спектрограмму: современные нейросети предпочитают учиться на «сырых» 80 каналах, а не на DCT-сжатых 13. MFCC живёт в классических HMM-системах и edge-устройствах с ограниченной памятью.
**Delta и delta-delta:** к 13 MFCC обычно добавляют их первую и вторую производную по времени (скорость и ускорение изменения). Итого 39 чисел на фрейм - стандарт HTK/Kaldi для HMM-систем.
MFCC устарели и больше не используются
MFCC живы на edge-устройствах (микроконтроллеры, слуховые аппараты) и в системах с HMM
13 чисел на фрейм против 80 - критично при RAM в 256 KB. TinyML-пайплайны до сих пор строятся на MFCC.
Whisper (OpenAI) принимает на вход:
Ключевые идеи
- **STFT = FFT по фреймам:** сигнал нарезается на короткие перекрывающиеся окна, FFT на каждом - результат двумерная матрица (время x частота)
- **Оконные функции:** окно Ханна/Хэмминга подавляет spectral leakage; прямоугольное окно портит спектр резкими краями
- **Спектрограмма:** |STFT|^2 в дБ - визуально и численно удобное представление; log-шкала сжимает 120 дБ динамики
- **Mel-шкала:** логарифмическое сжатие высоких частот под психоакустику уха; 40-128 фильтров вместо 256+ линейных корзин
- **MFCC:** mel + log + DCT + 13 коэффициентов = стандарт edge-ASR; нейросети предпочитают сырые 80 mel-каналов
Связанные темы
STFT и mel-спектрограммы - точка входа в большинство современных аудио-пайплайнов:
- FFT и алгоритм Кули-Тьюки — STFT = многократный запуск FFT на оконных фреймах
- Whisper (Speech-to-Text) — Принимает 80-канальный mel-log-спектрограмм как входной тензор
- Фильтрация сигналов — Фильтры в частотной области применяются к STFT-матрице
Вопросы для размышления
- Почему увеличение длины окна STFT улучшает частотное разрешение, но ухудшает временное - и как это связано с принципом неопределённости?
- Whisper использует 80 mel-каналов, а классические HMM-системы - 13 MFCC. В каком сценарии 13 MFCC предпочтительнее, несмотря на меньшую информацию?
- Если два разных звука имеют одинаковую mel-спектрограмму, можно ли восстановить из неё исходный сигнал - и что это говорит об обратимости mel-преобразования?
Связанные уроки
- dsp-05 — FFT - строительный блок STFT; каждый фрейм STFT это один запуск FFT
- dsp-07 — Mel-спектрограммы - вход в фильтрбанковые и DNN-аудио модели
- aie-23-speech-to-text — Whisper принимает 80-канальный mel-спектрограмм - ровно то, что строится здесь
- calc-01-sequences — Окно Ханна - взвешенная последовательность; те же идеи сходимости из матанализа
- alg-01-big-o — STFT из N фреймов x FFT за O(M log M) - стоимость O(N * M log M)