充分表示信号 FFT 的频域幅度/幅度

信息处理 fft 频率 振幅 震级
2022-02-06 20:34:12

我对这个主题很陌生,玩 FFT 很有趣。我目前正在做的是尝试对音频信号进行采样并同时显示其频谱。到目前为止,这对我所做的一切都很好,但是仍然缺少一些拼图。

这是我迄今为止实施的:

  • 我得到原始音频数据(即我的信号)并以 44.1 kHz 的采样频率对其进行采样。
  • 对于我更新频谱的音频文件的每个时间实例(例如,每 1/24 秒),我从时间实例周围的采样信号中获取一定数量的样本,对其应用窗口函数(汉恩窗口)和然后我使用 fftw 库对其进行转换。
  • 然后我看看我得到了什么。由于我所有的输入数据都是真实的,我得到 n/2 + 1 个复数值,我在那个假设中是否正确?
  • 现在,我想展示这个光谱。我使用 l2-norm 计算每个 n/2 + 1 个向量的大小并尝试显示它。

最后一部分是我确定如何进行的地方。首先,我计算的这个幅度是在频域中被称为幅度还是我把东西混在一起了?据我所知,我转换的窗口中原始信号的幅度以某种方式分布在我的频谱中(即我的频率区间)。我正在寻找的是一个很好的映射,以便很好地显示这些频率箱(事实上......我总是将一些组合在一起以获得更大的频带)。这是我想做的:对于我的可视化,我有 12 个波段,每个波段有 15 个离散级别。到目前为止,我所做的实际上是试图将频带中所有 bin 的最大值映射到 {0,1,...15}。

到目前为止,我一直在玩,尝试对数和线性映射之类的东西,但似乎没有一个能给我我期望的结果。例如,较低的频率可能具有非常高的幅度,而较高的频率相对较低,即使相应的音频信号会让我期望较高频段的幅度更高。

所以我的主要问题是,这可能主要是因为我总是选择最大值吗?一个带中所有 bin 的平均值会更好吗?

我的直觉告诉我,这只是冰山一角。例如,线性变换很难调整,因为我在动态计算频谱时不知道最大频率幅度是多少。

如果你们中的一些大师可以帮助我了解我所缺少的东西,我将不胜感激,也许,告诉我我正在做的事情是否有任何可怕的错误,直到我想要可视化计算的光谱。

干杯!

3个回答

将多个 bin 组合在一起的正确方法是将每个复数 fft bin 输出乘以其复共轭(给出 bin 功率),然后将所有 bin 功率相加并除以组中的 bin 数量。如果要在 db 中显示(这是传统方法),则取 10*log10() 的结果。负分贝值是正常的和预期的。

请注意,如果您的音频信号是音乐,频谱随频率下降是很正常的。

同样从您的描述来看,您似乎没有使用 2 ^n 点数。最好坚持使用 2^n 数据缓冲区大小,以最大限度地提高 fft 计算的效率。

鲍勃

