Category: shazam

0

ShaZam深入分析之从数字声音到频率

我们在之前的文章中介绍了如何从模拟声音转变到数字声音。现在假如有了一个数字声音,你如何得到他的频率呢?这个部分很重要,因为ShaZam的算法基本都是基于频率的。 对模拟信号来说,这里有一个变化称为连续傅里叶变换。它可以把一个时间的函数转变成频率的函数。也就是假如把傅里叶变换应用到一个声音上,你就会得到它的频率。 但是这里有两个问题: 我们处理的数字信号,所以它是一个有限的不连续声音。 为了更好地理解音乐内部的频率,我们需要把傅里叶变换应用到整个音乐信号的更好的部分,比如我们需要把它应用到0.1s的部分。 还好,我们这里有一个新的数学函数,称之为离散傅里叶变换。 离散傅里叶变换 DFT(离散傅里叶变换)应用到离散信号中,并且返回一个离散的光谱。下面这里是它的公式: 这个公式中: N是窗口的大小:组成信号的样本数目 X(n)代表第n个频率区间 x(k)是音频信号中的第k个样本 例如,对一个有4096个样本的音频信号,我们需要应用这个公式4096次: n=0计算第0个频率区间 n=1计算第一个频率区间 n=2计算第二频率区间 你也许注意到,我说的是频率区间而不是频率。这是因为DFT给出的离散光谱。频率区间是DFT能够计算的最小频率单元。频率区间的大小等于信号的采样率除以窗口的大小(N)。在我们上面的例子中,有4096个窗口,标准的声音采样率是44.1kHz,所以频率分辨率就是10.77Hz (第0个有点特殊) 第0个频率区间是0Hz到5.38Hz 第一个频率区间是5.38Hz到16.15Hz 第二个频率区间是16.15Hz到26.92Hz 第三个频率区间是26.92Hz到37.68Hz 这就意味着DFT不能够区分小于10.77Hz的两个频率。比如27Hz,32Hz,37Hz其实都落在同一个频谱区间。假如37Hz的音符比较重,你只会知道第三个频率区间比较重。这个对最低八度音阶的解离其实是有问题的,比如: A1在55Hz,而B1在58.27Hz以及G1在49Hz。 标准88键的第一个音符实在A0 27.5Hz,然后后面是A#0位于29.14Hz 你可以通过增加窗口大小来改进频率分辨率,但这也意味着会丢失音乐中的快速频率/音符的改变: 一个音乐信号的采样率是44.1 kHz 增加窗口的大小意味着增加更多的样本,因此就是增加window的时间。 对于4096样本,这个window的时间就是0.1秒,频率分辨率是10.7Hz:你可以每0.1s探测一次改变 对于16384样本,这个window的时间就是0.37s,频率分辨率就是2.7Hz:你只能探测到0.37s的改变。 音频信号的一个特殊性就是只需要通过DFT计算一般的频率区间。在之前的定义中,频率区间的定义是10.7Hz,这也就意味着2047个的频率区间展现了从21902.9Hz到21913.6Hz。但是: 第2048个频率区间和第0个是一样的...

0

ShaZam深入分析之音乐数字化

