使用互相关来检测另一个信号中的音频信号

时间:2015-10-28 05:37:41

标签: python scipy convolution cross-correlation

我正在尝试在python中编写一个脚本,以检测任何给定输入音频文件中是否存在简单的警报声。我解释了我的解决方案,如果有人能确认这是一个很好的解决方案我很感激。感谢在python中实现的任何其他解决方案。

我这样做的方法是通过计算两个信号的FFT(一个被反转),然后将它们相乘,然后计算结果的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的第二个参数用于填充零以计算FFT。但是,我不确定应该添加多少个零。另外,在应用FFT之前,我应该对给定信号进行任何归一化吗?例如,根据模板信号的峰值对其进行标准化?

1 个答案:

答案 0 :(得分:3)

解决! 我只需要使用scipy.signal.fftconvolve来处理零填充本身。不需要标准化。所以我的工作代码是:

def getLCSArray[G>:Equals](a1: Array[G], a2: Array[G]): Array[G] =
  (a1.isEmpty,a2.isEmpty) match {
    case (true,_) => a1
    case (_,true) => a2
    case (_,_) => {
      val h1 = a1.head
      val h2 = a2.head
      h1 == h2 match {
        case true => getLCSArray(a1.tail ,a2.tail) // this line is wrong
        case _ => longest(getLCSArray(a1.tail, a2), getLCSArray(a1, a2.tail))
      }
    }
  }

def longest[G>:Equals](a1: Array[G], a2: Array[G]): Array[G] = {
  val length1 = a1.length
  val length2 = a2.length
  length1 > length2 match {
    case true => a1
    case _ => a2
  }
}