对于信号(声音)的单类分类,我应该使用哪个算法?

12

更新: 我在这里总结了问题及其答案。

  1. 我的目标是检测噪声信号中给定模式的存在性。我想通过使用麦克风记录昆虫的声音来检测昆虫物种的存在。我以数字格式先前记录了昆虫的声音。
  2. 我不是在尝试进行语音识别。
  3. 我已经在输入信号和模式之间使用卷积来确定它们的相似度水平。但我认为这种技术更适用于离散时间(即数字通信,在其中信号以固定间隔发生),并且适用于区分在两个给定模式之间的输入信号(我只有一个模式)。
  4. 我担心使用神经网络,因为我从未使用过它们,也不知道是否可以将该代码嵌入其中。

您能否指出其他方法,或者试图说服我使用当前方法仍然是一个好主意,或者神经网络可能是可行的方法?

更新: 我已经得到2个好答案,但另一个答案将受到欢迎和奖励。

11个回答

11
从卷积进阶到更高层次的技术,是称作 动态时间规整(DTW)。它可以被看成拉伸或收缩一个信号去最优匹配另一个信号的一种卷积运算符。
也许更简单的方法是对样本进行快速傅里叶变换(FFT),并确定是否有任何特定频率可应用滤波。
在更复杂的一面,但不到神经网络的程度,是SVM工具包,例如libsvmsvmlight,可以将您的数据输入其中。
无论采取哪种方法,我建议使用FFT等工具来探索昆虫发出的声音的性质。毕竟,如果你自己能分类声音,教计算机就会更容易些。

FFT 是快速傅里叶变换。 - Loki
我已经做了很多FFT,但信号具有宽频谱和许多组成部分,当查看频谱时,我不知道要寻找什么。我已将其拆分为一系列频率图以查看幅度如何随时间变化,但仍未从中学到太多东西。 - Jader Dias
尽管这个问题的年代有些久远,但是卷积、相关或DTW都不足以解决提问者的问题,毫无疑问。SVM则值得一试,首先尝试使用MFCCs。 - Steve Tjoa
SVM 在检测嗡嗡声或水沸腾等方面表现得相当不错,但是在给定一些无声/噪音样本和一些要识别的声音样本时,它似乎能够识别出该声音,但不能在其他声音同时存在时进行识别。 - NoBugs

3
需要更多信息。
当你说嘈杂的信号时,背景噪音是什么?它在第一近似下是静止的(在统计意义上,即恒定的),还是不稳定的(即可能包含其他声音,如其他动物的叫声等)?
如果背景噪音是不稳定的,那么你最好使用称为独立成分分析的东西,它试图将给定的声音混合物分离成其组成部分源,你甚至不需要昆虫本身的原始录音。许多ICA软件都链接到维基百科页面。
(编辑:ICA是盲源分离(BSS)的一个案例,还有许多其他进行BSS的方法,搜索这些方法可能会有所帮助。)
然而,如果背景噪音是静止的,则问题要简单得多(尽管仍然非常困难)。
在这种情况下,我会使用以下方法。分析一些噪音的幅度谱和您昆虫鸣叫的幅度谱。如果您很幸运,昆虫鸣叫通常可能在不同的频带中。如果是这样,请使用适当的高通、低通或带通滤波器过滤输入信号。
然后,您可以尝试将包含“更多能量”的已过滤信号部分与(已过滤的)昆虫鸣叫进行比较。可能通过使用A. Rex建议的图像相似性算法。
编辑:由于您的背景噪声是非平稳的,因此我只能建议搜索非高斯源的盲源分离可能会引导您找到更多算法。恐怕答案是没有简单的算法可以做到您想要的。

背景噪音是非静止的。在农场中可以找到背景噪音:风声、雨声、机器声和其他动物声。 - Jader Dias

3
听起来像是典型的单类别分类问题,即您想在许多其他不相关的事物中搜索一件事物。
你需要做的是找到一组特征或描述符,可以为每个原始录音的短片段计算,并将其与干净录音产生的特征进行匹配。我认为卷积并不一定不好,但它对噪声非常敏感,因此可能不是您的最佳选择。在您的情况下实际有效的方法可能是对分箱傅里叶变换进行模式匹配。您对信号进行傅里叶变换,得到功率与频率图(而不是功率与时间图),然后将频率分成带,并将每个带的平均功率作为特征。如果您的数据主要包含白噪声,则与相似长度的原始昆虫声音得到的模式将非常接近参考声音的模式。这个技巧已经被成功地使用(通过一些窗口处理)来破解由谷歌等公司用于使网站对盲人友好的音频验证码。
顺便提一下,因为您的原始音频信号是数字化的(否则使用计算机处理将无法工作;-)),所以卷积是适当的。您应该在参考信号和从每个样本开始的原始输入等长的样本之间执行卷积。因此,如果您的参考信号长度为N,而您的原始样本长度为M,其中M≥N,则应在1..P处从您的原始输入中选择P个样本,并在您的参考信号和这些样本之间执行M-N+1=P次卷积。在原始样本中参考声音的最佳位置是具有最高卷积分数的样本。请注意,这很快变得非常耗时。

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


