音频的构架以及原理

更新时间:2024-07-11 13:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Audio 系统构架

摘要:本课题主要研究音频的构架以及原理。这里的音频构架主要针对

笔记本codec以及HAD LINK。通过对CODEC初始化,工作原理以及 Azalia协议的描述来说明笔记本音频系统的构架。另外通过采样,D/A转换,编码,DSP处理,硬声卡等一系列的描述来体现整个音频系统的原理。

目 录

第一章 codec的介绍 ................................................................................ 2

1.1audio codec

1.2ALC662

1.3ALC662外围电路设计

2 2 3

第二章controller and LINK Protocol ........................................................ 7

2.1 controller及其构架

2.2 LINK上的流和频道

2.3codec地址分配和握手方式

7 8 11

第三章 HDA controller和codec的初始化 ........................................... 12

3.1controller初始化

3.2 codec的配置 3.3CORB与RIRB

12 13 13

第四章采样和AD转换 ........................................................................... 16

4.1采样定理

4.2采样电路 4.3AD转换

16 18 21

第五章音频信号的编码 .......................................................................... 22

5.1音频编码的由来

5.2心里声学模型 5.3 PE 值的计算

5.3位元的分配以及帧格式 5.5MP3的编码过程 5.6子带滤波器 5.7MDCT 5.8量化编码

23 23 27 28 30 31 32 33

5.9总结 36

第六章 DSP, 硬声卡的简单介绍 .......................................................... 36

6.1 DSP

6.2 硬声卡

36 37

第一章 codec的介绍

1.1audio codec

Codec意思是数字信号编码器,其使用范围很广泛,在这里我们只讨论audio codec。audio codec在笔记本中其根本的作用主要是D/A,A/D转换。audio codec从HAD LINK上接受到的是纯正的一帧一帧的音频采样信号(后续会对此详细描述),他就是通过对这些采样信号D/A转化得到最后的模拟声音信号的输出。当然audio codec也可以通过MIC,LINEIN等端口接受到模拟的音频信号,然后对这些信号进行A/D转换,再传输到上层编码,最后储存或者传输。下面我们以ALC662为列对CODEC做详细的描述。

1.2ALC662

ALC662是一款5.1声道的codec,包括:前声道左右,后声道左右,中间声

道,再加一个低音炮一共为5.1声道。ALC662 LQFP48 pin封装,可以划分为数字部分和模拟部分两块。数字部分是与HDALINK连接的部分,有REST#,BITCLK,SYNC,SDOUT,SDIN,当然还有两个数字电以及数字地。REST#信号使CODEC进入一个上电完成状态,其内部寄存器恢复默认或保留值,另外REST#至少持续100us来使得BCLK跑到一个正确的值(内部PLL锁频需要的时间)。REST#是由HDA controller发出的,连接到HAD LINK上所有的device。当power up PCI reset或者软件通过CRST寄存器初始化link的时候都会产生REST#。BITCLK是有HAD controller发出的连接到link上所有设备的工作24M参考时钟。SYNC是48KHZ流同步信号,每一帧中会包含一个到几个的流,给不同的设备,每个流的stream tag就是包含在SYNC信号中。SDOUT是有HDA controller发送到codec的数字信号,支持一对多连接,即LINK几个设备可以公用一个SDOUT。SDOUT是在clock上升和下降沿都采样的信号,一次其速率为

48M。SDIN是由device向controller传输数据的。只支持一对一传输,即不可由多个device公用一根SDIN线。两个数字电分别用于内部core逻辑和link的用电。其内部core逻辑为3.3V供电,link用电可以是3.3v也可以是1.5V这就需要由南桥的HAD controller输出决定了。

模拟部分也就是最终声音信号输出或输入。其中输入包括LINE IN,MIC IN,CDIN。LINEIN可以作为录音功能使用,CDIN是接到IDE光驱上的用来接受模拟的CD音乐输入,其作用就是一方面后台播放音乐,另外也是使CD音乐直接由CD-IN到codec输出而不必经过一系列的传输以及解码而占用系统资源。MICIN用于麦克风的输入引脚。输出就是包括5.1声道的模拟输出外加一个SPDIF数字音频输出。

1.3ALC662外围电路设计

本节主要讨论codec外围设计时的一些注意点以及原理。

数字部分主要要小心的是电的选择,数字电有一个是3.3/1.5可选的,要注意什么时候选择3.3什么时候选择1.5。一般情况我们都是选择3.3只是在HDA LINK传输的信号必须为1.5V时(比如GM使用HDMI时由于的HAD LINK只支持1.5V电平)才选择后者。另外由于选择1.5V电平后codec的模拟输出也会有一定的减小,因此最大音量输出会相应的减小我们要对此注意调节。(下面会具体讲到调节方法)

模拟部分我们主要考虑的是,去耦电容的选择,运放的运用,bobo音的改善方法,以及MIC啸叫之类问题的处理。

我们加去耦电容主要是防止音频信号输出上的共模含量影响声音质量或对输出产生干扰。理论上讲我们应高选择比较大的去耦电容(比如100uF),这样可以减小去耦电容对低频部分声音信号的抑制,提高声音输出的质量,但不管是根据成本考虑还是实际效果的考虑我们都不会选择大去耦电容,除非在需要过杜比时在LINEOUT口上加100uF电容。而对于喇叭口我们一般是上0.1-0.47uF的电容,因为对于喇叭而言其本身声音输出的质量就不高因此没必要给一个高质量的输入。

由于codec驱动能力有限其输出音频引号的峰峰值也并不是很大为了保证喇叭输出的音量我们需要外加运放。集成运放我们设计成单端输入差分输出的方

式。对于集成运放其原理相信学过模电或者集成电路的应该都知道这里就不再介绍了。由于我们用于音频20-20KHZ的信号放大(放大比例也不大就6-10db)因此对于运放的带宽增益积也没什么特别的要求。主要是在经过运放后对我们的信号不应该有明显的干扰,因此信噪比有一定要求。加入运放后主要带来的一个问题就是bobo音。其实bobo音产生的根源并非codec,也非运放本身。而是我们使用的这种单端输入差分输出的方式产生的。单端输入造成运放两输入端的不匹配,而这中不匹配就导致在上电时在运放两输入pin达到偏置电平这段时间有个ΔV或者ΔI,而这个ΔV或者ΔI在经过运放放大到输出端后就产生bobo音。为了减小bobo音我们就需要调节运放输入端口使其匹配(也就是调节两端的电容电阻)。

如图1-1是我们常用功放(TPA6017)的内部结构图,我们发现其内部结构是非常对称的。一般功放需要工作在一定的偏置电平,对于+5V的工作电源其偏置电平在2-2.5之间。一般输入脚的偏置电平是由运放的输入电源分压提供。对于我们的接发,IN- pin通过电容电阻拉到地上,在上电时偏置电平对外接电容充电。而对于IN+ pin我们是接到codec的输出pin上的,由于在上电是codec的输出pin也会有个common电平的上升因此,IN+上电容的电流以及两端的电压的上升会与IN-脚不一致,产生一个ΔV或者ΔI。也就是这个产生的bobo声。

图1-1

