Каков наилучший способ сохранить график спектрограммы в качестве структуры данных, с которой можно сравнить?
Я создал процесс, похожий на Shazam, который создает спектрограмму данного аудиоклипа. Я пытаюсь выяснить, каким образом сохранить эти данные в базе данных, чтобы я мог проводить сравнения на них. (Мне не нужен реальный код, просто концептуальная помощь по процессу).
Для тех, кто не знаком с спектрограммой, это график времени по оси X и частоты по оси Y. Мне нужен способ сохранить эти данные таким образом, чтобы я мог проводить сравнения. Кроме того, я не могу просто создать длинное значение частоты слева направо, потому что это становится проблемой временной сложности при попытке поиска по нему с большими наборами данных (в основном сравнение подстрок N^2).
По сути, я думал о создании своего рода хеш-функции в звуковом клипе и сохранении данных в виде дерева tree или суффиксов хеш-кода, но я не уверен, как я мог тогда сделать сравнение для него.
Любые идеи очень приветствуются.
3 ответа
Это 2D массив. Возможно, разреженный, если большая часть данных равна 0.0.
Я бы использовал корень гистограммы (скажем, TH2F
) чтобы избежать необходимости управлять всеми крайними случаями и т. д., хотя почти любая научная библиотека должна поддерживать соответствующую структуру данных. ROOT поддерживает как минимум две меры сходства гистограмм ( Чи-квадрат и Колмогоров), которые позволят вам провести количественные сравнения.
Вы можете сохранить его в виде необработанного 2D-массива, или же вам понадобится извлечь некоторые элементы более высокого уровня (контуры шага дорожки и т. Д.), Чтобы извлечь важные объекты, которые вы затем сможете использовать для сравнения.
Проблема с хэшем состоит в том, что вам нужны близкие совпадения, а не точные совпадения - я думал о чем-то вроде извлечения (time, freq) кортежей локальных пиков в спектрограмме и затем поместил их в http://en.wikipedia.org/wiki/Spatial_database.
Для поиска вы можете извлечь n самых высоких пиков (4–8?), А затем выполнить поиск ближайших пиков в пространственной базе данных и найти наиболее подходящее соответствие.