实时检测三音信号

信息处理 matlab fft Python 特别提款权
2022-01-29 02:10:53

我是数字信号处理的新手,我一直在研究 FFT、滤波、Matlab 等。我想要构建一个程序来检测何时通过集群语音通道传输某个BEEP(它表示通过 SDR 接收即将发生的关键消息)。通过 FFT,我确定它由三个频率(500Hz、600Hz 和 700Hz)组成。本质上——有点像用 DTMF 打电话——我想监控音频是否存在这种哔哔声,并让软件识别何时发生这种情况。

我担心的是语音传输会导致这三个频率达到峰值,因此很难确定是由于警报声还是有人说话。

我相信这可以通过一些测量哔声长度的方法来完成,但是由于我在该领域的经验不足,这可能是一个误解。

我很感激任何建议,如果我的问题不能直接回答,请把我推向正确的方向。

显示色调一致性的图形输出

编辑:这是来自 WavePad 的系列的时间频率分析 时间频率分析

4个回答

我熟悉的方法已经在广播场景中使用了相当长的一段时间。您提到了您对语音信号“使”感兴趣的频率“达到峰值”的担忧。根据该声明,我假设您可以在语音活动期间传输信号。

这是方法:

在世代方面:

  1. 安排信号播放时间是分析的两倍。

在分析方面:

  1. 设置长度为刺激的 1/2 的非重叠 FFT。这可确保您的一个 FFT 最终将包含整个信号。
  2. 在每个 FFT 上,计算色调箱(包括作为加窗结果的相邻箱)的功率和、非色调箱的功率和,并对结果进行比值以提供 SNR。
  3. 如果该比率高于某个阈值,那么您已经检测到您的信号。您可以使用您对本底噪声和传输音级的先验知识来确定您的阈值。

您可以做几件事来改进:

  1. 调整生成信号的相位以降低波峰因数。
  2. 选择 3 个信号频率和/或 FFT 长度,使频率落在 FFT 箱的中心。如果您的发生器和分析仪是同步的,这将允许您完全避免 FFT 加窗。

如果您确切知道要寻​​找什么(已知持续时间、频率、相对相位/幅度的 3 个正弦波),也许您可​​以简单地将其用作匹配滤波器中的模板,将其他任何东西视为噪声和临时找到合适的阈值?

运行数千个抽头的全速率卷积可能看起来很昂贵。认识到您的信号带宽只有 200Hz,也许您可​​以先下采样到 400Hz,然后使用 FFT 进行实际的 MF 卷积?

Goertzel 算法是 DTFM 中常用的 DFT 的轻量级替代方案也许在您的情况下值得考虑。

  • 如果发射器遵循标准,或者您可以通过某种方式确定音调将存在固定的时间,那么您可以将其用作检测标准之一。

  • 另一个标准可能是在一段时间内具有相同(或非常接近)能量的三个音调。声音很有活力;这三个特定的音调不太可能具有相同的能量。

  • 您还可以查看其他一些频率(例如 400 和 800 Hz)并验证信号在那里没有能量。

如果需要改进检测,您可以同时计算所有这些信号特征,对它们进行加权,并根据权重做出最终决定。