"一类分类问题",你改变了我解决这个问题的研究方式。真的。 - Jader Dias
我认为这是正确的想法。对信号进行窗口处理,进行FFT变换,将频率分组。使用当前窗口以及最近几个窗口中的所有分组作为SVM的特征。libsvm是一个不错的选择,他们有一个“初学者的SVM”文档,可以帮助你完成90%的工作。 - Jay Kominek
SVM非常适合,但最好使用单类分类器。我相信有一类SVM的分类适应性,但我不确定libsvm中是否有这样的分类器。Jay,你知道吗? - jilles de wit

2
如果我是你,我会开始阅读一些关于窗函数的资料,例如 Hamming 窗口,这是声音识别的一个很好的起点。(当然,这需要结合傅里叶变换来实现)

2
你可以尝试使用匹配滤波器。虽然我从未真正使用过,但听说效果很好。
此外,虽然不简单,但我认为隐马尔可夫模型(HMM,我知道你说不需要语音识别,但请听我解释!)将为您提供最佳结果。同样,我从未真正使用过它,但是有许多开源实现可用。您只需要使用现有的“干净”昆虫录音对其进行训练。这里是一个开源实现:General Hidden Markov Model Library

卷积在某些条件下,包括离散时间信号中等效于匹配滤波器。但由于我正在处理连续时间信号,所以你的答案很好。 - Jader Dias

2
承认这不是我的专业领域,但我首先想到的是递归最小二乘滤波器 - 它执行自相关。它类似于您现在使用的卷积滤波器,但更为先进。卡尔曼滤波是其扩展 - 它用于从多个噪声测量中重新生成信号,因此在这种情况下可能没有用处。我不会轻易拒绝神经网络 - 它们在这方面非常有用(前提是您正确训练它们)。
深入考虑后,我可能会建议使用FFT。您要寻找的信号很可能具有非常有限的频带,并且您可能会更幸运地在数据上使用带通滤波器,然后在该数据上使用简单的卷积滤波器,而不是时间域数据点。或者两者都做,获得两倍的数据。我不是数学专家,所以无法告诉您是否会使用此方法获得显着(非线性相关)的结果,但您失去的唯一东西是时间。

1
Google: FastICA 算法。有些人将 ICA 和盲源信号分离互换使用。该算法的作者写了一本关于 ICA 的绝妙书籍,在亚马逊二手市场上售价大约为 $40-$60。

1

你可能会对MA Toolbox感兴趣,它是一种Matlab实现的相似度测量工具。

我个人觉得这篇论文MPEG-7中的通用声音分类和相似度很有意思。但是,它可能被设置了付费墙(我不确定),而且在实践中可能没有那么有用。

GPL-ed框架Marsyas有一个名为kea的机器学习分类工具。我的猜测是,这可能不是你想要的,或者连接起来太麻烦了。

否则,我的唯一想法就是进行傅里叶变换,将你的声音转换成灰度图像。然后使用众多图像相似度算法之一。


1
一个朴素贝叶斯分类器可能在这里很有价值,将声音样本分类为包含您感兴趣的物种和不包含的物种。它对于复杂现象非常有效;我曾经用它来判断给定的毫米波雷达数据集是否包含障碍物,例如灌木丛、坦克陷阱等。至于如何将您的连续数据分解成离散块以供贝叶斯分类器使用,您可以沿着连续数据集滑动并断开与昆虫样本长度相等的块。例如,如果您要比较的样本持续时间为2秒,则可以将鉴别器馈送0-2秒、0.5-2.5秒、1-3秒等。您需要训练鉴别器,但这是任何基于机器学习的解决方案的常见要求。
如果您要寻找的昆虫物种没有单一而相对明显的声音,那么这些方法是唯一可行的方法。如果您要寻找的是比单个声音更复杂的东西,而且可能音量更高或更低,那么交叉相关/卷积的效用就有限了。

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接