ShaZam深入分析之音乐数字化

除非你是发烧友,否则一般来说我们听的音乐都是数字文件,比如mp3等等。但事实上,制作音乐的时候,都是模拟的。音乐其实最终都是数字化以便于用电子设备进行存储和播放。那么本文就来讲讲如何从模拟转变成数字,了解了这些之后,会有助于我们后面的理解

采样

模拟信号其实是连续的信号,这也就意味着你可以把一秒的模拟信号分成无数份。而对数字信号来说,你不可能保存无限的数据。所以,你需要一个最小的单元,比如1毫秒。在这个单元里面,声音是不变的,所以为了能够足够接近模拟信息,这个单元需要足够小,但有不能太小,否则就需要很大的空间来存储这个数字信息。

我们可以想象一下,哪怕是你最喜欢的音乐,但是每两秒的声音都不变,这听起来估计也很奇怪。所以为了你的音乐听起来很好,你可以选择一个很小的单元,比如一个纳秒等,这时你的音乐听起来就非常赞,当然你可能没有足够的磁盘来保存这种音乐。

所以,这时候就需要使用本节的主题:采样。

标准的数字音乐是44100单元每秒,我们称之为采样率。我们在前文中提到,人耳能听到的声音范围是20Hz到20kHz。Nyquist和Shannon定理指出假如你想要数字化一个信号到0Hz到20kHz,那么你需要最少40000的采样率。主要的思想是一个F频率的正弦波需要至少每个cycle 2个点来鉴别。我们来看下面这个图:

sampling of a signal

上图中,20Hz的声音被40Hz的采样率来进行数字采样。

  • 蓝色的波形是20Hz的声音
  • 红色的叉就是声音的采样,也就是说每1/40秒采样一次。
  • 绿色的线是采样声音的插值

虽然这个形状和振幅不同,但是采样信号的频率是一样的。

下面是一个坏的采样例子:

example of undersampling

这张图中,20Hz的声音是30Hz的采样率。这个采样信号的频率和原来的信号的频率是不同的:它的频率只剩10Hz了。假如仔细看看,你会发现采样中的一个cycle是原来信号中的两个cycle。这就是采样不足的情况。

这个例子还说明一个问题:假如你想要数字化一个在0Hz到20KHz之间的信号,那么你需要先把超过20kHz的频率去除。否则这些频率会被转到0Hz到20KHz之间的信号,从而产生我们想不到的干扰。

总的来说,假如你想把一个音乐从模拟转变成数字信号,那么采样率最好40000次每秒。

量化

我们看到如何数字化频率,但是声音的大小怎么办呢?声音的大小是相对的,同样的信号,假如你把扬声器的声音调大,声音也会变大。所以响度是一首歌中最低和最高声音之间的变化。

所以这里有了一个问题,怎么把这些信息从连续的模拟信号转变成离散的量。

我们来假设你最喜欢的音乐有四个响度:没有声音,低声,高声以及最高声。当然现实不是这样的,但我们这里只是做一个例子:

下面就是这个例子的图片:

8_level_quantization-min

这张图显示了8个级别的量化,你可以看到声音的结果(红色)产生了很大的变化。真实声音和量化的线之间的差别我们称之为量化错误或者量化噪音。8个级别的量化我们也称为3bit量化,因为你需要3个bit来表示八个不同的级别。

下面是一个64级别的例子(6bit)

64_levels_quantization-min

这张图中可以看出,虽然结果看起来还是有点差别,但是和原来的声音已经更加接近了。

还好人耳的声音辨识度不是太高,所以标准的量化值是16bit,也就是说65536级。也就是16bit的量化值对人耳来说已经足够低到无法分辨了。

脉冲编码调制

脉冲编码调制就是我们通常说的PCM,它是一个显示数字信号的标准。很多电子设备都使用它,比如你听mp3的时候,mp3其实会自动转换成PCM信号,然后再发送到你的耳机。

一个PCM流就是一个有组织的bit信号。它可以有多个通道,比如,立体音就需要2个通道。

在一个流中,信号的振幅被分成sample。每秒的采样数目和音乐的采样率有关。比如44.1KHz的音乐就是每秒采样44100 sample。

有很多PCM的格式,最常使用的是PCM 44.1KHz,16 bit深的立体音。这个格式每秒有44100的采样点。每个采样点有4 byte:

  • 2 byte用来表示左扬声器的强度
  • 2 byte用来表示右扬声器的强度
example of a pulse code modulation stereo sample

所以PCM 44.1KHz的情况下,你有44100个采样,每一个都像这个样子。

参考文章:http://coding-geek.com/how-shazam-works/

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *