Найти аудиосэмпл в аудиофайле (спектрограмма уже существует)

Я пытаюсь добиться следующего:

  • Используя Skype, позвоните в мой почтовый ящик (работает)
  • Введите пароль и сообщите почтовому ящику, что я хочу записать новое приветственное сообщение (работает)
  • Теперь мой почтовый ящик говорит мне записать новое приветственное сообщение после звукового сигнала
  • Я хочу дождаться звукового сигнала, а затем воспроизвести новое сообщение (не работает)

Как я пытался достичь последнего пункта:

  • Создать спектрограмму, используя БПФ и скользящие окна (работает)
  • Создайте "отпечаток пальца" для звукового сигнала
  • Ищите этот отпечаток в аудио, который исходит из скайпа

Проблема, с которой я сталкиваюсь, заключается в следующем:
Результат FFTs на аудио из скайпа и опорный звукового сигнала не то же самые в цифровом смысле, то есть они похожи, но не то же самое, хотя сигнал был извлечен из звукового файла с записью скайпа аудио. На следующем рисунке показана спектрограмма звукового сигнала от аудиозаписи Skype с левой стороны и спектрограмма контрольного звукового сигнала с правой стороны. Как видите, они очень похожи, но не одинаковы...
http://img27.imageshack.us/img27/6717/spectrogram.png

Я не знаю, как продолжить отсюда. Должен ли я усреднить его, то есть разделить его на столбцы и строки и сравнить средние значения этих ячеек, как описано здесь? Я не уверен, что это лучший способ, потому что он уже заявляет, что он не очень хорошо работает с короткими аудиосэмплами, а звуковой сигнал длится менее секунды...

Любые советы о том, как действовать?

2 ответа

Решение

Вам следует определить пиковую частоту и длительность (возможно, минимальную мощность за эту длительность для частоты ( среднеквадратическое значение - самый простой показатель)

Это должно быть достаточно легко измерить. Чтобы сделать вещи еще более умными (но, вероятно, совершенно ненужными для этой простой задачи сопоставления), вы можете утверждать о несуществовании других пиков во время окна звукового сигнала.

Обновить

Чтобы сравнить полный аудио фрагмент, вы захотите использовать алгоритм Convolution. Я предлагаю использовать готовую библиотечную реализацию вместо собственной.

Наиболее распространенные алгоритмы быстрого свертывания используют алгоритмы быстрого преобразования Фурье (БПФ) с помощью теоремы о круговой свертке. В частности, круговая свертка двух последовательностей конечной длины определяется путем взятия БПФ каждой последовательности, умножения по точкам и последующего выполнения обратного БПФ. Свертки типа, определенного выше, затем эффективно реализуются с использованием этой методики в сочетании с частями с нулевым расширением и / или отбрасыванием частей вывода. Другие алгоритмы быстрой свертки, такие как алгоритм Шёнхаге-Штрассена, используют быстрые преобразования Фурье в других кольцах.

Википедия перечисляет http://freeverb3.sourceforge.net/ в качестве кандидата с открытым исходным кодом

Редактировать Добавлена ​​ссылка на страницу учебника API: http://freeverb3.sourceforge.net/tutorial_lib.shtml

Дополнительные ресурсы:

http://en.wikipedia.org/wiki/Finite_impulse_response

http://dspguru.com/dsp/faqs/fir

Существующие пакеты с соответствующими инструментами в Debian:

[brutefir - a software convolution engine][3]
jconvolver - Convolution reverb Engine for JACK

libzita-convolver2 - C++ library implementing a real-time convolution matrix
teem-apps - Tools to process and visualize scientific data and images - command line tools
teem-doc - Tools to process and visualize scientific data and images - documentation
libteem1 - Tools to process and visualize scientific data and images - runtime

yorick-yeti - utility plugin for the Yorick language

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

Другие вопросы по тегам