我应该使用哪种算法进行信号(声音)一类分类?

时间:2009-01-14 00:19:44

标签: algorithm audio pattern-matching signal-processing pattern-recognition

更新此问题以前标题为“给我一个简单的信号(声音)模式检测算法的名称

  1. 我的目标是在嘈杂的信号中检测给定模式的存在。我想检测一种用麦克风录制声音的昆虫种类。我以前用数字格式记录了昆虫的声音。
  2. 我不是在尝试进行语音识别。
  3. 我已经在输入信号和模式之间使用卷积来确定它们的相似度。但我认为这种技术更适合于离散时间(即数字通信,其中信号以固定间隔发生)并且在两个给定模式之间区分输入信号(我只有一种模式)。
  4. 我害怕使用神经网络,因为我从未使用它们,我不知道是否可以嵌入该代码。
  5. 请您指点一些其他方法,或者试着说服我当前的方法仍然是个好主意,或神经网络可能是一种可行的方式?

    更新我已经有2个好的答案,但欢迎另外一个,甚至奖励。

11 个答案:

答案 0 :(得分:11)

卷积的升级是dynamic time warping,它可以被认为是一个卷积运算符,可以拉伸和收缩一个信号,以便与另一个信号进行最佳匹配。

也许更简单的方法是对样本进行FFT并确定您的昆虫是否可以过滤任何特定频率。

在更复杂的一方,但不是一个神经网络,是libsvmsvmlight等SVM工具包,你可以将数据丢弃。

无论您尝试何种路径,我都会花时间使用FFT等工具探索昆虫发出的声音的本质。毕竟,如果你能自己动手,教一台电脑就能更容易分类。

答案 1 :(得分:3)

需要更多信息。

当你说嘈杂的信号时背景噪音是多少?对于第一个近似值,它是静止的(统计意义上,即常数)还是非静止的(即可能包含其他声音,如其他动物呼叫等?)

如果背景噪音是非静止的,那么你最好的选择可能是使用一种名为Independent Components Analysis的东西试图将给定的声音混合物分离成它的分量源,你甚至不需要原始的录音。昆虫本身。许多ICA软件都是从维基百科页面链接的。

(编辑:ICA是Blind Source Separation(BSS)的情况,还有许多其他方法可以帮助搜索这些BSS。)

然而,如果背景噪音是静止的那么问题就更容易了(虽然仍然非常困难):

在这种情况下,我将使用的方法如下。分析一下噪声的振幅谱和昆虫呼叫的振幅谱。如果幸运的话,昆虫呼叫通常可能与噪声处于不同的频带。如果是这样,使用合适的高通,低通或带通滤波器对输入信号进行滤波。

然后,您可以尝试比较过滤后信号的部分,其中包含的“更多能量”与您的(已过滤)昆虫呼叫的平均值相比。可能通过使用A. Rex建议的图像相似度算法。

修改:由于您的背景噪音是非静止的,因此我只能建议搜索Blind Source Separation of non-Gaussian sources可能会引导您进行更多算法。我担心的答案是没有简单的算法会做你想做的事。

答案 2 :(得分:3)

听起来像一个典型的one class classification problem,即你想要搜索一大堆你不关心的其他东西。

您要做的是找到一组功能或描述符,您可以为原始录音的每一小段计算这些功能或描述符,然后您可以根据干净录音产生的功能进行匹配。我不认为卷积是不好的,虽然它对噪音很敏感,所以它可能不适合你的情况。 在您的情况下实际可能工作的是分组傅里叶变换的模式匹配。您对信号进行傅立叶变换,为您提供功率与频率图(而不是功率与时间图),然后将频率划分为频段,并将每个频段的平均功率作为特征。如果您的数据主要包含白噪声,那么您从类似长度的原始昆虫声音中获得的模式将非常接近您的参考声音模式。 This last trick has been used succesfully(有一些窗口)破解谷歌等人使用的音频验证码,使盲人可以访问他们的网站。