对于MIC的啸叫音这也是我们经常遇到的情况。现实生活中也长有:比如拿着麦克风讲话时,嘴巴靠经麦克风我们还没开始说话喇叭那端会产生一个持续的啸叫音很是刺耳。我们笔记本电脑也常有这个问题,比较让人受不了的是当机盖合到一定位置就会产生啸叫(因为这种情况比较容易出现有很大影响)。为了了解解决这一问题的方法我们就得现弄清楚啸叫产生的原因了。啸叫简单的说就是由于闭环系统震荡形成的。喇叭输出的声音经过空气,机构反射再到MIC,然后MIC又经过功放再从喇叭输出。这形成了一个闭环回路,当这个回路的增益A>1时就形成震荡,震荡达到功放输出的极限就成了啸叫了。我们知道声音信号经过喇叭输出后经过反射,吸收以及空气传输过程中的损耗,到达MIC端其衰减是很大的。所以一般闭环增益A一般不会大于1。

但是有两种情况导致啸叫产生成为可能。第一由于反射的存在使得在MIC端声音信号会存在一个峰点:即某一频率的信号在MIC这一点前一次,前两次

的信号与这一次的信号叠加使得信号增强(一般而言由于相位不同这种叠加的增强比较少)而这种峰点就导致最后闭环增益A>1。第二点由于Q值的影响,由MIC到功放这段的增益频率曲线会有尖峰存在,而这种尖峰点也是啸叫产生的原因。当然目前对于第二点的抑制已经做的很好了,基本不会存在问题。但是对于第一点一般情况下很难避免。

对于啸叫音的抑制一般有三种方法:均衡方式,移频方式,移相方式。均衡方式就是通过手动调节找到啸叫的第一峰点在通过调节运放使得在该频率点的放大倍数减小,从而保证A<1。以此类推我们可以找到第二,第三等等峰点再做调整。这种方式弊端在与1.我们在调节峰点频率的放大倍数时也会影响峰点频率附近频率点的放大倍数。2.这种说动调节本身要求就比较高非专业人士难以操作。移频方式就是输出信号对输入信号又一个频率的搬移,即1000HZ的输入信号移频后输出为1005HZ或者995HZ。这中频率搬移使得对于峰值信号的输入经过几次搬移后其输出信号已经远离峰值频率而避免产生啸叫。这种方式的弊端在与他对所有的输入信号都有移相的作用使得输出信号普遍的失真。另外这中方式还容易产生“喔”“喔”的声音,由于输入信号存在峰值频率前后的一系列信号使得在频率搬移的时候不断的会有信号移入和移出峰值频率所以产生不停的“喔”“喔”震荡音。移频技术在七八十年代是我国主要使用的技术,因此我们很多人应该还记得小时候学校广播经常会有不停的“喔”“喔”音。移相技术是随着DSP微处理器的发展而产生的新技术。其原理和移频技术类似,输出信号对于输入信号会有一个相位的偏移,而这个相位的偏移保证在峰点频率信号叠加的相位每次都不同就避免出现因为叠加而信号增强震荡的情况。移相技术不会像均衡方式那样难以调节,也不会像移频技术那样存在失真是当前主流技术。

上面讨论了三种常见的去啸叫声的技术。但我们发现这三种技术似乎都无法在我们笔记本设计上有所应用。对于第一种我们喇叭的功放放大倍数已经定了没法调节,另外像只是调节一个频率点的增益也不是目前我们所使用的运放可以调节的。对于第二种和地三种由于信号是通过MIC输入到codec再由codec直接输出至运放所以不存在调频与调相。那么我们对于啸叫音是否就是无能为力了呢。其实去除啸叫音的本质是减小闭环增益。我们知道信号在空气中传输会有损耗,所以如果你的MIC距离喇叭足够远无论如何都不会产生啸叫的,所以首先

在设计时要保证MIC距离喇叭越远越好(如果你MIC离喇叭很近那么很容易就会产生啸叫)。假设在MIC已经尽量远离喇叭后还是存在啸叫,我们可以试着一同MIC的位置看看移到哪些地方以后就不会有啸叫了。应为我们知道峰频的产生是前几次反射信号和这次输出信号叠加由于其相位一致性导致信号增强,所以我们移动MIC的位置可以打破之中前面信号和本次输出的相位一致性从而避免峰频的出现。当然换了位置消除了这一点的峰频有可能产生新的峰频。所以需要反复尝试验证。如果以上两种办法都不行我们可以考虑在喇叭或者MIC边上加点泡棉之类的材料来抑制峰频从而消除啸叫。

第二章controller and LINK Protocol

2.1 controller及其构架

图2-1

图2-1表示的就是PC内部HD Audio的构架。CPU从内存中读取音频文件信息以及解码的函数指令。然后CPU完成音频文件的解码工作。然后CPU再把解码后的音频数据放入内存指定位置。然后通过controller中的DMA控制器实现DMA传输把音频数据传输到Codec。这就完成了整个音乐播放的过程。

控制器(Controller):HDA控制器是总线控制I/O外围设备。它个或多个

DMA引擎,其中每一个都可以在存储器和codec之间传输单个的音频流。是从存储器到codec还是从codec到存储器,这要取决于DMA的类型。控制器实现所有的寄存器,这些寄存器就是编程的接口通过PCI或其他典型PC外围设备接口和系统存储器相连。它包括一

链路(Link):控制器物理上通过HDA链路连接一个或多个codec。链路在控制器和codec之间传输连续的数据。在带宽和协议上链路做到了优化。链路也要分配采样率时间基数,以BCLK(bit clock)信号出现。这个位时钟信号由控制器产生并应用在所有的codec上。在确定的数据传输率上链路协议支持多种采样率和大小。

Codec(音频解码器):链路上连接了一个或多个codec。Codec从时间多元链路协议中析取一个或多个音频流,并将它们通过一个或多个转换器(用“C”来表示)转换成一个输出流。一个转换器通常将一路数字信号转换成一个模拟信号,但也提供附加功能,比如说作为调制解调器或连接电话线。它可以将多元流分解,并将它以单个数字流传输,比如S/PDIF。Codec中转换器的数目和类型,以及插孔和连接器的种类,取决于codec的功能。Codec从链路的BCLK信号中获得采样率时钟。

有关音频设备:这些设备包括扬声器,耳机和麦克风。

2.2 LINK上的流和频道

这一节主要介绍在HAD LINK上数据是怎样传输的。为了组织数据来让这些数据在HDA链路上传输我们提出了流和频道的概念。流是创建于系统存储器缓冲区和codec之间的一个逻辑的或虚拟的连接,并由DMA引擎通过链路驱动,完成从存储器缓冲区到Codec的传输。流包括一个或多个有关组件和数据频道。每一个频道都连接一个在codec中的转换器。例如,一个立体声流包括两个频道:左和右。在这个流中的每一个采样点应该包括两个采样:左和右。这些采样在缓冲区中和在链路上传输的时候是组合在一起的,但是却在codec中连接不同的DA转换器。

流包括输入流与输出流,输出流可以连接到一个或多个codec上(反应到硬件连接上即是一根SDOUT线可以连接到一个或者几个codec上),流中可以包括流1,流2,流3等其中流1可能是 codec1的(modem),流2,流3可能是codec2的

(ALC662)。输入流与输出流不同的是一根线上只能传输一个流(即SDIN只能连接到一个codec上)。图2-2为流的传输结构图。

图2-2

输入流与输出都已帧的形式传输,图2-3表示流的帧机构图

图2-3

