从 Arduino 中的 FFT 检测特定模式

问题描述 投票:0回答:2

我有一个来自麦克风的 FFT 输出,我想从中检测特定动物的嚎叫声(它在特征频谱中嚎叫)。有没有办法在 Arduino 中实现模式识别算法来做到这一点?

我已经有了它的 FFT 部分,可在 2kHz 采样率下处理 128 个样本。

audio arduino pattern-matching audio-fingerprinting
2个回答
3
投票

查找音频指纹...本质上是探测 FFT 调用的频域输出,并拍摄频率范围的快照以及每个频率的幅度,然后在已知动物信号和未知信号之间进行比较,并输出这些信号的测量值差异。

当未知信号是您实际的已知信号时,这种差异自然会接近于零

这里是另一层:为了获得更好的保真度,而不是对整个可用音频执行单个 FFT,请执行多次 FFT 调用,每个调用都使用样本的子集......对于每个调用,将此样本窗口进一步滑动到音频剪辑中。假设你的音频剪辑是 2 秒,但在这里你只发送到 FFT 调用中 200 毫秒的样本,这会给你至少 10 个这样的 FFT 结果集,而不是只有一个如果你吞掉了整个音频剪辑......这给了你您可以了解时间特异性的概念,这是一个附加维度,可以通过它得出已知信号和未知信号之间更丰富的数据差异...进行实验,看看是否有助于将窗口稍微滑动一点,而不是将每个窗口首尾相连

明确地说,您有一系列频率,例如分布在 X 轴上,然后沿着 Y 轴,当您按照上面的段落改变样本窗口时,您可以从音频剪辑中提取不同时间点的每个频率的幅度值......现在你有了一个二维数据点网格

再次增强置信区间,您将需要在已知源动物嚎叫的几个不同音频片段中针对每个未知信号执行上述所有操作,因此现在您拥有一个三维参数景观...正如您可以看到的那样您可以聚集的额外维度将提供更大的牵引力,从而获得更准确的结果

从容易区分的已知音频和非常不同的未知音频开始...例如已知音频信号的 50 Hz 正弦曲线音调与未知音频信号的 8000 Hz 正弦波...然后尝试用您已知的吉他单次扫弦并使用未知的小号...然后继续使用实际的音频剪辑

Audacity 是业界一款出色的免费音频工具 - 它可以轻松绘制 WAV 文件以显示其时域信号或 FFT 频谱图...Sonic Visualiser 也是一款顶级工具

这不是一个简单的灵丹妙药,但是您添加到解决方案中的每一层都可以给您带来更好的结果……这是一个您正在制作的过程,而不是要挤压的单维触发器。


0
投票

FFT 是音频特征提取的良好起点。 2khz 下的 128 个样本长度代表 64 ms 的音频。如果仅使用如此短的瞬间的频谱就可以将感兴趣的声音与其他声音分开,那么这就是您所需要的核心。

不过我建议尝试一下。音频分类中最标准的方法是使用梅尔滤波器。然后,您可以将 128 点 FFT 减少到 32 或 16 个频段,这将简化进一步的处理。另一种选择是 1/3 或 1/1 倍频程滤波器。两者均以 FFT 箱的加权和的形式实现。

为了处理幅度差异,也可能需要使用平均值或最大归一化来归一化频谱。

通过收集猫头鹰叫声和使用过程中可能发生的其他声音的小型代表性数据集来查看声音是否可分离。数据集应标有感兴趣的声音发生位置的指示符。

需要训练分类器并评估性能。一个非常简单但有效的分类器是K 最近邻 (KNN)。评估可以在 Python 中使用 scikit-learn KNN 完成。

微控制器机器学习库emlearn支持Arduino并具有Mel过滤器的实现,以及与scikit-learn兼容的KNN分类器。

© www.soinside.com 2019 - 2024. All rights reserved.