12

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

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

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

更新我已经有 2 个很好的答案,但另一个会受到欢迎,甚至会得到奖励。

4

10 回答 10

11

卷积的一个进步是动态时间扭曲,它可以被认为是一个卷积算子,它拉伸和收缩一个信号以最佳匹配另一个信号。

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

在更复杂但不完全是神经网络的方面,是 SVM 工具包,如libsvmsvmlight,您可以将数据投入其中。

无论您尝试哪种方式,我都会花时间探索昆虫使用 FFT 等工具发出的声音的本质。毕竟,如果你能自己做的话,教计算机对声音进行分类会更容易。

于 2009-01-14T00:52:09.527 回答
3

需要更多信息。

当您说噪声信号时,背景噪声是什么?初步近似,它是静止的(在统计意义上,即恒定)还是非静止的(即可能包含其他声音,例如其他动物叫声等?)

如果背景噪音是非平稳的,那么您最好的选择可能是使用称为独立成分分析的东西,它试图将给定的声音混合物分成其成分源,您甚至不需要昆虫本身的原始录音。许多 ICA 软件都链接自 Wikipedia 页面。

(编辑:ICA 是盲源分离(BSS) 的一个案例,还有许多其他的 BSS 方法,它也可能有助于搜索这些方法。)

但是,如果背景噪声是固定的,那么问题就容易多了(尽管仍然非常困难):

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

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

编辑:由于您的背景噪声是非平稳的,因此我只能建议搜索非高斯源的盲源分离可能会导致您使用更多算法。恐怕答案是没有简单的算法可以做你想做的事。

于 2009-01-27T13:02:30.027 回答
3

听起来像一个典型的一类分类问题,即你想在一大堆你不关心的其他事情中搜索一件事情。

您要做的是找到一组特征或描述符,您可以为原始录音的每一小段计算这些特征或描述符,然后您可以将其与干净录音产生的特征相匹配。我不认为卷积一定是坏的,尽管它对噪声相当敏感,所以它可能不是你的情况的最佳选择。在您的情况下实际可行的是合并傅立叶变换上的模式匹配。您对信号进行傅立叶变换,为您提供功率与频率图(而不是功率与时间图),然后将频率划分为频带,并将每个频带的平均功率作为特征。如果您的数据主要包含白噪声,那么您从相似长度的原始昆虫声音中获得的模式将非常接近您的参考声音的模式。最后一个技巧已成功使用(带有一些窗口)来破解 google 等人使用的音频验证码,以使盲人可以访问他们的网站。

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

正如我在上面解释的那样,基于傅里叶变换的匹配使用来自参考样本长度两倍的原始数据中的 50% 重叠样本至少会更快(尽管不一定更好)

于 2009-01-27T15:33:04.387 回答
2

如果我是您,您会开始阅读一些有关诸如汉明窗之类的窗函数的信息,这是声音识别的一个很好的起点。(当然,这与傅里叶变换相结合)

于 2009-01-14T00:51:56.547 回答
2

您可以尝试匹配过滤器。虽然我从来没有真正使用过,但我听说过好东西。

另外,虽然不简单,但我认为隐马尔可夫模型(HMM,我知道你说没有语音识别,但听我说完!)会为你提供最好的结果。再说一次,我从来没有真正使用过,但是到处都有开源实现。您只需要使用现有的“干净”昆虫记录来训练它。这是一个开源实现:通用隐马尔可夫模型库

于 2009-01-27T13:51:13.500 回答
2

诚然,这不是我的专业领域,但我的第一个想法是递归最小二乘滤波器——它执行自相关。它类似于您现在使用的卷积过滤器,但更高级一些。卡尔曼滤波是对此的扩展——它用于从多个噪声测量中重新生成信号,因此在这种情况下它可能没有用。我不会拒绝临时神经网络——它们在这类事情上非常有用(前提是你正确地训练它们)。

更深入地考虑这一点,我可能会建议使用 FFT。您正在寻找的信号可能是非常带限制的,您可能会更幸运地对数据使用带通滤波器,然后使用 FFT,最后在该数据上使用简单的卷积滤波器而不是时域数据点。或者两者都做并拥有两倍的数据。我对数学不感兴趣,所以我不能告诉你使用这种方法是否会得到显着的(不是线性相关的)结果,但你唯一失去的就是时间。

于 2009-01-27T15:57:02.450 回答
1

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

我个人觉得这篇论文,MPEG-7 中的一般声音分类和相似性,很有趣。但是,它可能在付费墙后面(我不知道),并且在实践中可能没有那么有用。

GPL-ed 框架Marsyas有一个用于机器学习分类的工具,称为 kea。我的猜测是,这可能无法满足您的要求,或者需要付出太多努力才能实现。

我唯一的想法是进行傅里叶变换,有效地将你的声音转换成灰度图像。然后使用许多图像相似性算法中的一种。

于 2009-01-27T12:38:43.287 回答
1

朴素贝叶斯分类器在这里可能是值得的,它将声音样本分类为包含您感兴趣的物种的样本和不包含的样本。它对复杂现象非常有效;我曾经用它来确定给定的毫米波雷达数据集是否包含障碍物,例如刷子、坦克陷阱等。至于如何将连续数据分解为贝叶斯分类器的离散块,您可能只是滑行连续数据集并分解与昆虫样本长度相等的块。例如,如果您要比较的样本是 2 秒长,您可能会向鉴别器提供 0-2 秒、0.5-2.5 秒、1-3 秒等。您需要训练鉴别器,但这是常见的任何基于机器学习的解决方案的要求。

如果您的昆虫物种没有您正在寻找的单一、相对独特的声音,那么这些方法几乎是唯一可行的方法。如果您正在寻找比可能更高或更低音量的单个声音更复杂的东西,则互相关/卷积的效用有限。

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

于 2009-01-27T15:45:05.470 回答
1

您可能需要Wiener 滤波器方法。

于 2009-01-29T20:55:49.347 回答
1

谷歌:FastICA 算法。有些可互换使用 ICA 和盲源信号分离。该算法的作者写了一本很棒的关于 ICA 的书,在亚马逊上使用的价格约为 40-60 美元。

于 2014-02-28T12:49:49.567 回答