顺便说一句,因为您的原始音频信号是数字的(否则用计算机处理将无法工作;-))卷积是合适的。您应该从每个样本开始的原始输入中执行参考信号和相等长度样本之间的卷积。因此,如果您的参考信号具有长度N,并且您的原始样本具有长度M,其中M> = N,那么您应该在参考信号和来自原始输入的P样本之间执行M-N + 1 = P卷积,从1开始。 P.在原始样本中定位参考声音的最佳可能性是具有最高卷积分数的样本。请注意,这会非常快速地耗费时间。

如上所述,基于傅里叶变换的匹配使用来自原始数据的50%重叠样本(参数样本长度的两倍)至少会更快(尽管不是更好)

答案 3 :(得分:2)

如果我是你会像Hamming窗口那样开始阅读Window Functions,这是声音识别的一个很好的起点。 (当然,这与Fourier Transformation

相结合

答案 4 :(得分:2)

您可以尝试使用匹配滤镜。虽然我从未真正使用过,但我听到了很多好事。

另外,虽然不简单,但我认为一个隐马尔可夫模型(HMM,我知道你说没有语音识别,但是听我说!)会为你提供最好的结果。同样,我从来没有真正使用过,但是在整个地方都有开源实现。您只需要使用现有的“清洁”昆虫记录来训练它。这是一个开源实现:General Hidden Markov Model Library

答案 5 :(得分:2)

不可否认,这不是我的专业领域,但我的第一个想法是recursive least squares filter - 它执行自相关。它类似于你现在使用的卷积滤波器,但更高级。卡尔曼滤波是其中的一个扩展 - 它用于从多个噪声测量中重新生成信号,因此在这种情况下它可能没用。我不会拒绝接近神经网络 - 它们在这种情况下非常有用(前提是你正确地训练它们)。

更深入地考虑这个问题我可能会建议使用FFT。有可能你正在寻找的信号是非常有限的,你可能有更多的运气使用带通滤波器对数据然后进行FFT并最终使用简单的卷积滤波器对该数据而不是时域数据点。或两者都做,并有两倍的数据。我不会沉重于数学,所以我不能告诉你,如果你使用这种方法得到重要的(不是线性依赖的)结果,但你唯一丢失的就是时间。

答案 6 :(得分:1)

您可能对MA Toolbox感兴趣,这是Matlab实施的相似性度量。

我个人认为这篇论文General sound classification and similarity in MPEG-7很有意思。但是,它可能是付费墙背后的(我不知道),它在实践中可能没那么有用。

GPL-ed框架Marsyas有一个机器学习分类工具,叫做kea。我的猜测是,这可能不是你想要的,或者是太多的努力来连接。

我唯一的想法就是采用傅里叶变换,有效地将你的声音转换成灰度图像。然后使用众多image similarity algorithms中的一个。

答案 7 :(得分:1)

这里可能值得Naive Bayes Classifier,将声音样本分类为包含您感兴趣的物种的样本和不包含您的物种的样本。它适用于复杂现象;我曾经用它来决定给定的毫米波RADAR数据集是否包含障碍物,如画笔,坦克陷阱等。至于如何将连续数据分解为贝叶斯分类器的离散块,你可能只是滑动连续数据集和断开块的长度与昆虫样本相等。例如,如果你要比较的样本是2秒长,你可能会提供鉴别器0-2s,0.5-2.5s,1-3s等。你需要训练鉴别器,但这是一个常见的任何基于机器学习的解决方案的要求。

如果您的昆虫物种没有您正在寻找的单一,相对清晰的声音,这些方法是唯一的方法。如果你正在寻找比单个声音更复杂或更低音量的东西,那么互相关/卷积的效用是有限的。

有几种语言的朴素贝叶斯分类器实现,例如nbc

答案 8 :(得分:1)

您可能需要Wiener filter方法。

答案 9 :(得分:1)

Google:FastICA算法。有些使用ICA和盲源信号分离可互换。该算法的作者在ICA上写了一本很棒的书,在亚马逊上使用了大约40到60美元。

答案 10 :(得分:0)

Goertzel - 您可以将其用于简单的模式检测和复杂的频率分离。 您可以看到my implementation in C#

的示例