小范围音频频谱的二进制分类器

信息处理 沥青
2022-01-25 04:22:06

我正在尝试用最少的样本检测音频频谱的窄范围内的音高。这对应于某些机械系统的嘎嘎声。例如,发动机的嗡嗡声。

为此,我希望确定在某个范围内是否存在频率,例如 550hz-555hz。

  1. 我与一位博学的人就这个问题进行了交谈,他提到 FFT 有一种变体,它只针对所需的频率范围。这个叫什么?

  2. 我希望通过在频域中区分峰值和白噪声来避免幅度(音量)训练期。谁能指出一个可调参数,使我能够确定某个范围是否有峰值?我正在考虑将最大高度与平均值进行比较。

  3. 我想知道是否有人知道这样做的好方法。

3个回答

它可能是Goertzel 的算法,尽管它着眼于单个频率而不是特定频段。

另一种方法是应用调制技术将您感兴趣的范围的中心频率转移到基带中,也就是“缩放 FFT”

您对最大平均比率的直觉很好。另一个“峰值”指标是几何平均值与算术平均值的比率

几点

  1. 我会仔细验证基本假设:大多数发动机噪音、嗡嗡声或嗡嗡声都有很多谐波,因此范围很广。基本面很少是其中最强的组成部分。
  2. 5 Hz 似乎是一个非常窄的带宽。您每秒只能从狭窄的信号中获得 10 个独立样本。因此,如果您需要 50 个样本来做出决定,则需要 5 秒。
  3. 您可能对“瞬态事件”更感兴趣,即嗡嗡声开始或停止。瞬态噪声比稳态噪声具有更高的带宽(并且可能更容易检测)。
  4. 一种方法是“向下混合”。将信号正弦波(例如 550 Hz)相乘,然后使用所需带宽(例如 5 Hz)进行低通滤波器。然后,您可以根据需要进行下采样

算法的一个建议

  1. 将信号与 550Hz 相乘
  2. 通过 5 Hz 的低通滤波形成 x[n],测量能量
  3. 通过 50 Hz 的低通滤波器形成 y[n],测量能量
  4. 如果 x[n] 和 y[n] 的能量大致相同,那么你的引擎是开启的,否则它是关闭的

它是这样工作的:您查看信号的频谱,其中心频率周围的带宽为 10Hz 和 100Hz。如果频谱大部分是白色(或音频通常是粉红色),则 100Hz 频带中的能量应该是 10Hz 频带中能量的大约 10 倍。现在,如果您在 10 Hz 频带中有一个非常窄但很强的频谱分量,那么这也将主导 100 Hz 频带中的能量,因此两个频带中的能量将大致相同。

如果您正在寻找“音高”,例如振动周期性,而不是频谱频率(这是两个不同的东西),那么请忘记使用 FFT 或 Goertzel 算法,因为这些仅在周期性信号的基频清晰且总是最强的频谱元素(与所有可能的谐波相反)。对于某些类型的系统“嘎嘎作响”,系统响应可能会比振动脉冲频率更强烈地将一个或多个谐波传递出系统。

对于振动音高,请尝试自相关(或相关的 AMDF 或 ASDF 方法)并在您希望识别的频率的周期性范围内(例如,您的示例中为 1.802 到 1.818 mS)寻找时间滞后的峰值。找到具有这种精度的峰值所需的窗口大小将取决于您的信噪比。

如果您已经对背景噪声进行了表征,则可以根据该噪声的统计数据并根据您所需的错误率,为高于背景的峰值设置一个阈值。