Нахождение похожих звуков.

WP

^_^
Нахождение похожих звуков.

Необходимо выполнить поиск фрагмента звукозаписи по заранее подготовленной базе данных, с учетом возможности присутствия посторонних шумов.
Подскажите существующие алгоритмы, если есть.
Спасибо.
 

Alexandre

PHPПенсионер
есть,
используй быстрое преобразование Фурье
Можно только перечислить несколько областей: анализ сигналов, фильтрация, ускоренное вычисление корелляции и свертки, использование в алгоритмах быстрого умножения чисел, и во многих других случаях оно также находит свое применение.
вычисляешь к-энт корреляции двух файлов, если он меньше некоторой сигмы - следовательно, файлы похожи.
сигма определяется эксперементально.
http://ru.wikipedia.org/wiki/Преобразование_Фурье

-~{}~ 14.12.07 19:48:

http://ru.wikipedia.org/wiki/Быстрое_преобразование_Фурье
 

WP

^_^
Боюсь это не совсем, по двум причинам:
1. Заза большая и сравнение каждого с каждым, думаю, займет много времени и нужно постоянно иметь доступ к каждому из файлов.
2. Задача не столько в том чтобы найти две похожих полных записи, а в том чтобы найти записи содержащие заданный фрагмент.

Думаю снимать с записей отпечатки и искать по ним.
 

Апокалипсис

тех дир matras.ru
По просьбам трудящихся - разделил и вернул тему. Т.к. задача и вправду интересная. Тем более средствами php :)
 

WP

^_^
Апокалипсис
Спасибо. А почему средствами PHP? C++ однозначно :)
 

kruglov

Новичок
WP
Содержание фрагмента - это, грубо говоря, искомая словесная фраза или искомая музыкальная фраза? Т.к. это, вообще говоря, перпендикулярные вещи.
 

HraKK

Мудак
Команда форума
Мсье не знает о rsdn?
Тут однозначно, ся. php загнется.
Единственное решение и то мягко говоря слабо связанное это каждый трек экстраполировать в таблицу в образ метаданных-связей, и юзать поиск по базе данных.
 

WP

^_^
kruglov
Фрагмент - кусок аудиозаписи.

Апокалипсис
Нет, в Теории.
 

Alexandre

PHPПенсионер
Т.к. задача и вправду интересная. Тем более средствами php
задача интересная +1
средствами php - не реально.
надо написать некий бин, который вызывать system, и анализировать % корреляции.
+1. можно найти библиотеки БПФ. пхп одночзачно умрет. как-то я попытался сделать некоторый алгоритм псевдошифрования... РНР - просто умер... Не забывай, что РНР - это интерпретатор, он не предназначен для таких задач.


надо найти оптимальный единичный размер фрагмента и от него отталкиваться. Проверяем корреляцию нашего фрагмента и мелодии, не подходит, сдвигаем мелодию на единичный фрагмент и проверяем дальше....

Пример:
возмем некую абстрактную мелодию:
лааа-ла-ла лааа-ла-ла лу-ла лу-ла...
есть фрагмент: лу-ла лу-ла

необходимо создать алгоритм синхронизации, т.е. выделения фрагмента из мелодии.

например, сравнивая фрагмент и мелодию:
лааа-ла-ла лааа-ла-ла лу-ла лу-ла...
лу-ла лу-ла
-------------------
корреляции нет

... лааа-ла-ла лу-ла лу-ла...
лу-ла лу-ла
-------------------
корреляции нет

...лу-ла лу-ла
лу-ла лу-ла
-------------------
корреляция есть
 

HraKK

Мудак
Команда форума
Alexandre
Утипути :)
Тока сдвигать то придется не по фрагменту как у тебя, ведь в 99% у тебя сдвинется примерно так
---
аа-ла-ла лу
---
Разве что сделать алгоритм сдвига по 1/3 фрагмента и находить ~20% совпадений то сдвигать уже по немногу назад или вперед, если же это успеха не дает - двигаться дальше.
 

Alexandre

PHPПенсионер
Тока сдвигать то придется не по фрагменту как у тебя
ну как сдвигать тоже много тоже тонкостей...
я лишь обозначил проблему, а не предложил конечный алгоритм...
как я предлагал, надо вычислить единичный интервал... а для каждой мелодии он свой, для этого надо сделать как минимум с полсотни замеров и найти закономерность....но можно придерживаться некого среднего, например сдвигать в мелодии на 0,5 сек....

в идеале сдвиг должен проходить на одну ноту.
 

Андрейка

Senior pomidor developer
Alexandre
пардон, вычислить что? можно для нас с топикстартером, не разбирающихся в предметной области, объяснить какое значение можно высчитать за 0.5 сек из этого файла

Формат : WAV аудио файл
Параметры записи : 44100Гц
Разрядность : 16 бит
Режим : Стерео

и как примерно это сделать?
 

Alexandre

PHPПенсионер
можно для нас с топикстартером, не разбирающихся в предметной области
не зная броду - не суйся в вводу.

1) образцовые файлы приводятся к одному формату, к одному частотному диапазону (полоса пропускания, разрядность ...).
2) идет высчитывание к-та корреляции части образца и фрагмента...
3) делается сдвиг образца на одну ноту (определяем эксперементально или опять БПФ) или 0,5 (определим эксперементально ) сек
4) переходим к п.п. 2 до тех пор, пока не пройдем определенной интервал, например 10 сек (определяем эксперементально)
5) переходим к следующему образцу

-~{}~ 17.12.07 15:53:

разберись в форматах:
http://graphics.cs.msu.ru/courses/cg02b/assigns/hw-2/help/wavfmt2.htm
http://www.music4sale.ru/articles/knowledge_base/52/
http://www.codenet.ru/progr/formt/rawsam.php
http://linux-admin.net.ru/content/690

Давайте определимся в терминологии:
есть сама мелодия, есть образец для сравнивания, т.е. преобразованная мелодия (обрезанная по частоте, и приведенная к стандартному формату), т.е. находим по образцу...
есть поисковый фрагмент, т.е. франгмент мелодии, которую мы хотим найти...
он приводится к одному и томуже формату образеца для сравнивания... чтоб к этим файлам можно былоб применить БПФ.
 

AmdY

Пью пиво
Команда форума
народ, может не нужно забывать, что работа ведётся с уже оцифроваными сигналами, который представлен в виде нулей и единиц
 
Сверху