【问题标题】:Which algorithm should I use for signal (sound) one class classification?我应该使用哪种算法进行信号(声音)分类?
【发布时间】:2010-10-01 06:49:02
【问题描述】:

更新这个问题之前的标题是“Give me a simple algorithm for signal(sound) pattern detection

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

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

更新我已经有 2 个不错的答案了,但欢迎再来一个,甚至可以获得奖励。

【问题讨论】:

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


    【解决方案1】:

    比卷积更上一层楼的是dynamic time warping,它可以被认为是一种卷积算子,可以拉伸和收缩一个信号以最佳匹配另一个信号。

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

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

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

    【讨论】:

    • FFT 是快速傅里叶变换。
    • 我已经做了很多FFT了,但是信号频谱很宽,分量也很多,看频谱不知道要找什么。我已经将其拆分为一系列频率图,以查看幅度如何随时间变化。我仍然没有从中学到很多东西。
    • 尽管这个问题的年代久远... -1 表示卷积、相关或 DTW。这些都不足以解决提问者的问题。 +1 支持向量机。先试试 MFCC。
    • SVM 可以很好地检测诸如嗡嗡声或水沸腾之类的东西,但考虑到一些无/噪声样本,以及一些要识别的声音样本,它似乎可以识别声音,但不是什么时候其他声音正在播放。
    【解决方案2】:

    听起来像典型的one class classification problem,即你想在一大堆你不关心的其他事情中搜索一件事情。

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

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

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

    【讨论】:

    • “一类分类问题”,你改变了我研究这个问题的解决方案的方式。说真的。
    • IMO 这是正确的想法。对信号进行窗口化,对其进行 FFT,对频率进行分级。使用当前窗口以及最后几个窗口中的所有 bin,并将它们用作 SVM 的特征。 libsvm 很好,他们有一个“SVM 初学者”文档,可以带你走 90% 的路。
    • SVM 非常合适,但最好使用一类分类器。我确定 SVM 有一类分类改编,但我不确定 libsvm 中是否有一类分类改编。杰,你呢?
    【解决方案3】:

    需要更多信息。

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

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

    (编辑:ICA 是 Blind Source Separation (BSS) 的一个例子,还有许多其他的 BSS 方法,搜索这些方法也可能会有所帮助。)

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

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

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

    编辑:由于您的背景噪音是非平稳的,因此我只能建议搜索Blind Source Separation of non-Gaussian sources 可能会导致您使用更多算法。恐怕答案是没有简单的算法可以满足你的要求。

    【讨论】:

    • 背景噪声非平稳。您可以在农场中找到背景噪音吗:风、雨、机械和其他动物。
    【解决方案4】:

    如果我是你,你会开始阅读一些关于 Window Functions 的信息,比如汉明窗,这是声音识别的一个很好的起点。 (当然是结合Fourier Transformation

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 卷积在某些条件下相当于匹配滤波器,包括离散时间信号。但是,由于我正在处理连续时间信号,因此您的答案很好。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        我个人觉得这篇论文General sound classification and similarity in MPEG-7 很有趣。但是,它可能在付费墙后面(我不知道),并且在实践中可能没有那么有用。

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

        否则我唯一的想法是进行傅里叶变换,有效地将您的声音转换为灰度图像。然后使用众多image similarity algorithms 之一。

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

            您可能需要Wiener filter 方法。

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                • 请添加一个可行的解释,而不仅仅是一个指向(现已失效的)场外资源的链接
                猜你喜欢
                • 2020-08-12
                • 2014-04-20
                • 1970-01-01
                • 2016-07-03
                • 2021-09-26
                • 2012-09-16
                • 1970-01-01
                • 1970-01-01
                • 2018-10-01
                相关资源
                最近更新 更多