Найти похожую музыку, используя FFT Spectrums

16

Я экспериментировал несколько недель, чтобы найти способ сопоставить / найти похожие песни в библиотеке, содержащей разные жанры музыки.

Моей первой попыткой было определить такие особенности, как темп или количество басов в песнях, чтобы сформировать группы, но я не продвинулся далеко с этим подходом (определение ритма на основе изменения громкости), поскольку примерно на 20% песен не нужно считать ритм всегда, иногда 1/2 или 1/3 из них, и я не мог реализовать это.

После нескольких недель неудачных попыток у меня появилась новая идея, которая описана далее в этом посте. Проще говоря, он работает, беря образцы файлов Spectrum, создавая что-то вроде «среднего спектра» файлов для их сравнения. Идея заключалась в том, что, например, в Hardstyle намного больше басов, чем в обычной рок-музыке, я также проверил это, посмотрев некоторые спектрумы в Audacity.

  • Файл 1: взять полный файл FFT Spectrums (размер образца 2048 атм, логарифмическая шкала амплитуд)
  • Суммируйте все массивы спектра, возьмите средние значения каждой корзины
  • Сделайте то же самое с другими файлами, сохраните все результаты
  • Составьте список различий значений FFT между файлом 1 и другими файлами
  • Среднее значение различий между файлом 1 и файлом X
  • Сортировка по возрастанию по этим средним
  • Песни с самым низким значением разности считаются похожими.

Могут ли некоторые из вас, у кого есть хорошие знания, сказать мне, будет ли это правильный / хороший способ реализовать мою идею?

GFG
источник
1
Если вы пытаетесь определить темп, вы можете попробовать возвести в квадрат сигнал, а затем выполнить преобразование Фурье. Частоты порядка 1 Гц не будут присутствовать в обычном (неквадратичном) спектре БПФ, потому что они отфильтрованы. Связанная идея, используемая для обнаружения основного тона, называется «кепстр»; Вы можете узнать об этом, погуглив. Чтобы отличить поп и джаз от классики, вы можете попытаться определить звуки ударных, которые не установлены. Вибрато должно быть машинно-определяемым. Есть меры диссонанса, которые могут быть вычислены машиной.
1
Может быть, вы должны попросить модераторов переместить это на dsp.SE
Дилип Сарват
Я пометил свой вопрос с просьбой переместить его в DSP SE. Вы имеете в виду, что я мог бы определить, присутствует ли Drumkit Present или нет, чтобы классифицировать вход? Можете ли вы объяснить, как квадратный сигнал ведет к темпу?
3
Музыка записывается и обрабатывается таким образом, чтобы максимизировать их спектральное распространение, особенно в наши дни. Я не думаю, что полнометражные спектры дадут вам хороший критерий для классификации музыки.
Фонон
2
Вместо спектров, вы должны смотреть на спектрограммы. Спектр показывает только частоту содержания всей песни одновременно. Спектрограммы показывают, как частотный состав изменяется со временем.
эндолит

Ответы:

17

То, что вы пытаетесь сделать, было опробовано снова и снова сотнями исследователей, и по этому поводу достаточно много работы. Проверьте материалы конференции ISMIR. Даже если это не соответствует действительности, прочитайте тезис Элиаса Пампалка: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

Чтобы быстро сориентироваться на правильном пути:

Музыка может быть похожа по многим параметрам: а) тембр / текстура / жанр; б) ритмический рисунок; в) прогрессия мелодии / аккорда ... и многое другое! Из вашего сообщения не понятно, что вы хотите измерить!

  • Если вас интересует а) функции, которые вы, возможно, захотите посмотреть, это MFCC (коэффициенты частотного кепстра Мел), поскольку они каким-то образом отражают то, как работает человеческий слух (деформация частоты, логарифмическая шкала), поскольку они декоррелированы (что облегчает моделирование) и так как они имеют меньшую размерность (13 коэффициентов против 2048).
  • Если вы заинтересованы в b), посмотрите на функцию, называемую «паттерны флуктуации» (Pampalk, в короткой автокорреляции сигнала в диапазоне 0,1 ... 10 Гц в нескольких диапазонах); или функции Уитмена "Пенни" (БПФ MFCC вдоль оси времени).
  • Если вас интересует в), посмотрите на хроматограммы. Начните с кода хроматограммы Эллиса (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/), а затем перейдите к реализации Mauch, если вам нужно что-то более надежное (http://isophonics.net/nnls-chroma) ).

Это для функций. Теперь вам нужно будет придумать лучший способ сравнить ваши песни, когда они будут представлены в виде последовательности этих функций. Вычисление парных различий между последовательностями не очень разумно - например: сравнение песни и смещения одной и той же песни на некоторое молчание приведет к разнице, хотя она точно такая же! Вы бы лучше сравнили распределение этих функций; например, вычислите среднее / стандартное отклонение элементов по песне A и среднее / стандартное отклонение элементов по песне B, а затем возьмите вероятностное расстояние (KL, Bhattacharyya над ними).

Последний пункт, но который будет иметь значение позже: вычисление расстояния между песней и остальной частью корпуса для нахождения ближайших совпадений довольно неэффективно. При работе с большими коллекциями такие методы, как LSH или Ball-деревья, позволяют выполнять запросы ближайших соседей без явного сравнения со всем корпусом.

Кроме того, определение темпа - это совсем другое дело. Если вы хотите разобраться в этом, лучшим документом по производительности / доступности по этой теме будет Ellis 'Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Это невероятно просто, но близко к современным алгоритмам.

pichenettes
источник
Спасибо за ваш подробный ответ, я уже много раз слышал о MFCC в этом контексте, и кажется разумным не использовать голые результаты FFT. Это кажется довольно сложным для реализации в моей нынешней «среде знаний» и среде разработки (C #, результаты FFT Bass Library), но я попробую.
GFG