2015-10-28 4 views
2

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

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

Это мой код:

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)) 

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

ответ

2

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

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

     return max(abs(corr))