图2-3中stream即表示流,对于输入输出帧每一帧都可以有多个流。对于输出流可以多个流在一根SDOUT上传输,我们又是通过stream Tag流标头来区分各个不同的流。由于我们SDOUT可能连接到几个codec上不同的流可能传输到不同的codec上因此在SYNC帧同步信号上都有一个stream Tap,stream Tap是在对应的sterm传输前出现。不同的stream Tap对应接下来在SDOUT上传输的stream传输到不同的codec上。对于输入流我们知道一根SDIN上只能

传输一个流所以不需要有SYNC来传输其不同的stream tap。不过其SDIN信号线上会传输自己流的stream tap。如下图2-4和2-5所示。

图2-4

图2-5

图2-3中S_1,S_2,S-3就是我们的采样块。为什么会有S_1,S_2,S_3之分呢。因为我们知道HAD Link上传输每一帧的频率为48KHZ但我们音频信号的采样率可以是44.1/48/96/192KHZ。如果是96或者192KHZ的话我们一帧数据流中就需要传输2或3个采样块了。因此S_2,S_3就是在采样信号频率较帧频率高的时候才有的。当然我们采样率也有44.1KHZ甚至更低的22KHZ这种时候传输的时候可能就会出现空帧。对于44.1KHZ的采样信号我们以12:11即12帧当中有1个空帧的形式传输。每个采样块中又可以包括几个部分比如音频的左右声道等,而接下来的每个部分就是真正的一个音频信号的采样数据了可以是8位/16位或者是32位的。

2.3codec地址分配和握手方式

我们已经有谈到流的传输与格式。那么device如何辨认SDOUT上传输的

流哪个是给自己哪个给别的设备的,controller又如何判断SDIN上输入的信号是由哪个设备发出的呢。Controller会对HAD LINK上的设备进行地址分配,最多支持15个设备。Controller分配给device地址方式:设备在reser#无效以后第二个帧同步信号SYNC的下降沿采样SDIN信号,SDIN信号维持高电平的时间来决定设备的ID。采样到高电平后由BITCLK计数,有多少个BITCLK的高电平即表示设备的ID是多少(0-14)。所以说codec的热插拔是不支持的。其地址分配情况如图2-6所示。

图2-6

道了地址分配那么我们就不难明白像stream tap这些4位的流码头的作用

了。对于SDOUT由于一个信号线上并行传输多个流给不同的设别所以在每个流信息之前SYNC信号上都有一个相应流的stream tap来同志设备接下来的流信号由哪个设备接受。而对于每个流信号其中又包含许多块,比如音频

信号的左右声道,低音跑SPIDIF那么codec又如何对此区分。这就需要谈到在每个流开头还有一段命令包(40bit,其中8bit预留bit)这个命令包就是用来告诉codc数据流信息和控制codec工作的。而对于SDIN上没根信号只能接一个外设传输一个流信号因此在每个流信号传输前SDIN信号现上都有一个stream tap来告诉controller是由哪个外设传过来的信号。HDA controller中的DMA引擎把接受到流中的频道(比如左右声道)组合再由DMAA传输到达存储器指定位置。当每一个DMA引擎使能时,它都要查阅存储器缓冲区描述队列,其中每一个都定义了不同长度的缓冲区。它指挥缓冲区按照顺序从codec和向codec传输数据。对于DMA引擎的控制器寄存器空间包括了一个指针指向缓冲区描述队列的头,同样的也有一个识别队尾的指针。

第三章 HDA controller和codec的初始化

3.1controller初始化

HDA控制器是连接系统和codec的枢纽。上层他是通过系统总线(一般为PCI总线)与系统进行交易,下层他又通过HDA Link与codec进行交易。当HDA控制器在上电后进行重置时,所有的控制寄存器将处于它们的上电默认状态,HAD链路是不激活的。

启动控制器的第一步是适当的配置PCI/PCIE或者其他系统总线的接口。这一步的作用主要是激活PCI以及其他系统总线,使挂在系统总线上的设备被识别并能与系统进行交易,让HDA控制器在系统上做好传输的准备。比如,当利用PCI时,中断线,基地址和其他PCI配置空间寄存器应该被适当的设计。这时候HAD controller还没进行配置,只是使其上层总线激活。

接下来是控制器的配置。首先CRST位(偏移量08h,位0)将是0,这意味着控制器正处在reset状态。控制器处于reset状态的时候唯一能够接受的操作是CRST位使其结束reset状态,其他寄存器都是处于其默认值,写他们都是不起作用。当CRST为1控制器按照一定的步骤使其结束reset状态。链路开始工作开始初始化自己

当controller初始化完毕链路被激活开始初始化。Codec将检测到RESET#信号由控制器请求状态的改变和列举。 然后控制器通过SDIN信号来提供codec唯一的地址(上文已有说道地址的分配原理),并设置控制器STATESTS位来表明

状态改变事件在适当的SDATA_INx信号被检测到。软件可以利用这些位来决定连接在链路上的codec。在给定的位置上的1表明响应位置的codec是有效的,比如,05h意味着地址0和2有codec连在链路上。如果当新的codec连接上时软件希望得到一个中断,比如移动入坞事件,软件可以在INTCTL寄存器中设置CIE位为1来使控制器中断使能,其中包括状态改变事件。当中断被接收时,可以检测STATESTS位来决定没有预先定义的codec是否发出了状态改变的请求。

3.2 codec的配置

Codec其实在开始RESET#有效的时候就已经初始化自己了。RESET#必须至少有效250μs的时间来保证codec有足够的时间来进行这已初始化。初始化完成以后由于controller初始化也已经初始化完成LINK已经准备好传输数据。接下来命令就可以送往codec来配置其内部寄存器决定他们的能力。首先了解一下为什么我们需要在codec初始化结束后配置codec。以audio codec为例,ALC662是5.1声道的codec,我们设计电路时外部的功能不一定都用到即5.1声道不一定都有用,还有spidif之类的也是可用可不用的,还有一些带有复用功能的,对于这些系统要和codec要如何知道我们是怎么用的这就需要由我们来更具自己的设计配置codec。从而也就有了我么所说的verb table。我们使用厂商提供的应用软件选择我们所使用的配置。然后会生成配置文件。BIOS负责把配置文件加载到codec中。

BIOS在PCI/PCIE bus,controller,link,codec都初始化完成后才会对codec进行配置。BIOS通过两种方式:PIO和DMA来把配置信息写到codec中去。PIO方式是通过访问IO口。通过Immediate Command Input and Output Registers。HDA_Bar offset: 60h(ICW),64h(IRR)和68h(ICS)(IRV,ICB)来进行配置写。DMA方式就是CORB和RIRB这中方式以命令的形式写到codec中,下面会讲到CORB RIRB这种传输机制。在速度上PIO方式要块一些,而DMA方式则是会占用比较多的内存资源。我们现在一般是采用PIO的方式来配置codec的。

3.3CORB与RIRB

Codec命令和控制描述了一种机制,利用这种机制就可以控制送往codec或由codec发出的信息。命令和控制数据是低带宽的异步数据,并在链路上一次只传

输一个命令。时序是不确定的,或者是送往控制器或者是从控制器发出。Codec命令和控制由控制器通过两种机制管理,它们是命令输出缓冲区和响应输入缓冲区。软件通过CORB和RIRB控制器负责配置控制器的CORB和RIRB。

