来自 FFT 的 1/3 倍频程频谱

信息处理 fft 声音的 频谱
2022-02-02 18:22:29

我正在寻找使用 FFT 生成 1/3 倍频程频带的频谱。在阅读了本网站以及其他网站上的许多帖子后,我相信下面列出了适当的方法。我已经在 Excel 中进行了计算,结果看起来很合理,但合理不一定正确。

要问一个具体问题,我使用的方法是否有效?特别是,我质疑步骤 2 中应用的方法是否正确。

背景。 我正在对前置放大器输出的电信号进行采样,我的目标是以 dB 为单位的频谱。我的参考(dB 计算中的分母)是任意的,并选择为频谱输出显示设置适当的比例。我没有尝试从输出中进行测量,也不需要根据客观参考对其进行校准。我的项目将用 C++ 实现。

步骤 1. 从 48,000 Hz 的 1024 个样本 FFT(每个 46.9 Hz 的 513 个 bin)开始。结果是 N = 0 – 512 的 DFT,F n 单位为V。

请注意,通常情况下,我会通过将每个 bin 乘以 2/N 来标准化 FFT 输出(N 是样本数,即 1024)。然而,因为我们最终以 dB 为单位绘制相对于任意幅度的频谱,所以当我以 dB 为单位计算结果时,我在这里所做的任何归一化都会被冲走,所以我不会在我的项目中打扰它。

步骤 2. 将 DFT 转换为 1/3 倍频程。

我从这里获得了以下公式: https ://www.ap.com/technical-library/deriving-fractional-octave-spectra-from-the-fft-with-apx/

每个 1/3 倍频程频带的 V 幅度为:

八度带

其中L b是 V 中每个 1/3 倍频程频带的幅度,b = 1 到 32,g n,b是 FFT bin n 和 1/3 倍频程频带b的增益乘数:

增益乘数

其中f n是 bin n的频率,f b是频带b的中心频率。k是倍频程带宽指示符,1 表示全倍频程,3 表示 1/3 倍频程。

结果是L bb = 1 到 32 in V。

步骤 3. 忽略较低的频段。

在大约 250 Hz 以下,对于长度为 1024 的 FFT,每个频带内没有足够的 FFT bin 来使结果有意义。因此,我们忽略较低的频段,只保留从 b13 = 251 Hz 开始的 1/3 倍频程频段。

步骤 4. 将每个频段的幅度数据转换为 dB。

对于此计算,我正在计算相对于可能出现在任何频带中的近似最大幅度的 dB 值。这将是L ref

250 Hz 以上每 1/3 倍频程频带的最终 dB 值为:

低分贝

下面是单个g n,b项的示例(左侧下方为 FFT 箱,顶部为 1/3 倍频程): gbn 术语

协助、输入、更正和评论表示赞赏。谢谢!

1个回答

看起来你基本上已经明白了,但我确实注意到了一些事情。您可能希望包括对窗口的支持和相应的校正因子,如有关 FFT 噪声的 AP 文章所示。对于窗口常见的所有旁瓣类型解释,矩形窗口不适用于 RMS 类型测量(至少在我看来)。其次,我很确定你需要从 1 加到 N,而不是 N/2。您可能已经意识到,由于输入信号是真实的,因此存在不需要计算两次的冗余数据。这是真的,除了 0 和 N/2(如果 N 是偶数)箱。当然,这可能不会使输出太错误,但它会有点偏离。

编辑:你知道吗,AP 可能已经设计了这些系数,因此加窗要么是不必要的,要么弊大于利。您可能仍想尝试它,因为它很容易支持,但它可能无济于事。另外,我看不出这比直接在时域中进行计算在计算上的效率更高。