除非你是发烧友,否则一般来说我们听的音乐都是数字文件,比如mp3等等。但事实上,制作音乐的时候,都是模拟的。音乐其实最终都是数字化以便于用电子设备进行存储和播放。那么本文就来讲讲如何从模拟转变成数字,了解了这些之后,会有助于我们后面的理解 采样 模拟信号其实是连续的信号,这也就意味着你可以把一秒的模拟信号分成无数份。而对数字信号来说,你不可能保存无限的数据。所以,你需要一个最小的单元,比如1毫秒。在这个单元里面,声音是不变的,所以为了能够足够接近模拟信息,这个单元需要足够小,但有不能太小,否则就需要很大的空间来存储这个数字信息。 我们可以想象一下,哪怕是你最喜欢的音乐,但是每两秒的声音都不变,这听起来估计也很奇怪。所以为了你的音乐听起来很好,你可以选择一个很小的单元,比如一个纳秒等,这时你的音乐听起来就非常赞,当然你可能没有足够的磁盘来保存这种音乐。 所以,这时候就需要使用本节的主题:采样。 标准的数字音乐是44100单元每秒,我们称之为采样率。我们在前文中提到,人耳能听到的声音范围是20Hz到20kHz。Nyquist和Shannon定理指出假如你想要数字化一个信号到0Hz到20kHz,那么你需要最少40000的采样率。主要的思想是一个F频率的正弦波需要至少每个cycle 2个点来鉴别。我们来看下面这个图: 上图中,20Hz的声音被40Hz的采样率来进行数字采样。 蓝色的波形是20Hz的声音 红色的叉就是声音的采样,也就是说每1/40秒采样一次。 绿色的线是采样声音的插值 虽然这个形状和振幅不同,但是采样信号的频率是一样的。 下面是一个坏的采样例子: 这张图中,20Hz的声音是30Hz的采样率。这个采样信号的频率和原来的信号的频率是不同的:它的频率只剩10Hz了。假如仔细看看,你会发现采样中的一个cycle是原来信号中的两个cycle。这就是采样不足的情况。 这个例子还说明一个问题:假如你想要数字化一个在0Hz到20KHz之间的信号,那么你需要先把超过20kHz的频率去除。否则这些频率会被转到0Hz到20KHz之间的信号,从而产生我们想不到的干扰。 总的来说,假如你想把一个音乐从模拟转变成数字信号,那么采样率最好40000次每秒。 量化 我们看到如何数字化频率,但是声音的大小怎么办呢?声音的大小是相对的,同样的信号,假如你把扬声器的声音调大,声音也会变大。所以响度是一首歌中最低和最高声音之间的变化。 所以这里有了一个问题,怎么把这些信息从连续的模拟信号转变成离散的量。 我们来假设你最喜欢的音乐有四个响度:没有声音,低声,高声以及最高声。当然现实不是这样的,但我们这里只是做一个例子: 下面就是这个例子的图片: 这张图显示了8个级别的量化,你可以看到声音的结果(红色)产生了很大的变化。真实声音和量化的线之间的差别我们称之为量化错误或者量化噪音。8个级别的量化我们也称为3bit量化,因为你需要3个bit来表示八个不同的级别。 下面是一个64级别的例子(6bit) 这张图中可以看出,虽然结果看起来还是有点差别,但是和原来的声音已经更加接近了。 还好人耳的声音辨识度不是太高,所以标准的量化值是16bit,也就是说65536级。也就是16bit的量化值对人耳来说已经足够低到无法分辨了。 脉冲编码调制 脉冲编码调制就是我们通常说的PCM,它是一个显示数字信号的标准。很多电子设备都使用它,比如你听mp3的时候,mp3其实会自动转换成PCM信号,然后再发送到你的耳机。 一个PCM流就是一个有组织的bit信号。它可以有多个通道,比如,立体音就需要2个通道。 在一个流中,信号的振幅被分成sample。每秒的采样数目和音乐的采样率有关。比如44.1KHz的音乐就是每秒采样44100 sample。 有很多PCM的格式,最常使用的是PCM 44.1KHz,16 bit深的立体音。这个格式每秒有44100的采样点。每个采样点有4 byte:...

0

ShaZam深入分析之音乐基础

我们都知道声音是通过空气(或水等介质)进行传播的振动,然后由人的耳朵进行解析的。比如我们听音乐,声音就是通过空气传播,然后被你的耳朵所接受。光也和声音类似,只是说这次你的耳朵没法解析它,但是你的眼睛可以。本文就来介绍一下,音乐是如何用物理、技术进行描述的。 纯音和真实的声音 所谓的纯音就是正弦波形的音。正弦波有下面这些特性: 它的频率: 每秒的循环数,它的单位是赫兹(HZ),比如100Hz = 100循环/s 它的振幅(声音的大小相关):每一个循环的大小 人耳就是通过解析这些特性来组成声音的。人耳可以听到20 Hz 到 20000Hz的声音,而随着岁数的增加,这个范围不断地在缩小。 人耳对响度的感知取决于纯音的频率,比如一个30Hz的(振幅10)纯音听起来比100Hz(振幅10)的要轻。人耳遵循心理声学模型,具体你可以参考这边文章。 上图显示的就是一个纯音的波形,它的频率是20Hz,振幅是1. 纯音在自然界并不存在,但是任何声音其实都可以看成是多个不同振幅纯音的组合。 上面这幅图,你可以看成它是由多个正弦波组成的: 一个20Hz,振幅1的正弦波 一个40Hz,振幅2的正弦波 一个80Hz,振幅1.5的正弦波 一个160Hz,振幅1的正弦波。 现实世界中的声音可能由成百上千个纯音组成。 音符 音乐其实是由一系列音符组成的,这些音符也有长短和大小。 音符可以分成八度,也就是我们常说的A,B,C,D,E,F,G或者Do,Re,Mi,Fa,Sol,La,Si。而且它们有下面这些特性: 音符的频率是上一个八度的两倍,比如说A4的(A在第四度)的频率是440Hz,它就是A3的频率(220Hz)的两倍,是A2(110Hz)的四倍。 很多乐器以八度为单位提供了高于八个音符,我们称之为半音。 对第四度音来说,这些音符的频率如下: C4(Do3) = 261.63Hz D4(Re3) = 293.67Hz E4(Mi2)...