CORB是命令输出缓冲区。它是由软件在存储器中开辟出来的一块空间用来存放需要传输到codec的命令。控制器利用DMA获取CORB中的输出命令,并将它们放在每一帧开始的Command/Control位。CORB的大小由CORBSIZE控制寄存器设计为2个entry(8字节),16个entry(64字节)或256个entry(1024字节)。软件负责基于CORBSZCAP域选择CORB大小和系统的容量。总之,如果系统容量不小于正常情况时,软件应选择256个entry。硬件掌握两个指针,写指针(WP)和读指针(RP)。WP被软件使用来向硬件指出在CORB中的最后有效命令,而硬件使用RP向软件指出最后一个被取走的有效命令。WP和RP均是按照命令格式相对于缓冲区的偏移。由于每个命令是4个字节,由WP和RP描述的相对于CORB缓冲区的字节偏移是WP×4和RP×4。为了向CORB中增加命令,软件把命令放置在命令队列的末尾,它的字节偏移是(WP+1)×(4字节)。当软件完成写命令后,WP将被更新,并使其等于最后有效命令的偏移。当CORB被第一次初始化后,WP等于0,所以第一个命令将被放在4字节偏移的地方,而WP将被更新为1。当CORB的RUN位被置1后,控制器中的DMA引擎将不断的比较RP和WP来决定是否有新的命令需要传送。当读指针不等于写指针时,DMA引擎将不停的运转直到两个指针相等,在链路上的命令被传送完。DMA引擎从CORB中读取命令并将它们通过链路送往codec。如图3-1

图3-1

通过CORB传输命令要从检查CORB中是否有足够的空间。CORBWP和CORBRP的不等意味着在CORB中有可以得到的空间。如果命令的块比规定的大,就要将其拆成许多小块来传送。

命令由CORBWP+1指定偏移被写进CORB中,这是命令的第一块位置。注意到第一块命令,这意味着第一个命令被放在CORB中偏移为4字节的地方。由于CORBWP为0,那么CORBWP+1将意味着4字节的偏移。

CORBWP被软件改变来反映最后一个写进CORB的命令。硬件将开始通过链路传送命令,每从存储器中取走一个命令,CORBRP就会被改变。当CORBRP等于CORBWP时,所有的命令都被送出。这时控制器就停止传送动词直到软件重复这个操作,并给CORBWP一个不同的值。图3-2即表示命令的传输过程

图3-2

当硬件在传送命令的同时(CORBRP不等于CORBWP,CORB RUN位被置1),软件可以在CORBWP指定的指针后添加新命令,然后更新CORBWP。硬件必须继续传送新增加的命令。软件必须保证新增的命令对于缓冲区来说不溢出。比如,当命令没有被送出时,新增的命令将会覆盖原有的命令,当前读指针的值由CORBRP给出。

RIRB也是一存储器缓冲区,codec通过RIRB机制实现codec对controller的一个响应。一条响应从一个codec中发出送往控制器,在控制器中的DMA引擎将响应写入RIRB。被动响应在后来的一帧由单个codec应答,按照这样的顺序下一帧命令送往codec。主动应答由codec插入帧队列,当被动应答不占用链路时。控制器将响应流写入RIRB缓冲区。软件负责把不同codec发出的响应信号分开,包括主动响应和被动响应。

和CORB一样,在RIRB中用到了读指针和写指针。在RIRB中,RP是由软件控制的,它记录了软件从响应缓冲区中读出的最后一个响应,硬件不掌握RP。硬件控制着WP,表明写进响应缓冲区中的最后一个响应的偏移。控制器将应答信号(主动和被动)写进RIRB中,而不管它的内容。和CORB一样,WP表明了以一个响应为

单元的偏移。因为一个响应为8字节,所以相对于缓冲区的偏移为(WP×8字节)。

由codec向控制器发出的响应是32位的。在RIRB中的每一个entry是64位。在codec发出的真正的32响应之后,控制器又加了32位,这32信息是:

1.是哪一个SDATA IN信号接受codec的响应。 2.主动和被动响应指示器。 表8 RIRB Entry格式

位的定义按照下面进行: Codec:

0000=响应被SDATA_IN_0接受 0001=响应被SDATA_IN_1接受 0010=响应被SDATA_IN_2接受 0011=响应被SDATA_IN_3接受 ?

1110=响应被SDATA_IN_14接受 Sol/Unsol: 0=被动响应 1=主动响应

第四章采样和AD转换

声音信号是连续的模拟信号,而不管是CPU还是DSP这些微处理器都只能处理数字信号即二进制信号,而无法处理模拟信号。因此我们需要通过采样和AD转化把模拟信号转化成数字信号。

4.1采样定理

采样是每隔一定的时间间隔,抽取信号的一个瞬时幅度值(样本值)。采样的时间间隔称为采样周期;每秒采样的次数称为采样频率。采样后得出的一系列在时间上离散的样本值称为样值序列。声音信号我们可以看成是一个频率包含

20-20KHZ的连续函数F(x)。我们对其采样就可以看成是在时域上F(x)和(频率为采样频率)的冲击函数δ(t)的乘积。那么在频域上也就是F(w)和δ(w)的卷积积分。如下图(1),(2)是F(x)和δ(t)。(3),(4)是F(w) δ(w)。图(5)是F(w)和δ(w)的卷积积分。那么我们对F(w)采样以后他的频谱就是图(5)所示。那么我们可以看出如果把图(5)经过低通滤波器滤波后我们就可以F(w)和δ(w)的卷积积分还原成F(w),然后频域到时域的反变换就可以无失真的还原处信号F(x)。但是如果W2小于2W1也就是说我们的采样频率小于2倍的F(x)的最高频率那么我们可以看到F(w)和δ(w)的卷积积分在频域上会出现混叠,如图(6)所示。这样我们就无法通过低通滤波器还原出原来信号的频谱,也就无法不失真的还原出原来的信号F(x)了。因此就有采样定理:一个带宽限制的模拟信号可以用一个样值序列来表示而不会丢失信息,只要其采样频率大于或等于两倍被采样信号的最高频率。

(1) (2)

(3) (4)

(5)

(6)

当然我们上述所描述的只是理论,是理想的情况下。实际上采样必然会带来失真我们无法不失真的还原信号。首先我们的冲击函数就是理想情况下才有的。实际上我们的冲击函数是带有一定时间宽度的脉冲信号,而这些冲击函数在频域就是带有一定频宽的三角波。因此通过这些采样函数后原来信号的频域会出现失真甚至是混叠。那么我们要尽量减小这种失真就必须尽量减小采样脉冲信号的时间宽度。减小这一时间宽度就是减小采样开关管的导通时间。

采样电路的基本原理就是被采样的模拟信号经过开关管对负载电容充电,负载电容再经过Buffer或者运放最后得到采样信号。

4.2采样电路

采样电路一般可以分为四部分:采样开关,采样时钟,采样电容,输出缓冲。其原理就是通过打开采样开关使得输入信号对电容充电,再通过缓冲输出,输出

的就是被采样信号在采样电的信号强度(即幅值)。采样时钟控制采样信号的时钟频率。下图就是一个最原始的采样电路结构。

采样存在两个主要的特新:采样速度和采样精度。这两个主要的特性决定了采样电路的优劣。

