计算频谱分析仪的值 [重复]
Posted
技术标签:
【中文标题】计算频谱分析仪的值 [重复]【英文标题】:Calculate values for spectrum analyser [duplicate] 【发布时间】:2013-03-10 07:32:23 【问题描述】:我将如何实施像下面 WinAmp 中的频谱分析仪?
仅通过查看,我认为这些条被渲染以显示传入音频数据的特定频带的“音量级别”;但是,我不确定如何实际计算绘制条形图这一相当简单的任务所需的数据。
据我所知和理解,可以通过使用 FFT 来计算这些值——但是,鉴于输入数据的缓冲区,我不确定如何计算这些值——我是否走在正确的轨道上关于 FFT?我如何对输入数据应用 FFT 并从 FFT 中获取一个整数,表示特定频段的“音量”?
绘图部分不是问题,因为我可以直接绘制到我的帧缓冲区并将其渲染出来。我在 FPGA 上做这个项目,使用 Nios II 软 CPU,以防有人想知道潜在的硬件限制。音频数据以 96kHz 的 24 位数据形式出现。
【问题讨论】:
条的长度与特定通道的功率峰值的对数成正比。 【参考方案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)) 以及如何呈现/动画以下读数(例如,您可以在时间方向上平均每个波段,或者您可以有最大值“慢慢地掉下来)。
愤怒编辑: 附加链接,因为似乎有人知道如何投票但不知道如何使用谷歌:
http://en.wikipedia.org/wiki/FFTW http://webcache.googleusercontent.com/search?q=cache:m6ou54tn_soJ:www.fftw.org/+&cd=1&hl=en&ct=clnk&gl=it&client=firefox-a http://web.archive.org/web/20130123131356/http://fftw.org/【讨论】:
我不明白为什么可以说最著名的 FFT 库的官方网站停机是我的责任。你知道如何使用谷歌吗?然后你应该能够访问页面的缓存版本,而不是给出毫无意义的 -1。 @Zeta 这比您给出的(恕我直言)脑残的原始原因要好。我会详细说明。 您必须承认,指向离线(或在某个未来可能会离线)资源的答案基本上(恕我直言)是无用的。另见meta.stackexchange.com/questions/8231/…;但是,由于您已经开始详细说明,因此我删除了我的反对票。顺便说一句,我知道如何使用缓存站点,但将来可能访问此页面的其他人可能不知道。答案不仅适用于当前的 OP,也适用于未来的读者!【参考方案2】:这非常简单 - 只需使用众多 FFT 算法中的一种!它们中的大多数都需要浮点计算,但谷歌搜索会找到仅使用整数的方法。不过,您是正确的,FFT 就是您想要的。
http://en.wikipedia.org/wiki/Fast_Fourier_transform要了解如何应用 FFT,您应该阅读有关离散傅立叶变换的此页面,尽管它在数学方面相当繁重:
http://en.wikipedia.org/wiki/Discrete_Fourier_transform要在您的 FPGA 上实现它,我想看看这个项目的源代码:
http://qt-project.org/doc/qt-4.8/demos-spectrum.html这是之前的一个 SO 问题,总结了它的工作原理(任何语言)。
How to generate the audio spectrum using fft in C++?关于创建所谓的“频谱分析器”的信息非常多,必须有几十个完整的实现,其中源代码是免费提供的。例如,只需通过谷歌搜索“频谱分析仪源代码 C”。
【讨论】:
以上是关于计算频谱分析仪的值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章