微控制器的简单节拍检测算法

信息处理 声音的 算法
2022-01-02 07:16:22

为了控制 DIY 迪斯科灯光,我正在考虑在计算能力有限的微控制器(即 Arduino Uno)中实现节拍检测。虽然检测所有节拍将是一个加分项(其中之一,它可以测量 BPM,可用于根据音乐风格调整灯光),但此应用程序并非绝对需要,因为灯光设置通常必须以很大的速度更改频率低于节拍。所以我真正关注的是检测音乐中的“显眼”事件(节拍、空白后恢复等)以同步光线变化,但没有 100% 的可靠性。

约束如下:

  • 可用的计算能力有限。Uno 基于ATmega328 8 位 16MHz MCU。如果这太受限制,我可以考虑使用基于AT91SAM3X8E 32 位 84MHz Cortex-M3 MCU 的 Due。
  • 嘈杂的声音输入。理想情况下,声音会用一个小巧便宜的麦克风来捕捉。我还不确定 Uno 可以达到什么采样率。无论如何,我希望信号相当嘈杂。如果这被证明是必需的,我可能会考虑实施适当的声音输入(例如,使用坚固的音频屏蔽),但如果可能的话,我宁愿避免这种情况,因为连接音乐播放设备(可能有几个)的限制灯光控制电子设备。
  • 理想情况下,该算法将有一个参数来调整对节拍事件检测的灵敏度。这样,灵敏度可以自动增加,以确保即使在恶劣的条件下(低音量、对话噪音等)也能检测到事件。

我的问题是:

  1. 什么(类)算法适合这个应用程序?
  2. 是否有任何可用的实现可以很容易地集成到 Arduino 项目中?
2个回答

我在 matlab 中做了一个非常简单的 bpm 计算,也许它可以帮助你!

资源

脚步:

  1. 使用 DWT 将信号分解为六个频段(六级)

  2. 从所有子带中提取包络

    • 要进行包络计算,您需要:
      • 应用全波整流
      • 应用低通滤波器
      • 应用下采样
      • 应用均值去除
  3. 自相关

我认为你可以很容易地做到这一点:

  • 从低采样率开始(仅仅因为没有高采样率的理由)。
  • 使用低通滤波器消除~100 Hz 以上的信号。(您必须尝试找到正确的截止频率)。
  • 创建一个信封(可选)。这样做将有助于确保每个节拍看起来像一个节拍,而不是许多单独的打击。
  • 阈值信号——高于某个水平的任何东西都是“节拍”,低于一定水平则不是。调整阈值是您的灵敏度控制。

有关低通滤波的更多信息,请参阅我关于音频 eq 的博客文章:http: //blog.bjornroche.com/2012/08/basic-audio-eqs.html

要创建一个信封,您只需要获取每个样本的绝对值(或平方),然后执行类似的操作

y[i]={x[i],x[i]>y[i1]y[i1].99,x[i]<=y[i1]