采样速度其实决定了采样频率,如果采样频率超出了采样电路的采样速度那么就会产生很大的采样误差。即MOS开关的开通时间还不足以使得保持电容CH打到输入信号的大小。要提高电路的采样频率就必须一方面减小保持电容的容值另一方面减小开关管的导通阻抗从而减小保持电容的充电时间。我们知道MOS管的导通阻抗与其宽长比W/L成反比所以我们增加其宽长比既可以减小其导通阻抗。另外当Vin比较高时(接近MOS管栅极电压)当电容充电到接近Vin时管子会进入线性区,导通阻抗很大,这时候充电会很缓慢。为了避免这一情况的出现我们使用CMOS开关管,如下图所示。对于PMOS在Vin很高时,由于其栅极为CK-,所以反而处于线性区阻抗很低。而对于NMOS来说当Vin比较小时他工作在线性区导通阻抗很低因此两者并联则导通阻抗一直维持在一个比较低的值。所以现在我们一般用CMOS来做开关管。

上面已经提到较小的保持电容和交大的宽长比W/L会提高采样速度,但下面我们会看到这些提高采样速度的方法又会降低信号采样的精度。

在MOS管开关的瞬间有两种机制会产生误差来限制我们的采样精度。这两种机制分别是沟道注入效应和时钟溃通效应。

沟道注入效应:当MOS管开通时由于电子的积累产生沟道,但当管子关断沟道就会消失,那么存储在沟道中的电子就会随着沟道的消失而放电移出。这样一部分电子会注入保持电容CH使得我们得到的采样电压产生误差,如下图所示。我们通过计算可以知道这种注入效应增加的ΔV为

我们知道沟道与栅极相当与一电容,Cox就是单位面积这一电容的容值W,L是沟道的长和宽。所以说减小CH,或者增大W/L(由于一般而言MOS管的沟道长度是个定值,因此增加宽长比就是增加MOS管宽度)都会导致ΔV的增大从而影响采样精度。

当然由于我们用的是CMOS开关管。其P管也存在沟道注入效应而PMOS注入的是空穴刚好与NMOS注入的电子相抵消。因此CMOS开关管可以有效的控制沟道注入效应。但是我们毕竟无法保证注入的电子和空穴完全抵消。

时钟溃通效应:MOS管的栅漏和栅源的交叠电容会将栅极的时钟跳变耦合到保持电容上,如下图所示。

其误差可以近似的表示为

所以减小CH和增加W/L也会增加时钟溃通效应增加采样误差。

因此我们得到了一个矛盾的结果,我们要提高采样速度就必须减小保持电

容,增加宽长比,另一方面我们要提高采样精度就必须增加保持电容,减小宽长比。当然现在的采样电路虽然本质思想还没变但要比上面我们所讨论的基本的采样电路要复杂的多。沟道注入效应和时钟溃通效应也以后明显的改善。但这两个效应任然限制这采样精度,这也是采样电路设计的一大难点。

采样一般与A/D转换结合使用,CH电容反应了我们采样到的信号强度。开关断开后进行AD转换,AD转化的时间要远大于采样的时间。CH放电会导致电平的下降从而给后端的AD转化带来误差。于是我们就提出了保持这一概念来确保在AD转换时电容上的电平几乎没变化。于是我们据需要缓冲运算放大器。缓冲运算放大器具有很高的输入阻抗保证保持电容上电平几乎不变换,另一方面有驱动后端的AD转化电路。

高质量运放的设计可以提高采样精度,适用与更广的采样频率。在这里高质量运放主要参数是:高的输入等效电阻,低的输入等效电容,高的增益带宽积。高质量的运放的设计也是采样电路的一大难点。这里就不对运放的设计做过多的分析了,有兴趣了解可以参考模拟CMOS中“自举增益运算放大器的设计”。

下图就是一个简单的带有高增益运放的采样电路。相对与一般的MOS开关加电容式采样电路有更高的精度,更好保持特性以及更高的采样频率。

通过计算我们可以得到:Usc=1/[1-(1/A1+1/A1*A2)]Usr.所以增大运放的增益就可以提高采样的精度。开关闭合时整个电路就相当于一个大的跟随器,输出等于输入。开关断开时保持电容CH使得输出信号保持在上次采样到的输入值。这种电路模型对于沟道注入和时钟溃通效应有比较好的抑制作用。

4.3AD转换

AD转化的意义就是把模拟的信号量值离散化,是把整个幅值上连续的模拟信号划分成一个个台阶的离散信号。说白了就是把模拟信号转化成计算机能够识别的二进制码。

AD转换也是有两个主要参数即转换精度和转换速度,这和采样比较类似。AD

转换包括:并行比较型AD转换,逐次比较型AD转换和双积分型AD转换。如下图就是一个并行的AD转换器。

VREFR13V15REF11R15VREFRC7C6C5CO7Q7Q6Q5Q4Q31DC11DC11DC11DC11DC11DC11DC1寄存器I7I6I5优先I4编码I3器I2I1D2(MSB)D1CO6CO5RC4RC3C2CO4CO3CO2D0(LSB)R3VREF15R1V15REFR/2Q2C1CO1Q1vICP电压比较器代码转换器

并行AD转换的优点是速度快,其转换时间只是门延迟时间。其缺点也是很明

显的转换精度不够,如果我们需要8位AD转换即转换级数需要256位则需要256个运放以及寄存器,这就比较繁琐。基于这个原因改进型并行AD转化器就产生了,改进方法是从分压电阻入手,把分压电阻设计成:R/2,R,2R,4R,8R??,这样在同样的运放和寄存器数量下转化精度大大提高了。此时我们需要8位AD转换时需要的运放和寄存器数量只是8个。

对于另外两种AD转换这里就不再详述。这三种AD转换由于其设计的简单在要求精度不高的情况下是应用普遍的。而对于一些要求精度比较高的场合可能会综合三种方式的优点来设计,当然也可能自行设计新的方案。但是不管怎么说AD转换其原理是相同的思路也是大同小异的。

第五章音频信号的编码

对于音频信号的编码现在有很多种,比如PCM,WAV,MP3,ACC等,编码的目的就

是压缩减小音频文件的大小方便其存储和传输。PCM编码是最原始简单的编码,压缩率很低,由于一些语音文件,现在不多见。WAV和MP3是现在比骄常见的编码方式具有很高的压缩率,现在一般的音频文件都有这两种编码格式,一些消费类

电子产品也基本上都支持这两种音频文件的播放。ACC音频格式其实就是MP4,他具有比MP3文件更高的压缩率同时比MP3有更高的音质,但是其编码与解码的处理要比MP3格式复杂,增加CPU或者DSP处理器的负担。

这一章以MP3编码为例来说明音频编码的原理。

5.1音频编码的由来

对于音频信号我们常看到44.1KHZ/16bit/386Kb/S。这种用来描述音频信号的表示方法。44.1KHZ是表示采样频率也就是说我们采脉冲的频率,由于人耳的感知范围是20-20kHZ所以44.1KHZ已经大于我们人耳感知的最高频率的两倍,一次理论上来讲我们是可以无失真的还原出音频信号的。而16bit即表示采样位宽。其量化级数为2的16次方个量级。从中我们可以看出位宽越宽其量化级数越多量化的就越是精确细腻。256kbit/s表示的是比特流,即每秒传输音频信号的比特数。

我们对音频信号进行编码不管怎么样都回在采样和量化的基础上使得信号进一步的失真。那么我们为何还要对音频信号编码而不是直接传输储存呢。我们编码的根本目的是为了压缩音频信号,尽量把其中冗余和人耳感知不到的部分去掉,另外尽量保证人耳能感知部分的完整性。假设44.1KHZ/24bit/6声道音频信号(这是现在CD音质的音频信号)则其大小为:44.1*1000*24*6=5.2MB。这也就是说一秒钟这种音频信号占大概5Mbit的空间,8分钟音频信号则占5*60*8/8=300MB的空间。这么大的文件对于我们传输和存储而言是让人无法忍受的(一张CD的空间以700M计算,那么我们最多存储20分钟的歌曲)。因此我们需要对其压缩来解决这以问题。

