在音频文件中查找音频样本(频谱图已存在)

时间:2011-04-30 18:12:14

标签: c# .net audio comparison fft

我正在努力实现以下目标:

  • 使用Skype,拨打我的邮箱(正常)
  • 输入密码并告知邮箱我要记录新的欢迎信息(有效)
  • 现在,我的邮箱告诉我在发出哔声后记录新的欢迎信息
  • 我想等待哔哔声然后播放新信息(不起作用)

我是如何努力实现最后一点的:

  • 使用FFT和滑动窗口(工作)创建频谱图
  • 为哔哔声创建“指纹”
  • 在来自skype
  • 的音频中搜索该指纹

我面临的问题如下:
来自skype和参考蜂鸣声的音频的FFT结果在数字意义上是不同的,即它们是相似的但不相同,尽管从具有Skype音频记录的音频文件中提取蜂鸣声。下图显示左侧Skype音频的哔声谱图和右侧的参考哔声谱图。如你所见,它们非常相似,但不一样...... uploaded a picture http://img27.imageshack.us/img27/6717/spectrogram.png

我不知道,怎么从这里继续。我应该对其进行平均,即将其划分为列和行,并按照here所述比较这些单元格的平均值?我不确定这是最好的方法,因为他已经声明,对于短音频样本它不能很好地工作,并且哔哔声的长度不到一秒......

有关如何进行的任何提示?

2 个答案:

答案 0 :(得分:4)

您应该确定峰值频率和持续时间(可能是频率持续时间内的最小功率(RMS是最简单的衡量标准)

这应该很容易衡量。为了使事情变得更加聪明(但对于这个简单的匹配任务来说可能完全没有必要),你可以在哔哔声窗口期间断言其他峰值不存在。

更新

要比较完整的音频片段,您需要使用Convolution algorithm。我建议使用现成的库实现,而不是自己动手。

  

最常见的快速卷积算法通过循环卷积定理使用快速傅里叶变换(FFT)算法。具体地,通过对每个序列进行FFT,逐点相乘,然后执行逆FFT,找到两个有限长度序列的循环卷积。然后使用该技术结合零扩展和/或丢弃输出的部分来有效地实现上面定义的类型的卷积。其他快速卷积算法,如Schönhage-Strassen算法,在其他环中使用快速傅里叶变换。

维基百科将http://freeverb3.sourceforge.net列为开源候选人

修改已添加指向API教程页面的链接:http://freeverb3.sourceforge.net/tutorial_lib.shtml

其他资源:

http://en.wikipedia.org/wiki/Finite_impulse_response

http://dspguru.com/dsp/faqs/fir

在debian上使用相关工具的现有包:

[brutefir - a software convolution engine][3]
jconvolver - Convolution reverb Engine for JACK

libzita-convolver2 - C++ library implementing a real-time convolution matrix
teem-apps - Tools to process and visualize scientific data and images - command line tools
teem-doc - Tools to process and visualize scientific data and images - documentation
libteem1 - Tools to process and visualize scientific data and images - runtime

yorick-yeti - utility plugin for the Yorick language

答案 1 :(得分:1)

首先,我会在频率方向上平滑一点,以便频率的微小变化变得不那么相关。然后简单地取每个频率并减去两个幅度。平衡差异并加起来。也许首先将信号归一化,因此总振幅的差异无关紧要。然后将差异与阈值进行比较。