声音与波形
在接触波形声音API之前,具备一些预备知识很重要,这些知识包括物理学、听觉以及声音进出计算机的程序。声音就是振动。当声音改变了鼓膜上空气的压力时,我们就感觉到了声音。麦克风可以感应这些振动,并且将它们转换为电流。同样,电流再经过放大器和扩音器,就又变成了声音。传统上,声音以模拟方式储存(例如录音磁带和唱片),这些振动储存在磁气脉冲或者轮廓凹槽中。当声音转换为电流时,就可以用随时间振动的波形来表示。振动最自然的形式可以用正弦波表示。
正弦波有两个参数-振幅(也就是一个周期中的最大振幅)和频率。人们知道振幅就是音量,频率就是音调。一般来说人耳可感受的正弦波的范围是从20Hz(每秒周期)的低频声音到20,000Hz的高频声,但随着年龄的增长,对高频声音的感受能力会逐年退化。人感受频率的能力与频率是对数关系而不是线性关系。也就是说,我们感受20Hz到40Hz的频率变化与感受40Hz到80Hz的频率变化是一样的。在音乐中,这种加倍的频率定义为八度音阶。因此,人耳可感觉到大约10个八度音阶的声音。钢琴的范围是从27.5Hz到4186Hz之间,略小于7个八度音阶。虽然正弦波代表了振动的大多数自然形式,但纯正弦波很少在现实生活中单独出现,而且,纯正弦波并不动听。大多数声音都很复杂。
任何周期的波形(即,一个循环波形)可以分解成多个正弦波,这些正弦波的频率都是整倍数。这就是所谓的Fourier级数,它以法国数学家和物理学家JeanBaptisteJosephFourier(1768-1830)的名字命名。周期的频率是基础。级数中其它正弦波的频率是基础频率的2倍、3倍、4倍。这些频率的声音称为泛音。基础频率也称作一级谐波。第一泛音是二级谐波,以此类推。正弦波谐波的相对强度给每个周期的波形唯一的声音。这就是音质,它使得喇叭吹出喇叭声,钢琴弹出钢琴声。
空气中的各种声音,不管它们具有何种形式,都是由于物体的振动所引起的:敲鼓时听到了鼓声,同时能摸到鼓面的振动;人能讲话是由于喉咙声带的振动;汽笛声、喷气飞机的轰鸣声,是因为排气时气体振动而产生的。总之,物体的振动是产生声音的根源,发出声音的物体称为声源。声源发出的声音必须通过中间媒质才能传播出去,人们最熟悉的传声媒质就是空气,除了气体外,液体和固体也都能传播声音。振动在媒质中传播的速度叫声速,在任一种媒质中的声速取决于该媒质的弹性和密度,因此,声音在不同媒质中传播的速度是不同的:在液体和固体中的传播速度一般要比在空气中快得多,例如在水中声速为 1450m/s ,而在铜中则为 5000m/s 。声音在空气中的传播速度还随空气温度的升高而增加。
向前推进着的空气振动称为声波,有声波传播的空间叫声场。当声振动在空气中传播时空气质点并不被带走,它只是在原来位置附近来回振动,所以声音的传播是指振动的传递。如果物体振动的幅度随时间的变化如正弦曲线那样,那么这种振动称为简谐振动,物体作简谐振动时周围的空气质点也作简揩振动。物体离开静止位置的距离称位移χ,最大的位移叫振幅α,简谐振动位移与时间的关系表示为χ=αsin(2πft+φ),其中f为频率,(2πft+φ ) 叫简谐振动的位相角,它是决定物体运动状态的重要物理量,振幅α的大小决定了声音的强弱。
人们一度认为电子合成乐器仅仅需要将声音分解成谐波并且与多个正弦波重组即可。不过,事实证明现实世界中的声音并不是这么简单。代表现实世界中声音的波形都没有严格的周期。乐器之间谐波的相对强度是不同的,并且谐波也随着每个音符的演奏时间改变。特别是乐器演奏音符的开始位置-我们称作起奏(attack)-相当复杂,但这个位置又对我们感受音质至关重要。由于近年来数字储存能力的提高,我们可以将声音直接以数字形式储存而不用复杂的重组。
脉冲编码调制(PulseCodeModulation)
计算机处理的是数值,因此要使声音进入计算机,就必须设计一种能将声音与数字信号相互转换的机制。不压缩数据就完成此功能的最常用方法称作脉冲编码调制(PCM:pulsecodemodulation)。PCM可用在光盘、数字式录音磁带以及Windows中。脉冲编码调制其实只是一种概念上很简单的处理步骤的奇怪代名词而已。
利用脉冲编码调制,波形可以按固定的周期频率取样,其频率通常是每秒几万次。对于每个样本都测量其波形的振幅。完成将振幅转换成数字信号工作的硬件是模拟数字转换器(ADC:analog-to-digitalconverter)。类似地,通过数字模拟转换器(DAC:digital-to-analogconverter)可将数字信号转换回波形电子信号。但这样转换得到的波形与输入的并不完全相同。合成的波形具有由高频组成的尖锐边缘。因此,播放硬件通常在数字模拟转换器后还包括一个低通滤波器。此滤波器滤掉高频,并使合成后的波形更平滑。在输入端,低通滤波器位于ADC前面。
脉冲编码调制有两个参数:取样频率,即每秒内测量波形振幅的次数;样本大小,即用于储存振幅级的位数。与您想象的一样:取样频率越高,样本大小越大,原始声音的复制品才更好。不过,存在一个提高取样频率和样本大小的极点,超过这个极点也就超过了人类分辨声音的极限。另外,如果取样频率和样本大小过低,将导致不能精确地复制音乐以及其它声音。
取样频率决定声音可被数字化和储存的最大频率。尤其是,取样频率必须是样本声音最高频率的两倍。这就是「Nyquist频率(NyquistFrequency)」,以30年代研究取样程序的工程师HarryNyquist的名字命名。以过低的取样频率对正弦波取样时,合成的波形比最初的波形频率更低。这就是所说的失真信号。为避免失真信号的发生,在输入端使用低通滤波器以阻止频率大于半个取样频率的所有波形。在输出端,数字模拟转换器产生的粗糙的波形边缘实际上是由频率大于半个取样频率的波形组成的泛音。因此,位于输出端的低通滤波器也阻止频率大于半个取样频率的所有波形。
声音CD中使用的取样频率是每秒44,100个样本,或者称为44.1kHz。这个特有的数值是这样产生的:人耳可听到最高20kHz的声音,因此要拦截人能听到的整个声音范围,就需要40kHz的取样频率。然而,由于低通滤波器具有频率下滑效应,所以取样频率应该再高出大约百分之十才行。现在,取样频率就达到了44kHz。这时,我们要与视讯同时记录数字声音,于是取样频率就应该是美国、欧洲电视显示格速率的整数倍,这两种视讯格速率分别是30Hz和25Hz。这就使取样频率升高到了44.1kHz。
取样频率为44.1kHz的光盘会产生大量的数据,这对于一些应用程序来说实在是太多了,例如对于录制声音而不是录制音乐时就是这样。把取样频率减半到22.05kHz,可由一个10kHz的泛音来简化复制声音的上半部分。再将其减半到11.025kHz就向我们提供了5kHz频率范围。44.1kHz、22.05kHz和11.025kHz的取样频率,以及8kHz都是波形声音设备普遍支持的标准。因为钢琴的最高频率为4186Hz,所以您可能会认为给钢琴录音时,11.025kHz的取样频率就足够了。但4186Hz只是钢琴最高的基础频率而已,滤掉大于5000Hz的所有正弦波将减少可被复制的泛音,而这样将不能精确地捕捉和复制钢琴的声音。
脉冲编码调制的第二个参数是按位计算的样本大小。样本大小决定了可供录制和播放的最低音与最高音之间的区别。这就是通常所说的动态范围。声音强度是波形振幅的平方(即每个正弦波一个周期中最大振幅的合成)。与频率一样,人对声音强度的感受也呈对数变化。
两个声音在强度上的区别是以贝尔(以电话发明人AlexanderGrahamBell的名字命名)和分贝(dB)为单位进行测量的。1贝尔在声音强度上呈10倍增加。1dB就是以相同的乘法步骤成为1贝尔的十分之一。由此,1dB可增加声音强度的1.26倍(10的10次方根),或者增加波形振幅的1.12倍(10的20次方根)。1分贝是耳朵可感觉出的声强的最小变化。从开始能听到的声音极限到让人感到疼痛的声音极限之间的声强差大约是100dB。
Windows同时支持8位和16位的样本大小。储存8位的样本时,样本以无正负号字节处理,静音将储存为一个值为0x80的字符串。16位的样本以带正负号整数处理,这时静音将储存为一个值为0的字符串。要计算未压缩声音所需的储存空间,可用以秒为单位的声音持续时间乘以取样频率。如果用16位样本而不是8位样本,则将其加倍,如果是录制立体声则再加倍。例如,1小时的CD声音(或者是在每个立体声样本占2字节、每秒44,100个样本的速度下进行3600秒)需要635MB,这快要接近一张CD-ROM的储存量了。
对于第一个关于波形声音的练习,不将声音储存到文件中或播放录制的声音。将使用低阶的波形声音API(即,前缀是waveOut的函数)来建立一个称作SINEWAVE的声音正弦波生成器。此程序以1Hz的增量来生成从20Hz(人可感觉的最低值)到5,000Hz(与人感觉的最高值相差两个八度音阶)的正弦波。
标准C执行时期链接库包括了一个sin函数,该函数传回一个弧度角的正弦值(2π弧度等于360度)。sin函数传回值的范围是从-1到1。因此,应该很容易使用sin函数生成输出到波形声音硬件的正弦波数据。基本上是用代表波形(这时是正弦波)的数据来填充缓冲区,并将此缓冲区传递给API。波形声音硬件播放完缓冲区中的数据后,应将第二个缓冲区中的数据传递给它,并且以此类推。
第一次考虑这个问题(而且对PCM也一无所知)时,大多数人大概会认为将一个周期的正弦波分成若干固定数量的样本-例如360个-才合理。对于20Hz的正弦波,每秒输出7,200个样本。对于200Hz的正弦波,每秒则要输出72,000个样本。这有可能实作,但实际上却不能这么做。对于5,000Hz的正弦波,就需要每秒输出1,800,000个样本,这的确会增大DAC的负担!更重要的是,对于更高的频率,这种作法会比实际需要的精确度还高。
就脉冲编码调制而言,取样频率是个常数。假定取样频率是SINEWAVE程序中使用的11,025Hz。如果要生成一个2,756.25Hz(确切地说是四分之一的取样频率)的正弦波,则正弦波的每个周期就有4个样本。对于25Hz的正弦波,每个周期就有441个样本。通常,每周期的样本数等于取样频率除以要得到的正弦波频率。一旦知道了每周期的样本数,用2π弧度除以此数,然后用sin函数来获得每周期的样本。然后再反复对一个周期进行取样,从而建立一个连续的波形。
问题是每周期的样本数可能带有小数,因此在使用时这种方法并不是很好。每个周期的尾部都会有间断。使它正常工作的关键是保留一个静态的相位角变数。此角初始化为0。第一个样本是0度正弦。随后,相位角增加一个值,该值等于2π乘以频率再除以取样频率。用此相位角作为第二个样本,并且按此方法继续。一旦相位角超过2π弧度,则减去2π弧度,而不要把相位角再初始化为0。
例如,假定要用11,025Hz的取样频率来生成1,000Hz的正弦波。即每周期有大约11个样本。为便于理解,此处相位角按度数给出-大约前一个半周期的相位角是:0、32.65、65.31、97.96、130.61、163.27、195.92、228.57、261.22、293.88、326.53、359.18、31.84、64.49、97.14、129.80、162.45、195.10,以此类推。存入缓冲区的波形数据是这些角度的正弦值,并已缩放到每样本的位数。为后来的缓冲区建立数据时,可继续增加最后的相位角,而不要将它初始化为0。
WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。WAV格式支持许多压缩算法,支持多种音频位数、采样频率和声道,采用44.1kHz的采样频率,16位量化位数,因此WAV的音质与CD相差无几,但WAV格式对存储空间需求太大不便于交流和传播。
WAV来源于对声音模拟波形的采样。用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数(8位或16位)把这些采样点的值转换成二进制数,然后存入磁盘,这就产生了声音的WAV文件,即波形文件。MicrosoftSoundSystem软件SoundFinder可以转换AIFSND和VOD文件到WAV格式。该格式记录声音的波形,故只要采样率高、采样字节长、机器速度快,利用该格式记录的声音文件能够和原声基本一致,质量非常高,但这样做的代价就是文件太大。[1]