5.2心里声学模型

谈到MP3的编码我们就现需要了解一下心理声学模型。MP3 具有高压缩率(大概13:1)并且对音频信号还有高的保真主要原因是其采用了心理声学模型来模拟人耳的听觉。利用人耳感知上的遮蔽效应所得到的遮噪门限曲线决定各个子频带所允许的最大量化误差,使得量化后的失真不被听见。

心里声学模型可以分为4个部分:静音门限曲线,临界频带,频域的遮蔽效应,时域的遮蔽效应。

静音门限曲线是在安静的环境下人耳能够听到的在各个频率下不同的声音

门限。下图就是通过实际模拟得到的一条心里声学模型静音门限曲线。

从图中可以看出人耳对3-4KHZ的声音信号特别敏感,而对于50HZ一下以及12KHZ以上的信号很不敏感,甚至一般情况下可以忽略。更具这以静音曲线我们可以把PCM音频信号中在这一曲线一下的不敏感信号去掉而不影响音质。

临界频带:由于人耳对不同的频率的解析度不同(对于20-20khz中能感知的部分)。因此我们可以把20-20khz频域的信号划分成很多个临界频带,并且我们人耳无法分辨在同一频带中的两个不同的频率信号(即人耳对频率的解析度)就像人耳不能分辨同一量化级中的两个强度不同的信号一样。这样我们就相当与把信号的频域离散化。

每个临界频率的频宽有下式表示。

BW(f)=25+75*[1+1.4*(f/1000)^2]^0.69 HZ ???????2.1 通过临界频带这一概念我们就把信号的频率分成一段一段区间。每段区间都有相同的属性。

频域上的遮蔽效应:在频域上SPL(sound pressure Level,评估声音强度的标准)较大的信号会对周围频率临近的声音信号产生遮蔽效应如下图所示。图中有三个信号被marsker遮蔽,其中一个信号甚至低于静音门限。

通过静音门限曲线和频域上的遮蔽效应这两点我们可以确定最终的门限曲线。这样我们就可以引入一个量叫做SMR:signal-to-mask rate.即信号遮蔽比。也就是信号强度与门限的比值。另外我们还有SNR:即信噪吧比和MNR即屏蔽噪声比。

我们有:MNR=SMR-SNR只要MNR大于0。那么噪声所带来的误差我们将会听不到。

我们知道在量化的时候会产生噪声,量化的越细腻噪声就越小,那么我们要量化到多细腻所产生的噪声才不会对音质有影响呢?我们就由上面的公式知道只要保证MNR大于0就不会对音频质量有影响。因此通过MNR我们就可以确定不同频率的音频信号所需要的量化级数。通过上面所说的频域的遮蔽效应我们可以知道某一频带的具有交大的SPL的信号会对其相邻频带有遮蔽效应。而这个值的大小就由下面的公式得到

SFdb(X)?15.81?7.5*(x?0.474)?17.51?(x?0.474)2dB 其中x为频带间

的距离。

时轴上的屏蔽效应:人耳在时间轴上也会产生屏蔽效应。在一个很短的时间内,若出现两个声音信号,不论出现的先后顺序SPL大的声音信号将会屏蔽SPL小的声音信号。时间轴上的屏蔽效应重要之处在于能够让前回应的杂讯不被人耳所察觉。现来说明前回应产生的原因:若在一段振幅较小的 声音后,突然出现

一段振幅较大的声音信号此时会产生较大的量化误差,如果在解码中又经过反变换则这个量化误差又会再被放大,这就产生前回应的现象(如下图所示)。后面就提到了MDCT(离散余弦变换)的长短窗口来解决这一问题。

以44.1KHZ的取样频率为例。MP3一个编码框包含1152个声音信号,相当于26.1ms的时间长度,则前回音按照回音遮蔽效应原理其涵盖范围为20MS左右,无法很好的遮蔽前回音。此时我们用MDCT短窗口(相当于在时间上的细分)就可以把26.1Ms时间长度缩短到8.7MS,这样以来前回音就不会被发觉了。MP3编码中是由PE(后面有说)值来决定使用MDCT长窗还是短窗的。当PE值大于1800时我们就需要使用长框(当然这里是指44.1KHZ/24bit的CD音质的采样)。因为PE大于1800时表示需要用较多的位元来编码,表示此时声音信号的变化比较大,容易出现前回音。

5.3 PE 值的计算

了解了心里声学模型我们接下去就可以讨论如何通过这一模型来压缩我们的音频信号的数据。

在这里我们引入一个量PE来说明。PE的单位是bits/sample。其意思是每个采样数据需要占用的bit数。(我们所说的24/32bits是最大情况下的采样精度并不是每个采样信号都用这么多,我们压缩就是从这里入手的)下面讨论PE的计算方法。(我们编码是按照一帧一帧来编码的。以1152个采样值为一帧。因此我们这里的PE其实是一个编码帧中所需要的比特数)

P(w)=Re(w)^2+Im(w)^2 P(w)为每个频线的能量。??.2.2

i?bhBi=i?bl?P(w) i代表第i个频带,Bi是第i个频带的能量。?.2.3

SFdb(X)?15.81?7.5*(x?0.474)?17.51?(x?0.474)2dB SF(x)相

邻???.2.4

频带带来的遮蔽作用。其中X是频带之间的距离。 Ci=Bi*SF(X)?????2.5

SFM?μGμA 其中μG,与μA分别是各个临界频带的几何平均数和算术品均

数。

SFMdbα=min(,1)-60然后得出单频系数

然后再得出offest如下

Qi?α*(14.5?i)?(1-i)*5.5 ????2.6

lgCi?0.1*QiT?10再得出临界频带的门限值 i

当然我们最后还要把静音门限考虑进来所以最终的门限值为 Ti=max(Ti,

Tqi)。其中

Tqi为静音门限值。(是一个固定值,可以查表得到)。

最终我们得到PE。

PE???[log2(ninti?1w?bli?25bhRe(w)Im(w)?1)?log2(nint)]6Ti/ki6Ti/ki???????.2.

7

PE表示维持在CD音质下的最低取样的位元数。

5.3位元的分配以及帧格式

位元的分配是由MNR来决定我们只要保证MNR大于0就可以,因此可

以根据不同频带的SMR来合理的分配位元使得其MNR(SMR-SNR)大于0.当然为了达到更好的效果,其实是一个反复的过程,每次找出最小的MNR的频带,分配位元给此频带以提高MNR,接着重新计算个频带的MNR然后再重复此过程直到位元分配完毕。

位元数的计算。比如128kbps的传输率,其中1152是每个编码框44.1khz为取样频率。则可编码的位元数是

N=128*1024/(44.1*1000/1152)=3344个编码单元。

MP3的位元串格式。P3的一个位元串就表示一个编码框的编码资料。其位元串包含:档头区,错误侦测码区,附属资料和主要资料。档头和附属资料是我们解码时所需要的资料。错误侦测码是解码是做侦测作用防止因为当头出现错误而无法解码资料。

MP3档头的格式:

档头包含同步化参考标记,错误侦测,辨认ID,位元率,错误侦测,取样频率,音频模式等等。

