你能给出使用单箱滑动 DFT 的示例应用程序吗?

信息处理 过滤器 离散信号 频谱 自由度
2022-01-30 04:09:20

我需要实时检测单音信号。单音信号的幅度和相位随时间变化。我想检测信号的幅度和相位。我不想做 FFT,因为我只需要查看单个频率仓,而且 FFT 不适合实时应用。我看到有滑动 Goertzel 和滑动单 bin DFT 方法。这些方法似乎很容易应用,并且与 DFT 相比,它们都需要非常少的计算。但是,它们似乎存在稳定性问题。一些阻尼因子用于解决稳定性问题。但是,我对滑动 DFT 方法仍有疑问。应用单箱滑动 DFT 时有什么需要注意的地方吗?您能否举例说明使用单箱滑动 DFT 的真实世界应用程序?

2个回答

我不想做 FFT,因为我只需要查看单个频率仓,而且 FFT 不适合实时应用。我看到有滑动 Goertzel 和滑动单 bin DFT 方法

FFT 只是 DFT 的一种实现因此,出于同样的原因,您不需要 FFT,您也不需要任何其他 DFT。

Goertzel 基本上是一种获得任何 DFT 都会给您的相同结果的方法,但仅针对单个 bin,确切地说。当在并行硬件中实现时,Goertzel 的延迟与整体 DFT 相同,只是资源使用较少。在软件中,您会使用大量操作。

为了检测单个音调,我在这里的建议只是一个带有感兴趣音调的相关器(恰好与匹配滤波器相同)。基本上,取您感兴趣的音调,并将其用作过滤器抽头(应用窗口来品味)。您可以轻松地将单个样本转移到这样的过滤器中。如果你不加窗(==矩形窗)并将一个复杂的正弦曲线与整数个样本作为周期进行卷积,你会得到作为单个 bin DFT 得到的结果:它是相同的公式。

然而,整个事实是,对于每个新样本是否存在周期性信号,您并没有真正得到有用的估计 - 无论您如何扭曲和转动它,它始终是一个降低速率的操作(n样品进入,1 出去)。

因此,您可能需要考虑您对“实时检测”的定义。一个样本如何改变信号中存在 200 个样本长的周期性这一事实?

根据你在什么上实现它(FPGA?ASIC?DSP?MCU?PC风格的计算机?),你会想要选择不同的实现,无论如何你会在缓冲区中获取样本——所以,我'我会在这里冒险并声称如果您正在编写软件,您可能可以使用简单的窄带 FIR(并且您可以调整带宽和过渡宽度以使您的检测器对频率的轻微偏差具有鲁棒性),并且使用基于 FFT 的快速卷积来实现通常是最有效的。

由于计算和/或状态存储中的舍入和量化噪声(由于从大幅度中减去小幅度等),可能会引入运行移动平均线、滑动 Goertzel 和滑动 1-bin DFT 方法的稳定性问题。这个问题可以通过钳位输出状态、使用略小于 1.0 的增益或定期重新启动具有足够重叠的滤波器来减少。

Goertzel 和 1-bin DFT 计算在任何需要远小于 FFT 结果的 log(N) 的情况下都很有用,这只是计算完整 DFT 的一种快速方法。