【问题标题】:Calculate values for spectrum analyser [duplicate]计算频谱分析仪的值 [重复]
【发布时间】:2013-03-10 07:32:23
【问题描述】:

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

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

据我所知和理解,可以通过使用 FFT 来计算这些值——但是,鉴于输入数据的缓冲区,我不确定如何计算这些值——我是否走在正确的轨道上关于 FFT?我如何对输入数据应用 FFT 并从 FFT 中获取一个整数,表示特定频段的“音量”?

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

【问题讨论】:

  • 条的长度与特定通道的功率峰值的对数成正比。

标签: c equalizer


【解决方案1】:

您可能正在寻找FFTw

编辑:

详细说明您的问题:

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


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

【讨论】:

  • 我不明白为什么可以说最著名的 FFT 库的官方网站停机是我的责任。你知道如何使用谷歌吗?然后你应该能够访问页面的缓存版本,而不是给出毫无意义的 -1。
  • @Zeta 这比您给出的(恕我直言)脑残的原始原因要好。我会详细说明。
  • 您必须承认,指向离线(或在某个未来可能会离线)资源的答案基本上(恕我直言)是无用的。另见meta.stackexchange.com/questions/8231/…;但是,由于您已经开始详细说明,因此我删除了我的反对票。顺便说一句,知道如何使用缓存站点,但将来可能访问此页面的其他人可能不知道。答案不仅适用于当前的 OP,也适用于未来的读者!
【解决方案2】:

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

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

要在您的 FPGA 上实现它,我想看看这个项目的源代码:

这是之前的一个 SO 问题,总结了它的工作原理(任何语言)。

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

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多