MP3格式音乐通过Foobar播放显示频谱图为柱形图,采样间隔频率较大,那么MP3是否携带频谱信息是间隔采样的?频谱并不连续,那么无损格式的呢?

或者各种格式采样间隔频率大约是多少?


呃。。。这个问题骚到我的痒处了,不请自来。

首先,这个问题其实是一类问题的代表,初学傅里叶变换的人很容易弄混其中的区别。我也是看过一本非常厚的专门讲解傅里叶变换的书中到最后一章才专门提到这个问题,即动态功率谱。
其前言里面提到了一个问题,那就是按照数学理论,任何时域信号都可以被转换为频域信号。但是就拿人耳来说吧,当你在某一时刻听到小提琴声响起,为什么你知道它是什么时候响起的?因为实际上数学终究是数学,数学告诉你理论上可以将所有的信号都用频域表示,但是如果离开了时间的概念傅里叶变换也将一无是处——想想看,人耳为什么能够知道小提琴是什么时候拉响的?因为人耳并不是一个一直在接收声压然后转换成人类能够理解的频率信号的器官,而是将时间分割成小段,每一段分别计算出这一段(打个比方说,0.1ms以内)的频率信息(频谱),然后就能知道这一刻的外界声音是什么——就像眼睛能够将每秒24帧的图片理解为动态的电影一样,人耳转换出的每一段的频率信息就像一张图片,通过时间串联起来,就形成了听觉上仿佛电影一般的效果。而频谱图,实际上是将本属于听觉上的信号以动态图像的形式展现出来,为我们研究声学问题提供了重要的参考。

接下来会涉及到一些数字信号处理的基本内容。感兴趣的同学可以往下看,不感兴趣的可以跳过。

在频域下任何离散序列都可以使用离散傅里叶变换计算出与其一一对应的,完全可以反变换从而还原为时域信号的原序列的频域下的新的离散序列。如果转化为matlab语言,可以用以下代码来轻松地形容

xn=[4 3 2 6 7 8 9 0];
Xk=fft(xn)

Xk =

[39.0000 -10.7782 + 6.2929i 0 - 5.0000i 4.7782 - 7.7071i
5.0000 4.7782 + 7.7071i 0 + 5.0000i -10.7782 - 6.2929i]

