我正在尝试在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之前,我应该对给定信号进行任何归一化吗?例如,根据模板信号的峰值对其进行标准化?
答案 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
}
}