我对音频数据使用 FFT 来输出分析器,就像您在 Winamp 或 Windows Media Player 中看到的那样。然而输出看起来并不那么好。我使用对数刻度进行绘图,并将 FFT 的线性结果平均到相应的对数箱中。例如,我使用的垃圾箱如下:
16k,8k,4k,2k,1k,500,250,125,62,31,15 [赫兹]
然后我绘制幅度 (dB) 与频率 [hz] 的关系。该图确实对音乐做出了“ react ”,我可以看到鼓样本或高音调的响应。但该图在接近较低频率时非常“饱和”,并且总体看起来与您在应用程序中看到的不太一样,应用程序往往分布更均匀。我觉得显示视觉输出的应用程序往往会对数据执行不同的操作,以使其看起来更好。
我可以对数据执行哪些操作,使其看起来更像典型的音乐播放器应用程序?
一些有用的信息: 我下采样至单 channel 32kHz,并指定 35ms 的时间窗口。这意味着 FFT 获得约 1100 点。我改变这些值进行实验(即尝试 16kHz,并增加/减少间隔长度),但我得到了类似的结果。
最佳答案
使用 1100 点的 FFT,您可能无法以较高的频率分辨率捕获低频。
想一想,30 Hz 对应于 33ms 的周期,在 32kHz 下大约是 1000 个样本。因此,您此时只能捕获大约 1 个周期。
因此,您需要更长的 FFT 窗口来捕获具有清晰频率分辨率的低频。
您可能需要 4000 个样本或更多的时间窗 Eloquent 能开始在低频处获得明显更高的频率分辨率。这也没什么问题,因为您仍然会每秒获得大约 8-10 次频谱更新。
如果您想要非常快速地更新高频箱,但想要在低频处获得良好的频率分辨率,还有一个选择是更快地更新高频箱(例如使用您当前使用的窗口)但计算低频箱的频率较低(并且需要较大的窗 Eloquent 能获得良好的频率分辨率。)
关于c++ - 改进音乐频率分析仪的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829713/