这是从网上随意摘抄的一段离散傅里叶变换的代码,该代码实现了一个时域的序列是如何被计算得到一个频域的序列。这里Xn是时域下的原序列(如果想要想象成CD或者是.wav文件中的数据,可以参考该处回答 http://www.zhihu.com/question/19829823/answer/13649695),Xk则是频域下的新的序列——当我们将Xk序列当中每个元素取模,即求每个元素实部与虚部的平方和的根之后,就得到了一个新的频谱。且命名该序列为Xk2,则Xk2就是Xn序列的频谱。取模的作用相当于计算在各个频率分量下的振幅信息,也就意味着Xk2频谱图只包含振幅信息。虽然也可以计算出相位信息,但是因为研究表明,人耳对相位信息并不敏感,所以只包含振幅信息的Xk2频谱图就足够满足音乐播放器的频谱仪或者准专业音频处理软件的显示需求了。

接下来,由上段的引用问答中最后一段来解释,主流的MP3和wav文件均采用了44100Hz的采样率,以及16位的采样精度,那么至于前面所问的,音乐播放软件到底是采用多长的一段来进行变换,或者说采用了之间间隔为多少的采样频率 ,从而得到一帧频谱图像呢?答案是无所谓。因为只要使用傅里叶变换就能对任意长度的频谱进行变换,而频率之间的间隔则与该长度呈正比,那么比如说,我们对每441次采样做一个离散傅里叶变换,那么1秒钟就可以得到100帧图像——但是实际上你能见到的播放软件绝对不会采用这么高的帧速,为什么?

因为一帧图像包含的信息量,只有441个元素,也就意味着Xn是个含有441个元素的离散序列。经过变换以后得到Xk2,也只含有441个元素(离散傅里叶变换前后不改变元素数量)。那么这441个元素代表着什么含义?可以理解为,第一个元素代表0Hz的振幅,第二个元素代表50Hz的振幅,第三个元素代表100Hz的频率分量的振幅。。。也就意味着,当我们将1秒钟时间分割为100份,每一份生成一张频谱图时,该图的频率分辨率只能达到50Hz(意即频谱柱状图中每两个柱之间的间隔为50Hz)。当你想要令频率分辨率达到1Hz的时候,只有一种办法——那就是每秒钟只生成一张频谱图!可是那时频率分辨率确实高了,但是你知道在这1秒钟过程中,到底是0.1s时还是0.2s时小提琴的声音响起了?

这也就意味着,在数字音频信号处理当中,当提高频率分辨率(我们想得到每一个Hz都能对应一个振幅的频谱图)时,时间分辨率就会下降,而当提高时间分辨率(我们想每秒钟得到100张频谱图)时,频率分辨率就会下降。


对于上面一句话也有另一种定义——不确定性原理。


因此既然对于采样率一定的信号,时间分辨率与频率分辨率没有办法同时提升,那么音频软件就会选择一个合适的值——比如说每秒分成20份,那么是20Hz,进行变换得到20张频谱图,那么可以稍微兼顾时间分辨率与频率分辨率,得到一个满足分析需要的动态频率谱。

此外,民用的播放软件频谱仪不过是个点缀,因此没有必要真的去按照这个牛角尖计算出这么精细的动态功率谱,因为对于CPU并非DSP的X86架构电脑来说,FFT的运算量也是很大的,计算出这么精细的动态功率谱一方面没必要,另一方面资源消耗太严重,因此——比方说可以将每秒划分成800份,频率分辨率为400Hz,那么每一帧计算量实际是很小的,只要对一个拥有几十个元素的离散序列进行计算就好了。照这么粗糙的频率分辨率本来一秒钟可以得到800帧频谱图像,但是foobar每秒可以只抽出其中第0帧,第200帧,第400帧,第600帧进行计算,那么只需要计算得到4张柱状图,相当于第0秒,第0.25秒,第0.5秒和第0.75秒四个时刻的柱状图,然后对每一段中做一个过渡动画就好了,则既起到了点缀的作用,又不影响软件的资源占用,皆大欢喜。

最后,说了这么多,进行一下总结吧。

  1. MP3携带的频谱信息实际上并不存在于文件当中,而是播放软件计算出来的。换句话说,与人耳的功能相同,但是人耳将声波的振动转换为了大脑可接受的信号,动态频谱则拷贝人耳的功能,将人耳转换的信号通过图像可视化展示了出来。
  2. 频谱的所谓“采样间隔频率”与刷新帧速分别代表了动态频率谱的频率分辨率和时域分辨率。这些都可以由软件自己来控制,当然如果你觉得自己编程水平不错自己拿C甚至于matlab编一个动态频谱仪也未尝不可,所有参数自己随便改。但是刷新帧速越高,则频率分辨率就越低,以至于在频谱仪上你观察不出唱歌的是男人还是女人(开个玩笑)。反之,频率分辨率越高则动态频谱的刷新帧速也就越低。打个比方就是如果每个月你看的书越厚,则你看书的数量则越少,反之如果你看的书很薄,那么你这个月就可以看更多的书。
  3. 以上分析均是基于离散信号分析理论(当然一切和电脑有关的音乐都是离散信号,除非你去分析磁带或者LP唱片),而对于foobar来说,频谱仪仅仅是点缀。从降低资源占用角度来说,你在foobar上看到的动态频谱仪实际上已经是简化以至于玩具了。看个热闹可以,如果想通过它进行一些研究分析还是算了。

P.S. 还是要说一句,无损音乐与此话题毫无关联,只和该音乐格式采用多少的采样率有关。不要误会


原来是这样,有意思
“因为人耳并不是一个一直在接收声压然后转换成人类能够理解的频率信号的器官,而是将时间分割成小段,每一段分别计算出这一段(打个比方说,0.1ms以内)的频率信息(频谱),然后就能知道这一刻的外界声音是什么”——好


推薦閱讀:

TAG:音乐 | 物理学 | 声音 | MP3 | 播放器 |