我过去做了相当多的频率内容可视化,虽然我面前没有代码......对不起,我没有更多时间,但我认为这可能会有所帮助,所以这就是我的记起:

  1. 首先,我不确定这是否是让您头疼的部分原因,但是由于通过 FFT 运行的真实信号没有复杂(相位)信号分量,因此您的频谱将被反射为 0,你真的只想要值 >= 0; 所以,通常这意味着你只会丢弃一半的 FFT 信号。(我不是 100% 确定,但我相信这将取决于您在这些位置使用的 FFT,IIRC 我通常从 0-n/2 中取值......)不仅反射最终会抛出你关闭,但是选择错误的一半(或两者一起)可能会导致您看到的低频似乎很高,反之亦然。

  2. 一个超级简单的功率谱很容易:你可以取每个 bin 幅度的平方。对于复数x+iy幅度由下式给出x2+y2,因此幂就变成了x2+y2. 因此,对于代码中的一个复杂点,这相当于将 和 的平方point.real相加point.imaginary

  3. 虽然我认为如果你想要绝对功率箱,下面的一些链接会对你有所帮助,但我习惯于使用相对 dB 功率谱;IIRC 我们称我们的计算为 dBm 或 SNR(信噪比)估计,尽管我认为这有点捏造……为此,在 FFT 箱中找到最大功率值并从那里缩放,0分贝在顶部。所以,再次IIRC,找到pmax然后每个点由10log10(ppmax). 这为您提供了一个顶部为 0 dBm 的图,并且最低值可以随运行而变化。所以你实际上最终得到了所有 0 或负值,因为你计算的是从最高功率箱开始的近似“dBm down”,而不是在这种情况下的绝对功率;这就是我们测量信噪比的方式。(作为参考,每增加 3 dBm 代表功率翻倍;因此下降 3 dBm 代表大约下降 50%。)

  4. 我们绝对总是使用二次方 FFT,它们通常要快得多;如果这些数据不足以做很多事情,只需将您的 FFT 平均起来;我认为您可能会在原始平均值方面获得相当好的运气,但是如果您想要或需要一些严谨性,下面的链接可能会帮助您更加严格。:)

  5. 不要忘记您的第 0 个 bin 是信号的直流分量,换句话说,是与频率无关的信号功率;您可以在进行 FFT 后将其屏蔽掉(计算量要小得多,但它可能(或可能不会)产生一些不良影响,具体取决于您的应用程序绕过或忽略任何严格的 DSP 技术[例如使用窗口函数].. . (虽然 TBH 我做了一些非常密集的 DSP,但我敢肯定没有它理论上会更糟,但它的工作速度大约是 5 倍,并且给了我们同样好的结果,所以,一如既往,YMMV。)

  6. 并且不要忘记(就像我一样:D)为您的数据设置下限;只需遍历所有数据点并选择一个数字(可能降低 60 或 90 分贝,例如 -60 或 -90)以及低于该数字的任何值,设置为该数字。

希望这能让你开始一点,我知道当我第一次做这种事情时得到了很多帮助,玩弄平均值、FFT 大小等,只看结果应该会有所帮助;听起来你在正确的轨道上。

[The Mathworks] 上有关于这种绘图的很好的信息......(http://www.mathworks.com/help/signal/ug/psd-estimate-using-fft.html)似乎还有一个非常很好地总结了您需要了解的有关窗口函数的知识以及WaveMetrics与此相关的功率谱处理的更多详细信息。

频谱分析仪的完整示例从本文的第 4-34 页开始(非常感谢马里兰大学电气与计算机工程系名誉教授 Steven Tretter 博士提供的良好资源,而不仅仅是顺便说一句,任何人都可以从中学习理论!)不幸的是,webcite 目前对我不起作用,所以希望有人可以在某个时候抓取一个 webcite,以防它移动。

警告购买者:我已经有一段时间没有进行频域分析了,它是超声波和卫星信号,而不是音频;但是,这里的原则应该是相同的......

[编辑日志: 2013-03-05: 1. 能够从 Dr. Tretter ( http://www.ece.umd.edu/faculty/tretter ) 那里获取论文的网络引用,我会尝试为稍后也是如此)以及来自 WaveMetrics 的 Power Spectra 页面,在站点再次停止接受请求之前,所以,是的!2. 扩展了我回答 Brick (OP) 关于 FFT 信号的第 0 个 bin(DC 分量)的回答的问题的评论,以使将来可能遇到此问题的任何其他人受益;3. 在我(5 年)使用 DSP 和卫星信号工作期间,快速提及一些现实世界的实用主义与理论。2013-03-06:添加了关于上限值 RE:OP 问题的信息。]

许多音频 FFT 可视化使用对数(幅度)而不是线性,因为这样可以更容易地找到使数据在图表中可见的比例。

包含多个 FFT 结果箱的波段中包含的能量将是总和,而不是最大值。

如果您为每个 FFT 抓取的“一定数量”的样本是每 1/24 秒样本的一小部分,那么您可能需要对适合该显示帧时间的几个 FFT 窗口的幅度进行平均。