Это итоговый урок модуля: он связывает всё, что мы прошли. Звук, изображение и история оценок выглядят совершенно по-разному, но после выделения признаков каждый объект становится вектором — а с векторами мы уже умеем всё: сравнивать, сжимать через PCA, искать соседей и рекомендовать. Пройдём эту цепочку на звуке, где всё начинается с преобразования Фурье.
Звук как сумма частот
Цифровой звук — это последовательность отсчётов . Чтобы узнать, из каких частот он сложён, применяют дискретное преобразование Фурье:
Модуль говорит, насколько сильна частота с номером (ей отвечает герц, где — частота дискретизации), а аргумент — её фазу. По сути это линейное преобразование, только базис — синусоиды.

Сумма двух тонов во времени (сверху) и её спектр (снизу), посчитанный настоящим ДПФ. Пики стоят ровно на частотах и Гц — преобразование Фурье вытащило скрытые в волне частоты.
Окно и утечка спектра
Один спектр на всю запись теряет время: если переставить куски записи местами, набор частот почти не изменится. Поэтому спектр считают по коротким окнам. Но у окна есть подвох: если в него не помещается целое число периодов, его концы не совпадают, и ДПФ, считая окно периодическим, размазывает энергию по соседним частотам — это спектральная утечка.
Этот предел — не свойство алгоритма, а закон природы (тот же, что принцип неопределённости в физике). Поэтому окно выбирают под задачу: для щелчка важна ось времени, для настройки ноты — ось частоты.
Потрогай спектрограмму
Соберите сигнал — виджет посчитает настоящее преобразование Фурье прямо в браузере и нарисует реальную спектрограмму. Двигайте ширину окна и увидите компромисс своими глазами: узкое окно точно отмечает щелчок, но размывает близкие тоны; широкое — наоборот.
От карты к вектору
Спектрограмма — картинка, а нам нужен короткий вектор. Из неё извлекают признаки: спектральный центр тяжести (где сосредоточена энергия — «яркость» звука), ширину полосы, точку спада (rolloff), частоту переходов через ноль, коэффициенты MFCC. Каждый из них — одно число на кадр, отвечающее на понятный вопрос о звуке. Усреднённые по времени, они складываются в вектор — компактный паспорт звука, с которым дальше работает уже знакомая линейная алгебра.
::::
Карта звуков
Сожмём эти признаки в две координаты через PCA и разложим звуки на плоскости. Похожие сближаются сами.

Синтезированные звуки шести типов, разложенные по спектральным признакам и сжатые в две координаты. Одинаковые сближаются: у звуков все три ближайших соседа — того же типа. Признаки посчитаны настоящей STFT.
Косинус или расстояние
Как измерять близость векторов? Есть два ответа. Косинусное сходство
сравнивает только направление и не замечает общего масштаба. Евклидово расстояние масштаб сохраняет.

