2

我将如何实施像下面 WinAmp 中的频谱分析仪?

Winamp 中的“均衡器条”示例

仅通过查看,我认为这些条被渲染以显示传入音频数据的特定频段的“音量级别”;但是,我不确定如何实际计算绘制条形图这一相当简单的任务所需的数据。

据我所知和理解,计算这些值可以通过使用 FFT 来完成——但是,考虑到输入数据的缓冲区,我不完全确定如何计算这些值——我在 FFT 的正确轨道上吗?我将如何对输入数据应用 FFT 并从 FFT 中获取一个整数,该整数表示特定频带的“音量”?

绘图部分不是问题,因为我可以直接绘制到我的帧缓冲区并将其渲染出来。我在 FPGA 上做这个项目,使用 Nios II 软 CPU,以防有人想知道潜在的硬件限制。音频数据以 96kHz 的 24 位数据形式出现。

4

2 回答 2

6

您可能正在寻找FFTw

编辑:

详细说明您的问题:

可以通过使用 FFT 来计算这些值——但是,给定输入数据的缓冲区,我不确定如何计算这些值:是的,你是对的;这正是它的完成方式。由于时频不确定性原理,您需要一个(必然很小) 从当前播放的音频数据中采样片段,并将其馈送到(通常)离散的、仅实数的 FFT(最著名、最广泛使用和最快的是 DCT 系列的 DFT 之一 - 实际上有高度优化FFTw 中大多数 DCT 的版本)。然后取出下一个样本片段并重复该过程。FFT 的输出将是输入的音频信号的频率分解 - 然后您需要决定如何显示它(即在 FFT 的输出上使用哪个函数,常见的候选者是 f(x) = x; f(x) = sqrt(x); f(x) = log(x)) 以及如何呈现/动画以下读数(例如,您可以在时间方向上平均每个波段,或者您可以有最大值“慢慢脱落”)。


愤怒编辑:附加链接,因为似乎有人知道如何投票但不知道如何使用谷歌:

于 2013-03-10T08:39:31.780 回答
0

这很简单——只需使用众多 FFT 算法中的一种!它们中的大多数都需要浮点计算,但谷歌搜索会显示只有整数的方法。不过,您是正确的,FFT 就是您想要的。

要了解如何应用 FFT,您应该阅读有关离散傅立叶变换的此页面,尽管它在数学上相当繁重:

要在您的 FPGA 上实现它,我将查看该项目的源代码:

这是之前的 SO question,它总结了它的工作原理(使用任何语言)。

关于创建所谓的“频谱分析器”的信息量很大,必须有几十个完整的实现,源代码是免费的。例如,只需通过谷歌搜索“频谱分析仪源代码 C”。

于 2013-03-10T08:24:50.650 回答