MP3位元储藏处

因为MP3每个编码框对应的音频信号不尽相同,所以为了维持一定的音频质量,每个编码框所需要的位元数也不尽相同。因此MP3使用位元储藏的机制来调制,使得所需位元少的编码框得到较少的位元数,所需位元数多的得到更多的位元。每个编码框都有一个9个位元的暂存器存放与其附属资料内。每个暂存器指定了编码框资料的开始位置。这样以来就可以动态的决定每个编码框的开端。如下图所示frame1有未用完的空间,frame2的指标main_data_benin指向frame1未用完的区域。

5.5MP3的编码过程

MP3的编码主要是去除采样信号中冗余的和根据第二心里声学模型所示的被屏蔽的量。对音频的编码也是一步步来的,对于刚开始的语音信号由于它比较粗糙流量比较小我们一般只是用DPCM,ADPCM等一系类比较简单的编码技术。到后来的高保真语音编码技术就开始用子带滤波以及心里声学的原理了。刚开始的子带滤波与现在的还不同,其过程是:先把模拟音频信号通过带通滤波器滤波,再对其进行采样,再对其采样值根据心理声学模型进行量化,分配不同的比特率。但是这个有一个显著的缺陷就是音频信号经过模拟的带通滤波器会带来失真。另外带通滤波器本身也存在很大的失真。所以MP3编码就现采样,然后通过数字带通滤波器对其数字信号进行滤波。

图3-1

MP3的编码过程如上图所示。输入的音频采样信号先经过一个滤波器组分成32个子频带的信号;同时输入信号经过离散傅立叶变换得到频域的信号;接着32

个子带信号经过MDCT离散余弦变换进一步把每个子带再细分成18个次频带,使得各个频带跟接近心里声学模型的临界频带。另外一路通过FFT离散傅立叶变换的信号经过第二心里声学模型的分析得到各个频带的SMR。以及PE值,然后再根据这个SMR再分配给各个频带不同的位元数,另外根据不同的PE值选用不同的MDCT窗口(一般在PE值大于1800时我们用短窗口),最后再经过霍夫曼编码得到最终的MP3编码的数据流。

5.6子带滤波器

子带滤波的意思就是把原本一个频带的信号划分为一个个固定或者不固定

带宽的信号。MP3是划分32块。也就是把原本44.1K(CD音质)的信号划分到32个子带。当然我们也不是把整个时间域上的信号划分到32个子带,而是在时间域上把音频信号分为一个个的编码框再进行子带划分。我们一般以1152个采样信号为一个编码框(对单声道而言)每个采样为16位元。然后我们再对此编码框子带滤波。将其转换成32个子带信号。我们一次会对32个PCM信号做子带滤波,所以1152个需要36此子带分析。 多重相位滤波器组的数学公式如下:

π*(2*i?1)*(n?16)Hi[n]?h[n]*cos[]64 ?????????.3.1

32个子带滤波器,所以(i=0-31)

我们输入的PCM流经过这一子带滤波器后得到如下结果

Pi[n]??x[n?m]*Hi[m]m?0511 (i=0-31)?????..3.2

那么下面我们讨论这多重相位滤波器组。Hi[n]可以看成是一个FIR滤波器组包含32个FIR。hi[n]是一个离散的sink函数。当然离散的sink 函数是一个从负无穷到正无穷的函数,对与这个我们在现实中无法实现,于是我们就对sink函数加窗让他变为有限序列。我们知道离散的 sink函数的频域是一个周期的窗口函数,我们对其在时域加窗以后其频域又会发生什么变化呢?我们后续就是要用sink函数频域为窗口的特性,因此我们希望在我们加窗以后sink函数的频域变化不大。以一般的窗口函数为例,其频域是一个sink函数。我们知道时域的

相乘为频域的卷积,因此频域也就为sink函数与窗口函数的卷积积分,其结果是使得原来频域的窗口函数在窗口的边沿变缓并且有一定的抖动,但其整体变化不大。因此我们可以用一个加过窗的sink 函数来代替原来的sink函数产生频域的窗口。

我们要分频就相当于在频域对其加窗从0-44.1K32个窗(如果是等分的每个窗口宽度为44.1/32.)也就是说我们在其频域从0-44.1K上放上32个等宽的窗

π*(2*i?1)*(n?16)cos[]64口函数对其加窗。的频谱是一个冲击函数,hi[n]是个离

散的有限sink函数,其频域是近似周期的窗口函数。两者时域的相乘为频域的卷积积分,所以得到窗口函数,并且i=0-31所以得到频域上的窗口函数。又由式3.2可知在时域上的卷积相当与在频域上的相乘,所以我们就得到了x[n]的32个频带信号。

5.7MDCT

MDCT主要作用是:1.通过长短窗口的使用来减小前回音2.进一步细分频带使得量化误差进一步减小。

MDCT包含4种窗框:长窗框,短窗框,长短窗框和短长窗框。这四种窗框,由于长窗框有较长的时间常数因此可以包含更多的采样值于是有更好的频普解析度。而短窗框具有较短的时间常数因此包含较少的采样值,这可以有效的减小前回音时间,有利与降低前回音。而长短窗框和短长窗框则是从短窗框到长窗框或长窗框到段窗框时的过度窗口。根据前文可知MDCT窗框选择是由PE值决定的,大的PE值表示信号在时域变化很快,需要用短窗框来减小前回音。而小的PE值说明信号在时域变化不大,我们用长窗框来保证其频普解析度进而减小量化失真。

下面是各个窗口的窗框系数z,我们可以看到长窗框每次是对36个采样值进行MDCT运算,而短窗口每次是对12个采样值进行运算。

MDCT运算公式如下:

Xi??zkcos[k?0n?1πn(2k?1?)(2i?1)]2n2 for i=0,1??.n/2-1??????3-14

对于这些公式的推导说明这里就不做分析了。MDCT运算既不是时域也非频域而是一种变换域编码。式3-14是一个正交的变换域矩阵,通过这一正交矩阵运算把原先32个子带滤波器组输出的32组频带信号再每个细分为18个子带,并且通过MDCT长短窗口的控制来减小前回音。频带的进一步细分一方面可以使得频域划分更细另一方面可以减小前面的32个多相滤波器组带来的频域的混叠。另外正交的MDCT矩阵的逆矩阵就是其转置所以这可以在DSP芯片做MDCT计算的时候很方便不会存在太大的负荷。

5.8量化编码

经过上面的子带滤波,MDCT变换我们就得到了32*18=576个频线的信号,然后我们在通过每个频线所分配到的位元数对他们进行量化。我们从上面的MP3

编码流程图(图3-1)可以看出来,MP3编码有2路并行工作。其中第一路是把音频信号做自带滤波和MDCT变换,第二路则是用于得出各个频线的位元分配。第二路现对PCM音频信号做FFT得到其频域的值,然后由第二心理声学模型通过频域的遮蔽效应和静音门限曲线得到各个频带在CD音效前提下不失真编码所需要的最少位元数。

非均匀量化。对于量化我们上面已经说过就是把模拟连续的量值离散话,也就是对于模拟的连续的量值分成一个个台阶的离散的值。那么非均匀量化意思就是量化台阶并不是均匀的固定的值。就像我们熟悉的μ率编码。MP3的非均匀量化公式如下式:

ix(i)?nint((xr(i)?2?40.75)?0.0946)stepsize??????3-15

