全文来自网络搜集。
3.1.1 声音处理
一般我们人耳能听到的声音频率为20-20kHz,对不同频段的感知和理解不一样,所以在音效处理方面有很多发挥的空间。
声音涉及到的面很多,包括物理、语言学等方面的研究。
声波是机械波的一种。
机械波(MechanicalWave)是由机械振荡产生的,它的传播需要介质的支持。它有如下特点:
l 介质本身并不会随着机械波不断地前进
比如我们抖动一条绳子产生的绳波,绳子上的某个点只是在一定范围内做上下运动,没有因为波的传递而脱离绳子。因而机械波是能量的传递,而不是质量的传递
l 在不同的介质中,传播速度是不一样的
那么,作为机械波的一种,声音有哪些重要属性呢?
l 音强/响度(Loudness)
响度就是人类可以感知到的各种声音的大小,也就是音量,声音的主观属性。响度与声波的振幅有直接关系——理论上振幅越大,响度也就越大。响度主要随声音的强度而变化,但也受频率的影响。总的说,中频纯音听来比低频和高频纯音响一些。
l 音调(Pitch)
我们常说某人唱高音很好,或者低音很棒,这就是音调。音调与声音的频率有关系——当声音的频率越大时,人耳所感知到的音调就越高,否则就越低
l 音色(Quality)
同一种乐器,使用不同的材质来制作,所表现出来的音色效果是不一样的,这是由物体本身的结构特性所决定的——它直接影响了声音的音色属性。
比特率:表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来表示,单位常为kbps。
下面这个图很好地描述了音频从录制到播放的一系列操作流程:
采样(Audio Sampling)
数字音频系统需要将声波波形信号通过ADC转换成计算机支持的二进制,这一过程叫做音频采样(Audio Sampling),采样是把连续的模拟信号转换成离散的数字信号。
量化(Quantization)
采样后的值还需要通过量化,也就是将连续值近似为某个范围内有限多个离散值的处理过程。
编码(Coding)
计算机的世界里,所有数值都是用二进制表示的,因而我们还需要把量化值进行二进制编码并进行编码压缩。
采样率(Sampling Rate)
奈奎斯特定律,采样频率如果是声音频率最高值的两倍,则可还原出原始声音。人耳所能辨识的声音范围是20-20KHZ, 所以人们一般都选用44.1KHZ(CD)、48KHZ或者96KHZ来做为采样速率。采样率越高,声音还原越真实,但文件大小也会增大。
采样深度(Bit Depth)
量化(Quantization)是将连续值近似为某个范围内有限多个离散值的处理过程。那么这个范围的宽度以及可用离散值的数量会直接影响到音频采样的准确性,这就是采样深度的意义。
编码(Codec)
语音编码器分为三种类形:(a)波形编器 ;(b)声码器 ;(c)混合编码器 。
波形编码器以构造出背景噪单在内的模拟波形为目标。作用于所有输入信号,因此会产生高质量的样值并且耗费较高的比特率。而声码器 (vocoder)不会再生原始波形。这组编码器 会提取一组参数 ,这组参数被送到接收端,用来导出语音产生模形。声码器语音质量不够好。混合编码器,它融入了波形编码器和声器的长处。
2.1 波形编码器
波形编码器的设计常独立于信号。所以适应于各种信号的编码而不限于语音。
1 时域编码
a)PCM:pulse code modulation,是最简单的编码方式。仅仅是对信号的离散和量化,常采用对数量化。
b)DPCM:differential pulse code modulation,差分脉冲编码,只对样本之间的差异进行编码。前一个或多个样本用来预测当前样本值。用来做预测的样本越多,预测值越精确。真实值和预测值之间的差值叫残差,是编码的对象。
c)ADPCM:adaptive differential pulse codemodulation,自适应差分脉冲编码。即在DPCM的基础上,根据信号的变化,适当调整量化器和预测器,使预测值更接近真实信号,残差更小,压缩效率更高。
(2)频域编码
频域编码是把信号分解成一系列不同频率的元素,并进行独立编码。
a)sub-band coding:子带编码是最简单的频域编码技术。是将原始信号由时间域转变为频率域,然后将其分割为若干个子频带,并对其分别进行数字编码的技术。它是利用带通滤波器(BPF)组把原始信号分割为若干(例如m个)子频带(简称子带)。将各子带通过等效于单边带调幅的调制特性,将各子带搬移到零频率附近,分别经过BPF(共m个)之后,再以规定的速率(奈奎斯特速率)对各子带输出信号进行取样,并对取样数值进行通常的数字编码,其设置m路数字编码器。将各路数字编码信号送到多路复用器,最后输出子带编码数据流。
对不同的子带可以根据人耳感知模型,采用不同量化方式以及对子带分配不同的比特数。
b)transformcoding:DCT编码。
6 声码器
channel vocoder:利用人耳对相位的不敏感。
homomorphic vocoder:能有效地处理合成信号。
formant vocoder:以用语音信号的绝大部分信息都位于共振峰的位置与带宽上。
linear predictive vocoder:最常用的声码器。
7 混合编码器
波形编码器试图保留被编码信号的波形,能以中等比特率(32kbps)提供高品质语音,但无法应用在低比特率场合。声码器试图产生在听觉上与被编码信号相似的信号,能以低比特率提供可以理解的语音,但是所形成的语音听起来不自然。混合编码器结合了2者的优点。
RELP:在线性预测的基础上,对残差进行编码。机制为:只传输小部分残差,在接受端重构全部残差(把基带的残差进行拷贝)。
MPC:multi-pulse coding,对残差去除相关性,用于弥补声码器将声音简单分为voiced和unvoiced,而没有中间状态的缺陷。
CELP:codebook excited linear prediction,用声道预测其和基音预测器的级联,更好逼近原始信号。
MBE:multiband excitation,多带激励,目的是避免CELP的大量运算,获得比声码器更高的质量。
3.1.1 声道
声道(AudioChannel)
一个声道(AudioChannel),简单来讲就代表了一种独立的音频信号,所以双声道理论上就是两种独立音频信号的混合。具体而言,如果我们在录制声音时在不同空间位置放置两套采集设备(或者一套设备多个采集头),就可以录制两个声道的音频数据了。后期对采集到的声音进行回放时,通过与录制时相同数量的外放扬声器来分别播放各声道的音频,就可以尽可能还原出录制现场的真实声音了。
声道的数量发展经历了几个重要阶段,分别是:
l Monaural (单声道)
早期的音频录制是单声道的,它只记录一种音源,所以在处理上相对简单。播放时理论上也只要一个扬声器就可以了——即便有多个扬声器,它们的信号源也是一样的,起不到很好的效果
l Stereophonic(立体声)
之所以称为立体声,是因为人们可以感受到声音所产生的空间感。大自然中的声音就是立体的,比如办公室里键盘敲击声,马路上汽车鸣笛,人们的说话声等等。那么这些声音为什么会产生立体感呢?
我们知道,当音源发声后(比如你右前方有人在讲话),音频信号将分别先后到达人类的双耳。在这个场景中,是先传递到右耳然后左耳,并且右边的声音比左边稍强。这种细微的差别通过大脑处理后,我们就可以判断出声源的方位了。
这个原理现在被应用到了多种场合。在音乐会的录制现场,如果我们只使用单声道采集,那么后期回放时所有的音乐器材都会从一个点出来;反之,如果能把现场各方位的声音单独记录下来,并在播放时模拟当时的场景,那么就可以营造出音乐会的逼真氛围。
Surround Sound(4.1环绕立体声)
随着技术的发展和人们认知的提高,单纯的双声道已不能满足需求了,于是更多的声道数逐渐成为主流,其中被广泛采用的就有四声道环绕立体声。
其中的“4”代表了四个音源,位置分别是前左(Front-Left)、前右(Front-Right)、后左(Rear-Left)、后右(Rear-Right)。而小数点后面的1,则代表了一个低音喇叭(Subwoofer),专门用于加强低频信号效果
l 5.1 SurroundSound(5.1环绕立体声)
相信大家都听过杜比数字技术,这是众多5.1环绕声中的典型代表。另外还有比如DTS、SDDS等都属于5.1技术。5.1相对于4.1多了一个声道,位置排列分别是前左、前右、中置(Center Channel)和两个Surround Channel,外加一个低音喇叭。
根据ITU(InternationalTelecommunication Union)的建议,5.1环绕技术各扬声器位置图如下所示:
|
图 13‑6 ITU发布的5.1环绕技术推荐方位图
即:
l 各扬声器和听者距离是一致的,因而组成一个圆形
l 角度分布:前左和前右分别是+22.5/-22.5度(看电影时),以及+30/-30度(听音乐时);中置总是为0度;后面的两个环绕器分别为+110/-110度
Weber–Fechnerlaw
估计知道这个定律的人比较少,它是音频系统中计算声音大小的一个重要依据。从严格意义上讲,它并不只适用于声音感知,而是人体各种感观(听觉、视觉、触觉)与刺激物理量之间的一条综合规律。其中心思想用公式表达就是:
△I/I=C
其中△I表示差别阈值,I是原先的刺激量,而C则是常量。换句话说,就是能引起感观变化的刺激差别量与原先的刺激量比值是固定的。这样子说可能比较抽象,我们举个例子来说。
场合1. 去商店买一瓶水,原本2块钱的东西卖到了5块钱
场合2. 买一辆奔驰车,原先价格是一百万,现在涨了3块钱
这两种场景下,前后的价格虽然都是相差3元,但对我们造成的主观感受是有很大不同的。显然在第一种情况下,我们会觉得很贵而可能选择不买;而后者则对我们基本不会产生任何影响。这是因为引起感观变化的刺激量并不单单取决于前后变化量的绝对差值,同时也与原来的刺激量有很大关系。对于特定的场合,上述公式中的C值是固定的。比如有的人觉得2块钱的东西卖3元就是贵了,有的人则能接受2块钱的东西卖4块,对于不同的人C值是会有差异的。
这就是德国心理物理学家ErnstHeinrich Weber发现的规律,后来的学生GustavFechner把这一发现系统地用公式表达出来,就是上述公式所表达的韦伯定律。
后来,Fechner在此基础上又做了改进。他提出刺激量和感知是呈对数关系的,即当刺激强度以几何级数增长时,感知强度则以算术级数增加。这就是Weber–Fechner law,如下公式所示:
S = C log R
那么这对音频系统有什么指导意义呢?
我们知道,系统音量是可调的,比如分为0-20个等级。这些等级又分别对应不同的输出电平值,那么我们如何确定每一个等级下应该设置的具体电平值呢?你可能会想到平均分配。没错,这的确是一种方法,只不过按照这样的算法所输出的音频效果在用户听来并不是最佳的,因为声音的变化不连续。
一个更好的方案就是遵循Weber–Fechnerlaw,而采用对数的方法。在Android系统中,这一部分计算具体的实现代码在audiosystem.cpp文件中,大家有兴趣的话可以自行阅读了解下。
3.1.1 音频格式
数字音频格式
l 不压缩的格式(UnCompressed AudioFormat)
比如前面所提到的PCM数据,就是采样后得到的未经压缩的数据。PCM数据在Windows和Mac系统上通常分别以wav和aiff后缀进行存储。可想而知,这样的文件大小是比较可观的
l 无损压缩格式(Lossless CompressedAudio Format)
这种压缩的前提是不破坏音频信息,也就是说后期可以完整还原出原始数据。同时它在一定程度上可以减小文件体积。比如FLAC、APE(Monkey’sAudio)、WV(WavPack)、m4a(Apple Lossless)等等
l 有损压缩格式(Lossy Compressed AudioFormat)
无损压缩技术能减小的文件体积相对有限,因而在满足一定音质要求的情况下,我们还可以进行有损压缩。其中最为人熟知的当然是mp3格式,另外还有iTunes上使用的AAC,这些格式通常可以指定压缩的比率——比率越大,文件体积越小,但效果也越差
常见音频格式
1. WAV格式,是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持,压缩率低。
2. MIDI是Musical Instrument Digital Interface的缩写,又称作乐器数字接口,是数字音乐/电子合成乐器的统一国际标准。它定义了计算机音乐程序、数字合成器及其它电子设备交换音乐信号的方式,规定了不同厂家的电子乐器与计算机连接的电缆和硬件及设备间数据传输的协议,可以模拟多种乐器的声音。MIDI文件就是MIDI格式的文件,在MIDI文件中存储的是一些指令。把这些指令发送给声卡,由声卡按照指令将声音合成出来。
3. MP3全称是MPEG-1 Audio Layer 3,它在1992年合并至MPEG规范中。MP3能够以高音质、低采样率对数字音频文件进行压缩。应用最普遍。
4. MP3Pro是由瑞典Coding科技公司开发的,其中包含了两大技术:一是来自于Coding科技公司所特有的解码技术,二是由MP3的专利持有者法国汤姆森多媒体公司和德国Fraunhofer集成电路协会共同研究的一项译码技术。MP3Pro可以在基本不改变文件大小的情况下改善原先的MP3音乐音质。它能够在用较低的比特率压缩音频文件的情况下,最大程度地保持压缩前的音质。
5. MP3Pro是由瑞典Coding科技公司开发的,其中包含了两大技术:一是来自于Coding科技公司所特有的解码技术,二是由MP3的专利持有者法国汤姆森多媒体公司和德国Fraunhofer集成电路协会共同研究的一项译码技术。MP3Pro可以在基本不改变文件大小的情况下改善原先的MP3音乐音质。它能够在用较低的比特率压缩音频文件的情况下,最大程度地保持压缩前的音质。
6. WMA (Windows Media Audio)是微软在互联网音频、视频领域的力作。WMA格式是以减少数据流量但保持音质的方法来达到更高的压缩率目的,其压缩率一般可以达到1:18。此外,WMA还可以通过DRM(Digital Rights Management)保护版权。
7. RealAudio是由RealNetworks公司推出的一种文件格式,最大的特点就是可以实时传输音频信息,尤其是在网速较慢的情况下,仍然可以较为流畅地传送数据,因此RealAudio主要适用于网络上的在线播放。现在的RealAudio文件格式主要有RA(RealAudio)、RM(RealMedia,RealAudioG2)、RMX(RealAudioSecured)等三种,这些文件的共同性在于随着网络带宽的不同而改变声音的质量,在保证大多数人听到流畅声音的前提下,令带宽较宽敞的听众获得较好的音质。
8. Audible拥有四种不同的格式:Audible1、2、3、4。Audible.com网站主要是在互联网上贩卖有声书籍,并对它们所销售商品、文件通过四种Audible.com 专用音频格式中的一种提供保护。每一种格式主要考虑音频源以及所使用的收听的设备。格式1、2和 3采用不同级别的语音压缩,而格式4采用更低的采样率和MP3相同的解码方式,所得到语音吐辞更清楚,而且可以更有效地从网上进行下载。Audible 所采用的是他们自己的桌面播放工具,这就是Audible Manager,使用这种播放器就可以播放存放在PC或者是传输到便携式播放器上的Audible格式文件
9.AAC实际上是高级音频编码的缩写。AAC是由Fraunhofer IIS-A、杜比和AT&T共同开发的一种音频格式,它是MPEG-2规范的一部分。AAC所采用的运算法则与MP3的运算法则有所不同,AAC通过结合其他的功能来提高编码效率。AAC的音频算法在压缩能力上远远超过了以前的一些压缩算法(比如MP3等)。它还同时支持多达48个音轨、15个低频音轨、更多种采样率和比特率、多种语言的兼容能力、更高的解码效率。总之,AAC可以在比MP3文件缩小30%的前提下提供更好的音质。
10. Ogg Vorbis 是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同 的是,它是完全免费 、开放和没有专利限制的。Vorbis 是这种音频压缩机制的名字,而Ogg则是一个计划的名字,该计划 意图设计 一个完全开放性的多媒体系统。VORBIS也是有损压缩,但通过使用更加先进的声学模型去减少损失,因此,同样位速率(Bit Rate)编码的OGG与MP3相比听起来更好一些。
11. APE是一种无损压缩音频格式,在音质不降低的前提下,大小压缩到传统无损格式 WAV 文件的一半.
12 .FLAC即是FreeLossless Audio Codec的缩写,是一套著名的自由音频无损压缩编码,其特点是无损压缩。
3.1.1 音频设计
http://blog.csdn.net/xuesen_lin/article/details/8796492
在计算机发展的早期,电脑的声音处理设备是由一个非常简易的loudspeaker外加发声器(Tone Generator)构成的,功能相对局限。后来人们想到了以plug-in的形式来扩展音频设备,“Sound blaster”就是其中很有名的一个。这种早期的声卡以插件方式连接到电脑主板上,并提供了更多复杂的音频设备。可想而知,独立的硬件设计也意味着成本的增加,于是随着技术的发展,便又出现了板载声卡,也就是我们俗称的“集成声卡”。板载声卡又分为“软声卡”和“硬声卡”。如果声卡本身没有主处理芯片,而只有解码芯片,需要通过CPU运算来执行处理工作,那么就是“软声卡”,反之就是“硬声卡”。通常面向低端市场的计算机都会包含一个集成的声卡设备以降低成本。
一个典型的声卡通常包含三个部分:
· Connectors
用于声卡与外放设备,如扬声器、耳机的连接,又被称为“jacks”
· AudioCircuits
声卡的主要实现体,它负责信号的放大、混音、以及模拟数字转换等操作
· Interface
连接声卡与计算机总线的单元,比如PCI总线
我们可以通过“cat/proc/asound/cards”命令来查看计算机中安装的声卡设备,如下例子所示:
OSS (Open Sound System)
早期Linux版本采用的是OSS框架,它也是Unix及类Unix系统中广泛使用的一种音频体系。
OSS采用的设备节点
设备节点 | 说明 |
/dev/dsp | 向此文件写数据à输出到外放Speaker 向此文件读数据à从Microphone进行录音 |
/dev/mixer | 混音器,用于对音频设备进行相关设置,比如音量调节 |
/dev/midi00 | 第一个MIDI端口,还有midi01,midi02等等 |
/dev/sequencer | 用于访问合成器(synthesizer),常用于游戏等效果的产生 |
更多详情,可以参考OSS的官方说明:http://www.opensound.com/
ALSA(AdvancedLinux Sound Architecture)
ALSA是Linux社区为了取代OSS而提出的一种框架,是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。
ALSA主要由下表所示的几个部分组成:
表格 13‑2 Alsa-project Package
Element | Description |
alsa-driver | 内核驱动包 |
alsa-lib | 用户空间的函数库 |
alsa-utils | 包含了很多实用的小程序,比如 alsactl:用于保存设备设置 amixer:是一个命令行程序,用于声量和其它声音控制 alsamixer:amixer的ncurses版 acconnect和aseqview:制作MIDI连接,以及检查已连接的端口列表 aplay和arecord:两个命令行程序,分别用于播放和录制多种格式的音频 |
alsa-tools | 包含一系列工具程序 |
alsa-firmware | 音频固件支持包 |
alsa-plugins | 插件包,比如jack,pulse,maemo |
alsa-oss | 用于兼容OSS的模拟包 |
pyalsa | 用于编译Python版本的alsa lib |
Alsa主要的文件节点如下:
- Information Interface (/proc/asound)
- Control Interface (/dev/snd/controlCX)
- Mixer Interface (/dev/snd/mixerCXDX)
- PCM Interface (/dev/snd/pcmCXDX)
- Raw MIDI Interface (/dev/snd/midiCXDX)
- Sequencer Interface (/dev/snd/seq)
- Timer Interface (/dev/snd/timer)
在早期版本中,Android系统的音频架构主要是基于ALSA的,其上层实现可以看做是ALSA的一种“应用”。后来可能是由于ALSA所存在的一些不足,Android后期版本开始不再依赖于ALSA提供的用户空间层的实现,因而我们在它的库文件夹中已经找不到alsa相关的lib了,而取代它的是tinyalsa相关的库文件,同时我们可以看到externl目录下多了一个“tinyalsa”文件夹,其中包含了为数不多的几个源码文件,如下所示:
Tiny-alsa工程文件
Source File | Description |
Android.mk | makefile |
mixer.c | Mixer Interface实现 |
pcm.c | PCM Interface实现 |
tinycap.c | Caputer工具 |
tinymix.c | Mixer工具 |
tinyplay.c | Play工具 |
include/tinyalsa/asoundlib.h | 头文件 |
可见TinyAlsa与原版Alsa的差异还是相当大的,它只是部分支持了其中的两种Interface,而像Raw MIDI、Sequencer、Timer等Interface则没有涉及到——当然这对于一般的嵌入式设备还是足够了。
3.1.1 音频框图
不同场景的音频系统原理图