Выбор зависит от смысла. Если громкость записи не должна определять сходство, берут косинус. Если сила признака содержательна — евклид. После L2-нормировки векторов эти две меры становятся монотонно связаны, но до неё — нет.
Векторы и имеют косинус , но евклидово расстояние между ними велико. В какой аудиозадаче стереть эту разницу разумно, а в какой — вредно?
Показать ответ
Косинус означает одинаковое направление: одинаковый «профиль» спектра при разной громкости. Стирать разницу разумно, когда громкость записи случайна и не должна влиять на сходство (поиск похожего тембра). Вредно, когда сила сигнала содержательна — например, при детекции громких событий или измерении энергии, где амплитуда и есть ответ. Тогда берут евклид.
::::
Поиск соседей и рекомендация
Теперь всё сходится. Фрагмент-запрос кодируют тем же способом и ищут ближайшие векторы — это контентная рекомендация: она опирается на само содержание и потому помогает даже новому треку, у которого нет ни одной оценки (холодный старт из урока о рекомендациях). А матричная факторизация оттуда использовала коллективные оценки. Сильная система — гибрид: контентный вектор для новизны, коллаборативный — для точности на популярном.
Но сосед — это гипотеза, а не приговор. Алгоритм всегда найдёт ближайший объект, даже если весь каталог далёк, поэтому показывают и абсолютное расстояние, и сравнение со случайными парами. И качество нельзя мерить одним совпадением жанра: похожесть бывает по тембру, темпу или настроению, и её проверяют несколькими критериями сразу.
Итоговый протокол практикума
Капстон модуля проходит по одной честной цепочке, и каждый шаг мы уже проходили:
- зафиксировать вопрос (похожий тембр? жанр? следующий трек?);
- разбить записи без утечки — по трекам или исполнителям, а не по фрагментам, как требует урок о разбиении;
- извлечь спектральные признаки настоящей STFT;
- стандартизовать масштабы только по обучающей части;
- сжать PCA, число компонент выбрать по validation;
- найти соседей и открыть тест ровно один раз;
- прослушать ошибки и превратить их в следующую гипотезу.
Спектр есть паспорт сигнала: он сводит сложное колебание к набору простых составляющих, и по этому набору сигнал узнают, сравнивают и восстанавливают.
Русская линия здесь ведёт к А. А. Харкевичу — советскому учёному, чья книга «Спектры и анализ» воспитала поколения инженеров связи. Его взгляд на спектр как на «паспорт сигнала» — ровно то, что делает наш конвейер: сводит звук к короткому вектору, по которому объект можно узнать и найти похожие.
Чем связан весь модуль
Мы прошли путь от отсчётов звука до рекомендации и увидели, что он весь состоит из уже знакомых кирпичей. Преобразование Фурье — линейное преобразование в базисе синусоид. Спектрограмма упирается в предел Габора: точность по времени и по частоте не даются вместе. Признаки превращают звук в вектор, PCA сжимает его, косинус и евклид измеряют близость, а поиск соседей и факторизация оценок дают рекомендацию. Разные данные — звук, картинки, оценки — после выделения признаков говорят на одном языке векторов, и вся линейная алгебра модуля работает на них одинаково. Это и есть главный вывод: научиться превращать объект в осмысленный вектор — значит получить над ним всю силу изученных методов.
Задачи
Сигнал дискретизирован с Гц и содержит ровно отсчётов. Для вычислите длительность окна в миллисекундах и шаг DFT-частот в герцах. При hop , первом кадре и без padding найдите число полных кадров , время начала последнего кадра и проверьте, что его правый край не превосходит . Объясните на этих числах компромисс времени и частоты.
Сгенерируйте отсчётов и анализируйте фрагмент . Сравните прямоугольное окно и симметричное Hann . Возьмите one-sided FFT длины от , нормируйте модуль на максимум. Ширина главного пика — расстояние в герцах между ближайшими локальными минимумами слева и справа от максимума; уровень боковых лепестков — максимум вне этого интервала в дБ. Сообщите ширину и уровень лепестков для обоих окон и объясните, почему Hann уменьшает утечку ценой разрешения.
Для , и вычислите попарные евклидовы расстояния и косинусные расстояния до нормировки. Затем замените каждый вектор на и повторите обе таблицы. Для запроса укажите порядок соседей каждой метрикой до и после нормировки и объясните на числах, какая информация о масштабе исчезла и почему и имеют косинус .
Спектр окна из восьми корзин имеет модули , а частоты корзин равны с Гц. Вычислите спектральный центр тяжести , ширину полосы и точку спада (наименьшую , где накопленная энергия достигает от полной по ). Объясните, что каждая величина говорит о «яркости» звука.
Синтезируйте на Гц по восемь примеров шести звуков (низкий тон, высокий
тон, аккорд из трёх нот, серия щелчков, белый шум, линейный свип), фиксируя seed.
Настоящей STFT (, hop , окно Ханна) извлеките для каждого шесть признаков:
среднее и разброс спектрального центра, среднюю ширину полосы, среднюю точку спада,
частоту переходов через ноль и спектральную плоскость. Стандартизуйте, сожмите
PCA(n_components=2) и измерьте чистоту трёх ближайших соседей (доля соседей того же
типа). Убедитесь, что похожие звуки образуют группы, и объясните, какие признаки
разделяют тон от шума.
Докажите, что для ненулевых после L2-нормировки () справедливо . Выведите отсюда, что на единичной сфере порядок соседей по евклидову расстоянию и по косинусу совпадает, а до нормировки — нет. Приведите пример трёх векторов, где эти два порядка различны.
На синтезированном банке из задачи 5 постройте контентный поиск: запрос кодируется тем же конвейером, релевантны звуки того же типа. Сообщите Recall@3 и среднюю точность mAP@5, а затем сравните две меры близости — косинус на стандартизованных признаках и евклид на сырых. Объясните, почему разбиение обязательно делать по «источнику» (не допуская фрагменты одного сигнала и в базу, и в запрос), и как это связано с утечкой из урока 32.
Возьмите реальный набор FMA-small (Zenodo 10.5281/zenodo.574978): треки с непустыми
artist.id и track.genre_top. Декодируйте по 10-секундному mono-фрагменту при
Гц и STFT , hop извлеките спектральные признаки (центр, ширину,
rolloff, flatness, zero-crossing) как среднее и разброс по кадрам. Сравните два
разбиения — по хешу track_id и по хешу artist.id. В каждом обучите
стандартизацию и PCA(n_components=8) только на train, L2-нормируйте код. Для
test-запроса кандидаты — test-треки другого исполнителя, релевантны — того же жанра.
Сообщите macro-Recall@3 и mAP@10 и объясните, почему split по треку завышает качество
по сравнению со split по исполнителю.