使用互相关检测另一个信号中的音频信号
Using cross-correlation to detect an audio signal within another signal
我正在尝试在 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))
模板和测试是信号数据的一维列表。 rfft 的第二个参数用于填充零以计算 FFT。但是,我不确定应该添加多少个零。另外,我应该在应用 FFT 之前对给定信号进行任何归一化吗?例如,根据模板信号的峰值对其进行归一化?
已解决!
我只需要使用 scipy.signal.fftconvolve 来处理零填充本身。不需要标准化。所以我的工作代码是:
from scipy.signal import fftconvolve
def similarity(template, test):
corr = fftconvolve(template, test, mode='same')
return max(abs(corr))
我正在尝试在 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))
模板和测试是信号数据的一维列表。 rfft 的第二个参数用于填充零以计算 FFT。但是,我不确定应该添加多少个零。另外,我应该在应用 FFT 之前对给定信号进行任何归一化吗?例如,根据模板信号的峰值对其进行归一化?
已解决! 我只需要使用 scipy.signal.fftconvolve 来处理零填充本身。不需要标准化。所以我的工作代码是:
from scipy.signal import fftconvolve
def similarity(template, test):
corr = fftconvolve(template, test, mode='same')
return max(abs(corr))