这是一个两年前的问题,但我想我会为那些可能会发现它进行搜索的人添加一点。
当您谈论频谱图时,实际上需要考虑两个步骤。首先是从信号转换为 DFT bin 值,第二个是在像素显示器中显示这些 bin 值。
理想情况下,频率增加的纯音的频谱图应该形成一条坚实的、不变的、向上倾斜的曲线。DFT 本质上不是这样工作的。当您处于整个整数频率(以每帧的周期数而言)时,有一个 bin 值,其余的为零。当您处于整数频率之间时,bin 值会分散,这通常称为泄漏。我的建议是在进行 DFT 之前对信号使用 VonHann 窗口。根据您的缩放比例,这相当于从每个 bin 值中减去两个相邻 bin 值的平均值。这具有“收紧”泄漏和“散开”尖峰的效果。与帧长度相比,这使得显示看起来更加一致,与频率值无关,
DFT 中的相位值取决于帧,因此对显示没有太大帮助。相反,您应该专注于根据 bin 的大小进行强度显示。您不限于线性映射或对数映射。无论如何,您都将希望使用查找表来加快处理速度,因此您几乎可以定义一个按您想要的方式工作的单调递增函数。使用时可以使用单色色标,也可以使用变色色标。标准绿色代表低,黄色代表中级,红色代表强烈,很容易理解。
您需要做出的第二个选择是垂直轴刻度。这两个逻辑选择是线性的,这是 DFT 固有的。或对应于音阶的对数。无论哪种情况,您都需要将一个或一组 bin 映射到一个像素或一组像素,具体取决于比例尺该部分的放大率。同样,在实践中,您将为此映射构建查找表。
上述考虑中最合适的选择是那些能够为您提供所需视觉结果的选择。您不会根据显示值进行计算,因此“扭曲”这些值(即非线性映射)以提供更好的视觉效果是没有问题的。
DFT 系数的值实际上具有物理意义。发现这是我理解 DFT 的一个重要时刻。DFT bin 值实际上是一组单位根的加权平均值,其中信号值是权重,它们被“包裹”在单位圆周围。bin 索引是以根为单位的步长,因此也是函数被拉伸并围绕圆缠绕的次数。例如,假设您的信号中有五个凸起。当被拉伸五次并围绕圆圈缠绕五次时,所有的凸起都会对齐并将质心朝那个方向抛出。另一方面,当它被拉伸四倍并缠绕四次时,凸起均匀分布并相互抵消。这就是 DFT “采摘”的方式
我写了一篇博客文章“DFT 图形解释:Unity 加权根的质心”来解释这一点。
篇幅够长,希望对大家有所帮助。
赛德