其中ix(i)是输出的MDCT频线,nint()是四舍五入函数。Setpsize由SMR决定。下面是量化后普线和量化前的普线。从中我们可以看处次量化非线性的而是一个近似0.75次方的关系。在信号较小的时候量化台阶较小,信号交大的时候相应的量化台阶就变大了。这样的好处在与可以提高小信号的分辨率而不额外的增加量化位元数。

MP3经自带滤波,MDCT变换,量化后得到的已经是去除冗余,以及加上遮

蔽效应以后的最精简的2进制码了,但这还不是我们最终MP3的二进制码。因为MP3二进制编码还要最后一步即霍夫曼编码。其实质就是替代。我们可以使用一些较短的码来替代较长的码达到压缩的目的。其原理是首先扫描整个未编码的2进制码,然后算出各个码组出现的概率,最后制定树形结构表把出现概率比较高的码用较短的码代替,出现概率比较高的码用较长的码代替。如下图所示,通过此树形结构和对应的码表我们可以看出,s1与s2出现的概率最大因此其编码长度只有两位。而s7与s8出现的概率最小所以其编码长度是5位。

49符號 s1 s2 s3 s4 s5 s6 s7 s8 碼 00 10 011 111 110 0101 01000 01001

0s70410s12801211130190711s201s4s3s5s6s8对于MP3霍夫曼编码,会先把经过MDCT后的频线分为三个区域,一个为高频区为一段连续的0值,这一区间不需要编码,这一区域的长度只是总长度减去另外两个区域的长度即可。另外一个是count1区间,这一区间每个频线为一位编码位元,以四个频线为一组进行吧编码,所以有16中不同的编码组合,我们用两个霍夫曼表建立码值与霍夫曼值的对应关系,不同时刻count1区间各个码值出现的概率不同,我们也就是根据这个来找到2个霍夫曼表中最符合要求的。最后一个区域是big_value区域,在这一区域每个频带的编码值不止一位,我们以2个频带为单位对其编码。在这一区域中一共有32个霍夫曼表与之对应,我们根据不同时刻各个码值出现的概率来决定对应哪个霍夫曼表。最后通过各个频线对应霍夫曼表找到的霍夫曼值才是我们最终的MP3编码。

5.9总结

MP3编码大致可以分为两路6个部分。第一路是PCM信号先是进过自带滤波,MDCT变换把信号划分到576个频线。然后第二路PCM信号经过FFT快速傅立叶变换把时域信号变化到频域,再根据第二心理声学模型得到各个临界频线下的SMR,最后更具位元分配原理确定各个频线分配的位元数。这时第一路和第二路是并行进行的。最后更具各个频线所分配到的位元数进行非均匀量化。量化后再由霍夫曼编码得到最终的MP3编码文件。

第六章 DSP, 硬声卡的简单介绍

6.1 DSP

DSP数字处理器要求运算速度块就是应为在信号转化分析过程中需要进行大量的加法,乘法,积分,微分的运算。而其中乘法运算和加法运算尤为的多,因此DSP的一个特点是硬件乘加器,(一般的处理器乘法都是由软件逐条的执行指令实现)依靠硬件单指令周期实现乘法和累加两个运算。

DSP数字信号处理器,是专门为快速实现各种数字信号处理算法而设计的、

具有特殊结构的微处理器,正因为其专用性和特殊性要求其运算速度非常高,其处理速度已高达2000MIPS,比最快的CPU还快10-50倍。

20世纪六七十年代由于受电子发展水平的限制当时的信号处理基本上是以模拟的方法实现,比如滤波频谱分析等等。但由于模拟分析的局限性(精度无法很好的控制)现在信号分析都由数字化处理,如数字滤波器,频率分析等等。就如上面我们所提到的MP3编码,其中子带滤波就是很明显的一个数字滤波,其中涉及到的传输函数的计算,输入流通过传输函数以后的求和这一系列的运算量就很大。还有就是MDCT矩阵运算也是不小。因此需要的数字滤波其具有很强的运算能力。当然MP3编码或者一些其他芯片的运算量相对与当今的CPU构成不了太大的负担。但是对于一些比较复杂的信号分析运算就需要专门的DSP数字处理芯片来实现了。

DSP除了其运算速度块以外还有一个性质就是其专用性。DSP芯片厂商会针对一些特定的领域专门设计与之像对应的DSP芯片。可以把一些算法,模块固化到芯片中去加快芯片的运算执行能力。像一些余弦函数,正切函数等都固化

到硬件当中,通过一些专用的信号处理指令来调用这样减少运算时间。

上图为一个DSP处理器的内部结构图,他包括两条数据总线和两条地址总线,程序地址总线,数据地址总线和程序数据总线,数据数据总线,由于DSP是采用哈佛体系结构数据和程序是分开存储的。他内部含有内存空间可以存放程序和数据,同时他也可以通过外部扩展接口外挂Flash 存储器。AU为其内部处理器核心,执行各类运算。DAG地址产生器,用来产生和控制数据和程序地址的生成。还有一些可编程外部引脚。

对于内部处理器核心AU又可以分为三部分:ALU,MAC,Shifter。其中ALU是加法器,实现算术操作如加,减,求绝对值,以及多指令除法等,实现逻辑操作如与,或,异或,求反等。MAC是乘法累加器实现乘法运算和相乘后累加,相乘后递减等运算。Shifter是移位寄存器,作用是对16位输入数据做移位操作输出32位的数据。

6.2 硬声卡

硬声卡的是相对与软声卡而言的。软声卡就是一般而言的集成声卡,他与硬声卡的主要区别就是软声卡的数字信号处理是由CPU来实现的,而硬声卡的数字处理是由DSP来实现的。因此我们笔记本上的codec,CPU,HDAcontroller, HDLink等就构成了一个软声卡的系统。而一些台式机通过PCI插槽外接的声卡

就是硬声卡。

像笔记本之类的便携式产品一般音频文件都由CPU负责解码,这样对于便携式设别而言可以做的更精简,另一方面可以减低成本。而我们对笔记本音质要求并不是特别高,不会用于一些特殊场合,对于MP3,WAV文件的解码对于当今CPU来说运算量也称不上什么负担因此软声卡完全可以胜任。而对于录音对于一般的语音录音本身数据量计算量就不大因此谈不上CPU的负荷了。但是在播放高清电影时(1080P)不管是CPU还是GPU都必须非常强大而且内存与现存要够大。因为这类电影不管是运算量还是数据流量都非常大。

硬声卡和软声卡比较的主要优势在两个方面。首先硬声卡有专有的DSP芯片专门对音频信号做处理。这样减轻CPU的负担,CPU只是负责把音频文件发送给声卡(声卡相当与挂在PCI桥上的一个设备),因此对于CPU来说操作会很简单。另外由于DSP的运算快和他的专有性和针对性他对音频文件的处理,解码过程中的一些运算要比CPU强很多,因此最终的解码效果要好很多。特别是对于一些高质量音频信号,这些信号的编码,解码运算比骄复杂,可能还有许多音效的处理,以及人体心里声学更细腻的描述。其次硬声卡的带宽限制要比软声卡好很多,软声卡走HDALink其带宽限制理论为48MBit/S,对于一些音效高的无损编码这个带宽有可能不够。而硬声卡走的是PCI总线(x32/33MHz)其带宽理论为133MB/S也就是133*8Mbit/S,这无论对于哪种音频文件已经构不成带宽限制。

本文来源:https://www.bwwdw.com/article/trx.html

Top