Audio系统构架摘要:本课题主要研究音频的构架以及原理这里的音频构架主要针对 笔记本codec以及HAD LINK通过对CODEC初始化,工作原理以 及Azalia协议的描述来说明笔记本音频系统的构架另外通过采样, D/A转换,编码,DSP处理,硬声卡等一系列的描述来体现整个音频 系统的原理目 录第一章codec的介绍 2l.laudio codec 21.2ALC662 21.3ALC662外围电路设计 3第二章 controller and LINK Protocol 72.1 controller 及其构架 72.2 LINK上的流和频道 82.3codec地址分配和握手方式 11第三章 HDA controller和codec的初始化 123.1controller 初始化 123.2 codec 的配置 133.3CORB 与 RIRB 13第四章采样和AD转换 164.1采样定理 164.2采样电路 184.3AD 转换 21第五章音频信号的编码 225.1音频编码的由来 235.2心里声学模型 235.3 PE值的计算 275.3位元的分配以及帧格式 285.5MP3的编码过程 305.6子带滤波器 315.7MDCT 325.8量化编码 33365.9总结第六章DSP,硬声卡的简单介绍 366.1 DSP 366.2硬声卡 37第一章codec的介绍l.laudio codecCodec意思是数字信号编码器,其使用范围很广泛,在这里我们只讨论audio codeco audio codec在笔记本中其根本的作用主要是D/A,A/D转换。
audio codec 从HAD LINK上接受到的是纯正的一帧一帧的音频采样信号(后续会对此详细 描述),他就是通过对这些采样信号D/A转化得到最后的模拟声音信号的输出 当然audio codec也可以通过MIC,LINEIN等端口接受到模拟的音频信号,然后 对这些信号进行A/D转换,再传输到上层编码,最后储存或者传输下面我们 以ALC662为列对CODEC做详细的描述1.2ALC662ALC662是一款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上所有的deviceo 当power up PCI reset或者软件通过CRST寄存器初始化link的时候都会产生 REST#o BITCLK是有HAD controller发出的连接到link上所有设备的工作24M 参考时钟。
SYNC是48KHZ流同步信号,每一帧中会包含一个到几个的流,给 不同的设备,每个流的stream tag就是包含在SYNC信号中SDOUT是有HDA controller发送到codec的数字信号,支持一对多连接,即LINK几个设备可以公 用一个SDOUTo SDOUT是在clock上升和下降沿都采样的信号,一次其速率为48MSDIN是由device向controller传输数据的只支持一对一传输,即不可由多个device公用一根SDIN线两个数字电分别用于内部core逻辑和link的用 电其内部core逻辑为3.3V供电,link用电可以是3.3v也可以是1.5V这就需 要由南桥的HAD controller输出决定了模拟部分也就是最终声音信号输出或输入其中输入包括 LINE IN,MIC IN,CDINLINEIN可以作为录音功能使用,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-脚不一致,产生一个AV或者AI也就是这个产生的bobo声图1-1对于MIC的啸叫音这也是我们经常遇到的情况现实生活中也长有:比如 拿着麦克风讲话时,嘴巴靠经麦克风我们还没开始说话喇叭那端会产生一个持续 的啸叫音很是刺耳我们笔记本电脑也常有这个问题,比较让人受不了的是当机 盖合到一定位置就会产生啸叫(因为这种情况比较容易出现有很大影响)为了 了解解决这一问题的方法我们就得现弄清楚啸叫产生的原因了啸叫简单的说就 是由于闭环系统震荡形成的喇叭输出的声音经过空气,机构反射再到MIC, 然后MIC又经过功放再从喇叭输出这形成了一个闭环回路,当这个回路的增 益A>1时就形成震荡,震荡达到功放输出的极限就成了啸叫了我们知道声音 信号经过喇叭输出后经过反射,吸收以及空气传输过程中的损耗,到达MIC端 其衰减是很大的所以一般闭环增益A 一般不会大于1。
但是有两种情况导致啸叫产生成为可能第一由于反射的存在使得在MIC 端声音信号会存在一个峰点:即某一频率的信号在MIC这一点前一次,前两次 的信号与这一次的信号叠加使得信号增强(一般而言由于相位不同这种叠加的增 强比较少)而这种峰点就导致最后闭环增益A>1第二点由于Q值的影响,由 MIC到功放这段的增益频率曲线会有尖峰存在,而这种尖峰点也是啸叫产生的 原因当然目前对于第二点的抑制已经做的很好了,基本不会存在问题但是对 于第一点一般情况下很难避免对于啸叫音的抑制一般有三种方法:均衡方式,移频方式,移相方式均衡 方式就是通过手动调节找到啸叫的第一峰点在通过调节运放使得在该频率点的 放大倍数减小,从而保证A<1以此类推我们可以找到第二,第三等等峰点再做 调整这种方式弊端在与1.我们在调节峰点频率的放大倍数时也会影响峰点频率 附近频率点的放大倍数2.这种说动调节本身要求就比较高非专业人士难以操 作移频方式就是输出信号对输入信号又一个频率的搬移,^"000HZ的输入信 号移频后输出为1005HZ或者995HZ这中频率搬移使得对于峰值信号的输入经 过几次搬移后其输出信号已经远离峰值频率而避免产生啸叫。
这种方式的弊端在 与他对所有的输入信号都有移相的作用使得输出信号普遍的失真另外这中方式 还容易产生“喔”“喔”的声音,由于输入信号存在峰值频率前后的一系列信号 使得在频率搬移的时候不断的会有信号移入和移出峰值频率所以产生不停的“喔”“喔”震荡音移频技术在七八十年代是我国主要使用的技术,因此我们 很多人应该还记得小时候学校广播经常会有不停的“喔” “喔”音移相技术是 随着DSP微处理器的发展而产生的新技术其原理和移频技术类似,输出信号 对于输入信号会有一个相位的偏移,而这个相位的偏移保证在峰点频率信号叠加 的相位每次都不同就避免出现因为叠加而信号增强震荡的情况移相技术不会像 均衡方式那样难以调节,也不会像移频技术那样存在失真是当前主流技术上面讨论了三种常见的去啸叫声的技术但我们发现这三种技术似乎都无 法在我们笔记本设计上有所应用对于第一种我们喇叭的功放放大倍数已经定了 没法调节,另外像只是调节一个频率点的增益也不是目前我们所使用的运放可以 调节的对于第二种和地三种由于信号是通过MIC输入到codec再由codec直接 输出至运放所以不存在调频与调相那么我们对于啸叫音是否就是无能为力了 呢。
其实去除啸叫音的本质是减小闭环增益我们知道信号在空气中传输会有损 耗,所以如果你的MIC距离喇叭足够远无论如何都不会产生啸叫的,所以首先在设计时要保证MIC距离喇叭越远越好(如果你MIC离喇叭很近那么很容易就 会产生啸叫)假设在MIC已经尽量远离喇叭后还是存在啸叫,我们可以试着一 同MIC的位置看看移到哪些地方以后就不会有啸叫了应为我们知道峰频的产 生是前几次反射信号和这次输出信号叠加由于其相位一致性导致信号增强,所以 我们移动MIC的位置可以打破之中前面信号和本次输出的相位一致性从而避免 峰频的出现当然换了位置消除了这一点的峰频有可能产生新的峰频所以需要 反复尝试验证如果以上两种办法都不行我们可以考虑在喇叭或者MIC边上加 点泡棉之类的材料来抑制峰频从而消除啸叫第二章 controller and LINK Protocol2.1 controller 及其构架Fligli DefniitiDii 融间 iu Codec in MDtde DOCK |<1一、图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链路在 控制器和code c之间传输连续的数据在带宽和协议上链路做到了优化链路也 要分配采样率时间基数,以BCLK(bit clock)信号出现这个位时钟信号由控 制器产生并应用在所有的codec上在确定的数据传输率上链路协议支持多种采 样率和大小Codec (音频解码器):链路上连接了一个或多个codeco Codec从时间多元 链路协议中析取一个或多个音频流,并将它们通过一个或多个转换器(用“C” 来表示)转换成一个输出流一个转换器通常将一路数字信号转换成一个模拟 信号,但也提供附加功能,比如说作为调制解调器或连接线。
它可以将多 元流分解,并将它以单个数字流传输,比如S/PDIFO Codec中转换器的数目和类 型,以及插孔和连接器的种类,取决于codec的功能Codec从链路的BCLK信号 中获得采样率时钟有关音频设备:这些设备包括扬声器,耳机和麦克风2.2 LINK上的流和频道这一节主要介绍在HAD LINK上数据是怎样传输的为了组织数据来让这 些数据在HDA链路上传输我们提出了流和频道的概念流是创建于系统存储器 缓冲区和code c之间的一个逻辑的或虚拟的连接,并由DMA引擎通过链路驱动, 完成从存储器缓冲区到Codec的传输流包括一个或多个有关组件和数据频道 每一个频道都连接一个在code c中的转换器例如,一个立体声流包括两个频道: 左和右在这个流中的每一个采样点应该包括两个采样:左和右这些采样在缓 冲区中和在链路上传输的时候是组合在一起的,但是却在codec中连接不同的 DA转换器流包括输入流与输出流,输出流可以连接到一个或多个codec上 (反应到硬 件连接上即是一根SDOUT线可以连接到一个或者几个codec上),流中可以包括 流1,流2,流3等其中流1可能是codec1的(modem),流2,流3可能是codec2的(ALC662)。
输入流与输出流不同的是一根线上只能传输一个流(即S DIN只能连 接到一个codec上)图2-2为流的传输结构图BufferAzalia ControllerDMA-1图2-2输入流与输出都己帧的形式传输,图2-3表示流的帧机构图图2-3图2-3中stream即表示流,对于输入输出帧每一帧都可以有多个流对于 输出流可以多个流在一根SDOUT上传输,我们又是通过stream 丁④甘流标头来 区分各个不同的流由于我们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所示IWIUII in^iiiiiiiniiuiininniiiiniiuiuuiunninniniiuniuni—「一 7| 就谶叫| *1 Wiaxt Frame |^^uiuuninnininn^iii^iinumiiConmand SirBam V Strewn *A.e Qvla( S' D-ala jfRtcp^nise- Siredm {Slum :C'T-aig] !C [3ata gBCLH.|24-的 MrlE.If-IIG3 DO401 RlTl图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所示Tumaround FrameAddress FrameHiormal Link□p河 nisi河技me珈S (潮期C( iODEL j=C Sraml :pies A3「停睦I♦ ♦ ♦t Addrca-a 115 is rtscirvedl for link protocol purpos® "d may not be assigned to CODECsn_nnSYMCFrairbe SYNCResponse Stream]SDHOResponse Stream]弓DMResponse Stream]SD12Resuanse Stream]SDI3SDB1415 BGLK C WController dri SDi to sig nail address to CODEC comeciian lo the HD Audio contrnller.Controller SDI turns around and becomes an input in 47J bclk cycles or fess.BCLK (24.00 MHz}Frame SYNCStreami图2-6道了地址分配那么我们就不难明白像stream tap这些4位的流码头的作用 了。
对于SDOUT由于一个信号线上并行传输多个流给不同的设别所以在每 个流信息之前SYNC信号上都有一个相应流的stream tap来同志设备接下来 的流信号由哪个设备接受而对于每个流信号其中又包含许多块,比如音频 信号的左右声道,低音跑SPIDIF那么code c又如何对此区分这就需要谈到 在每个流开头还有一段命令包(40bit,其中8bit预留bit)这个命令包就是用 来告诉code数据流信息和控制codec工作的而对于SDIN上没根信号只能接 一个外设传输一个流信号因此在每个流信号传输前SDIN信号现上都有一个 stream tap来告诉controller是由哪个外设传过来的信号HDA controller中的 DMA引擎把接受到流中的频道(比如左右声道)组合再由DMAA传输到达 存储器指定位置当每一个DMA引擎使能时,它都要查阅存储器缓冲区描 述队列,其中每一个都定义了不同长度的缓冲区它指挥缓冲区按照顺序从 code c和向code c传输数据对于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 us的时间来保证codec有足够的时间来进行这已初始化初始化完 成以后由于controller初始化也已经初始化完成LINK已经准备好传输数据接 下来命令就可以送往codec来配置其内部寄存器决定他们的能力首先了解一下 为什么我们需要在codec初始化结束后配置codeco以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 RegistersHDA_Bar offset: 60h (ICW) ,64h (IRR)和 68h (ICS) (IRV,ICB) 来进行配置写DMA方式就是CORB和RIRB这中方式以命令的形式写到codec中, 下面会讲到CORB RIRB这种传输机制在速度上PIO方式要块一些,而DMA方式 则是会占用比较多的内存资源我们现在一般是采用PIO的方式来配置codec 的3.3CORB 与 RIRBCodec命令和控制描述了一种机制,利用这种机制就可以控制送往codec或由 codec发出的信息命令和控制数据是低带宽的异步数据,并在链路上一次只传 输一个命令。
时序是不确定的,或者是送往控制器或者是从控制器发出Codec 命令和控制由控制器通过两种机制管理,它们是命令输出缓冲区和响应输入缓冲 区软件通过CORB和RIRB控制器负责配置控制器的CORB和RIRBCORB是命令输出缓冲区它是由软件在存储器中开辟出来的一块空间用来存 放需要传输到codec的命令控制器利用DMA获取CORB中的输出命令,并将它们放 在每一帧开始的Command/Contro l位°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缓冲区的字节偏 移是WPX4和RPX4为了向CORB中增加命令,软件把命令放置在命令队列的末尾, 它的字节偏移是(WP+1)X(4字节)。
当软件完成写命令后,WP将被更新,并 使其等于最后有效命令的偏移当CORB被第一次初始化后,WP等于0,所以第一 个命令将被放在4字节偏移的地方,而WP将被更新为1当CORB的RUN位被置1后, 控制器中的DMA引擎将不断的比较RP和WP来决定是否有新的命令需要传送当读 指针不等于写指针时,DMA引擎将不停的运转直到两个指针相等,在链路上的命 令被传送完DMA引擎从CORB中读取命令并将它们通过链路送往codec如图3-1CORB Bsse Mdng葵Coimmaid OiJttuMjndlRili^图3-1通过CORB传输命令要从检查CORB中是否有足够的空间°CORBWP和CORBR P的不 等意味着在CORB中有可以得到的空间如果命令的块比规定的大,就要将其拆成 许多小块来传送命令由CORBWP+1指定偏移被写进CORB中,这是命令的第一块位置注意到 第一块命令,这意味着第一个命令被放在CORB中偏移为4字节的地方由于CORBWP 为0,那么CORBWP+1将意味着4字节的偏移CORBWP被软件改变来反映最后一个写进CORB的命令硬件将开始通过链路传 送命令,每从存储器中取走一个命令,CORBRP就会被改变。
当CORBRP等于CORBWP 时,所有的命令都被送出这时控制器就停止传送动词直到软件重复这个操作,并给CORBWP一个不同的值图3-2即表示命令的传输过程B&ghIn村网 CORESailware 啊蚣 Can ma nd s mtoCORBSofL^ar^ updatesCORPWPtsindicate ndexoflast cDnmand inbuSTer arid 蛔gCORB RUNI nd—'■Vail 1br hardvi-aie l&seM commands in queue, or breakMciwand Nockint&^maler 」JIHardware fetchesEErrands andupdafles CORBRPunhl CQR3RP= jCORBVit'P』Hardware i&ld也、End ...图3-2当硬件在传送命令的同时(CORBRP不等于CORBWP,CORB RUN位被置1),软 件可以在CORBWP指定的指针后添加新命令,然后更新CORBWPo硬件必须继续传送 新增加的命令软件必须保证新增的命令对于缓冲区来说不溢出比如,当命令 没有被送出时,新增的命令将会覆盖原有的命令,当前读指针的值由CORBRP给出。
RIRB也是一存储器缓冲区,codec通过RIRB机制实现codec对controller的一 个响应一条响应从一个codec中发出送往控制器,在控制器中的DMA引擎将响应 写入RIRB被动响应在后来的一帧由单个codec应答,按照这样的顺序下一帧命 令送往codec主动应答由codec插入帧队列,当被动应答不占用链路时控制器 将响应流写入RIRB缓冲区软件负责把不同codec发出的响应信号分开,包括主 动响应和被动响应和CORB一样,在RIRB中用到了读指针和写指针在RIRB中,RP是由软件控制 的,它记录了软件从响应缓冲区中读出的最后一个响应,硬件不掌握RP硬件控 制着WP,表明写进响应缓冲区中的最后一个响应的偏移控制器将应答信号(主 动和被动)写进RIRB中,而不管它的内容和CORB一样,WP表明了以一个响应为单元的偏移因为一个响应为8字节,所以相对于缓冲区的偏移为(WPX8字节)由codec向控制器发出的响应是32位的在RIRB中的每一个entry是64位在 codec发出的真正的32响应之后,控制器又加了 32位,这32信息是:1. 是哪一个SDATA IN信号接受codec的响应。
2. 主动和被动响应指示器LengthField4 曲sgn&ei R)esp_Ex表8 RIRB Entry 格式ine^cnpciDnResponse 1$ 1he response 曲话 from me
因此我们需要通过采样和AD转化 把模拟信号转化成数字信号4.1采样定理采样是每隔一定的时间间隔,抽取信号的一个瞬时幅度值(样本值)采样 的时间间隔称为采样周期;每秒采样的次数称为采样频率采样后得出的一系列 在时间上离散的样本值称为样值序列声音信号我们可以看成是一个频率包含20-20KHZ的连续函数F(x)我们对其采样就可以看成是在时域上F(x)和(频率 为采样频率)的冲击函数5(t)的乘积那么在频域上也就是F(w)和5(w)的卷 积积分如下图(1),(2)是 F(x)和 6(t)3), (4)是 F(w) 6 (w)图(5)是 F(w)和 5(w)的卷积积分那么我们对F(w)采样以后他的频谱就是图(5)所示那么我 们可以看出如果把图(5)经过低通滤波器滤波后我们就可以F(w)和6 (w)的卷积 积分还原成F(w),然后频域到时域的反变换就可以无失真的还原处信号F(x) 但是如果W2小于2W1也就是说我们的采样频率小于2倍的F(x)的最高频率那 么我们可以看到F(w)和6(w)的卷积积分在频域上会出现混叠,如图(6)所示 这样我们就无法通过低通滤波器还原出原来信号的频谱,也就无法不失真的还原 出原来的信号F(x)了。
因此就有采样定理:一个带宽限制的模拟信号可以用一个 样值序列来表示而不会丢失信息,只要其采样频率大于或等于两倍被采样信号的 最高频率4)(3)FS Cw)(5)(6)当然我们上述所描述的只是理论,是理想的情况下实际上采样必然会带来 失真我们无法不失真的还原信号首先我们的冲击函数就是理想情况下才有的 实际上我们的冲击函数是带有一定时间宽度的脉冲信号,而这些冲击函数在频域 就是带有一定频宽的三角波因此通过这些采样函数后原来信号的频域会出现失 真甚至是混叠那么我们要尽量减小这种失真就必须尽量减小采样脉冲信号的时 间宽度减小这一时间宽度就是减小采样开关管的导通时间采样电路的基本原理就是被采样的模拟信号经过开关管对负载电容充电,负 载电容再经过Buffer或者运放最后得到采样信号4.2采样电路采样电路一般可以分为四部分:采样开关,采样时钟,采样电容,输出缓冲 其原理就是通过打开采样开关使得输入信号对电容充电,再通过缓冲输出,输出的就是被采样信号在采样电的信号强度(即幅值)采样时钟控制采样信号的时 钟频率下图就是一个最原始的采样电路结构高采样存在两个主要的特新:采样速度和采样精度这两个主要的特性决定了 采样电路的优劣。
采样速度其实决定了采样频率,如果采样频率超出了采样电路的采样速度那 么就会产生很大的采样误差即MOS开关的开通时间还不足以使得保持电容CH打 到输入信号的大小要提高电路的采样频率就必须一方面减小保持电容的容值另 一方面减小开关管的导通阻抗从而减小保持电容的充电时间我们知道MOS管的 导通阻抗与其宽长比W/L成反比所以我们增加其宽长比既可以减小其导通阻抗另外当Vin比较高时(接近MOS管栅极电压)当电容充电到接近Vin时管子会进入 线性区,导通阻抗很大,这时候充电会很缓慢为了避免这一情况的出现我们使 用CMOS开关管,如下图所示对于PMOS在Vin很高时,由于其栅极为CK-,所以反 而处于线性区阻抗很低而对于NMOS来说当Vin比较小时他工作性区导通阻 抗很低因此两者并联则导通阻抗一直维持在一个比较低的值所以现在我们一般用CMOS来做开关管CK上面已经提到较小的保持电容和交大的宽长比W/L会提高采样速度,但下面 我们会看到这些提高采样速度的方法又会降低信号采样的精度在MOS管开关的瞬间有两种机制会产生误差来限制我们的采样精度这两种 机制分别是沟道注入效应和时钟溃通效应沟道注入效应:当MOS管开通时由于电子的积累产生沟道,但当管子关断沟 道就会消失,那么存储在沟道中的电子就会随着沟道的消失而放电移出。
这样一 部分电子会注入保持电容CH使得我们得到的采样电压产生误差,如下图所示我 们通过计算可以知道这种注入效应增加的AV为我们知道沟道与栅极相当与一电容,Cox就是单位面积这一电容的容值W,L 是沟道的长和宽所以说减小CH,或者增大W/L(由于一般而言MOS管的沟道长度 是个定值,因此增加宽长比就是增加MOS管宽度)都会导致AV的增大从而影响采 样精度当然由于我们用的是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转换器VvID2(MSB)「DiD0(LSB)Q7Q6ybQ5IQ4Yyq23CP并行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个部分:静音门限曲线,临界频带,频域的遮蔽效 应,时域的遮蔽效应静音门限曲线是在安静的环境下人耳能够听到的在各个频率下不同的声音门限下图就是通过实际模拟得到的一条心里声学模型静音门限曲线HoPJ—ids £mmiII±-rlLJ=wI he agluh threshDlj cd heannq.■n1^ 2-5静吉•从图中可以看出人耳对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遮蔽,其中一个信号甚至低于静音门限iDp)可>叫-JaJnEmaJCLpunos=requency (kHz;\Si 2-9 遮噪Fl槌曲^舆静音F5楹曲^通过静音门限曲线和频域上的遮蔽效应这两点我们可以确定最终的门限曲 线这样我们就可以引入一个量叫做SMR: signal-to-mask rate.即信号遮蔽比 也就是信号强度与门限的比值另外我们还有SNR:即信噪吧比和MNR即屏蔽噪 声比我们有:MNR二SMR-SNR只要MNR大于0那么噪声所带来的误差我们将会听 不到我们知道在量化的时候会产生噪声,量化的越细腻噪声就越小,那么我们要 量化到多细腻所产生的噪声才不会对音质有影响呢?我们就由上面的公式知道 只要保证MNR大于0就不会对音频质量有影响因此通过MNR我们就可以确定不 同频率的音频信号所需要的量化级数通过上面所说的频域的遮蔽效应我们可以 知道某一频带的具有交大的SPL的信号会对其相邻频带有遮蔽效应。
而这个值的 大小就由下面的公式得到其中x为频带间SF (X) = 15.81 + 7.5*( x + 0.474) - 17.\i + (x + 0.474)2必 db的距离时轴上的屏蔽效应:人耳在时间轴上也会产生屏蔽效应在一个很短的时间 内,若出现两个声音信号,不论出现的先后顺序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时表示需要用较多的位元来编码,表示此时声音信号的变化比 较大,容易出现前回音国2-12 前迺£典柳撞编橘的子侍JS]:3)畲走史富:迺音的瞥音款就皈I凝逸10M聒的例揆建算嚎出琨的祯遍音“(c)^£& ?12励的.例旗逢算怨出瑰的冬迪音口5.3 PE值的计算了解了心里声学模型我们接下去就可以讨论如何通过这一模型来压缩 我们的音频信号的数据在这里我们引入一个量PE来说明PE的单位是bits/sample其意思是每 个采样数据需要占用的bit数我们所说的24/32bits是最大情况下的采样精 度并不是每个采样信号都用这么多,我们压缩就是从这里入手的)下面讨论PE 的计算方法我们编码是按照一帧一帧来编码的以1152个采样值为一帧 因此我们这里的PE其实是一个编码帧中所需要的比特数)P(w)=Re(w)”2+Im(w)”2 P(w)为每个频线的能量…….2.2Bi= /=bi i代表第i个频带,Bi是第i个频带的能量…"肖SF ( x )相SF (X) = 15.81 + 7.5*( x + 0.474) —17.5(1 + (x + 0.474)2必 db邻 .2.4 频带带来的遮蔽。