Использование кросс-корреляции для обнаружения звукового сигнала внутри другого сигнала

Я пытаюсь написать скрипт на python, чтобы обнаружить наличие простого звукового сигнала в любом заданном входном аудиофайле. Я объясняю свое решение, и я признателен, если кто-нибудь подтвердит, что это хорошее решение. Любое другое решение, реализуемое в python, приветствуется.

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

Это мой код:

import scipy.fftpack as fftpack
def similarity(template, test):
    corr = fftpack.irfft(fftpack.rfft(test , 2 * test.size ) *    \
           fftpack.rfft(template[:-1] , 2 * template.size ))           

    return max(abs(corr))

шаблон и тест представляют собой одномерные списки данных сигнала. Второй аргумент rfft используется для заполнения нулями при вычислении БПФ. однако я не уверен, сколько нулей нужно добавить. Кроме того, должен ли я выполнять нормализацию данного сигнала перед применением БПФ? например, нормализовать его на основе пика сигнала шаблона?


person shahram kalantari    schedule 28.10.2015    source источник


Ответы (1)


Решено! Мне просто нужно было использовать scipy.signal.fftconvolve, который сам заботится о заполнении нулями. Никакой нормализации не требовалось. Итак, рабочий код для меня:

   from scipy.signal import fftconvolve
   def similarity(template, test):
       corr = fftconvolve(template, test, mode='same')           

       return max(abs(corr))
person shahram kalantari    schedule 12.11.2015