频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷。我用Winamp播放音乐(AOL已经在2013年12月20日停止了Winamp的支持),最早吸引我的原因就是播放界面上那个跳动的频谱,如图(1)所示。我一直想搞清楚这个实现原理是什么,直到我知道有离散傅立叶变换这个东西存在的时候才恍然大悟。
图(1)winmap上跳动的频谱
本篇先来说说频谱吧。既然是频谱,就一定和频率有关系吧?是的,那个跳动的频谱实际上就是当前播放的一小段片音频信息在频域上的功率分布。鼓声和弦乐的频率范围相差很大,当音乐中有震耳的鼓声时,频谱中中低频的部分就跳的很高,说明这部分频率的功率比较高。同样,当高亢的小提琴声音响起时,频谱中高频的部分就跳的很高,说明高频部分的功率比较高。正是因为这个关系,频谱总是和正在播放的音乐“相映成趣”。
要在播放器中显示跳动的频谱,就需要知道音频数据中各个频率对应的功率,常见的音频数据都是时域信号,需要转换成频域信号才能进行分析。在《听声音破解电话号码》一文中,我们介绍了离散傅立叶变换可以将时域的声音信号转换成频域的频率功率分布,并给出了相关的算法,这正是本篇要介绍的频谱显示的基础。
《听声音破解电话号码》一文中给出的PowerSpectrumS()函数,可以将