音频的构架以及原理.docx

上传人:b****7 文档编号:9666305 上传时间:2023-02-05 格式:DOCX 页数:40 大小:805.40KB
下载 相关 举报
音频的构架以及原理.docx_第1页
第1页 / 共40页
音频的构架以及原理.docx_第2页
第2页 / 共40页
音频的构架以及原理.docx_第3页
第3页 / 共40页
音频的构架以及原理.docx_第4页
第4页 / 共40页
音频的构架以及原理.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

音频的构架以及原理.docx

《音频的构架以及原理.docx》由会员分享,可在线阅读,更多相关《音频的构架以及原理.docx(40页珍藏版)》请在冰豆网上搜索。

音频的构架以及原理.docx

音频的构架以及原理

Audio系统构架

摘要:

本课题主要研究音频的构架以及原理。

这里的音频构架主要针对笔记本codec以及HADLINK。

通过对CODEC初始化,工作原理以及Azalia协议的描述来说明笔记本音频系统的构架。

另外通过采样,D/A转换,编码,DSP处理,硬声卡等一系列的描述来体现整个音频系统的原理。

第一章codec的介绍

1.1audiocodec

Codec意思是数字信号编码器,其使用范围很广泛,在这里我们只讨论audiocodec。

audiocodec在笔记本中其根本的作用主要是D/A,A/D转换。

audiocodec从HADLINK上接受到的是纯正的一帧一帧的音频采样信号(后续会对此详细描述),他就是通过对这些采样信号D/A转化得到最后的模拟声音信号的输出。

当然audiocodec也可以通过MIC,LINEIN等端口接受到模拟的音频信号,然后对这些信号进行A/D转换,再传输到上层编码,最后储存或者传输。

下面我们以ALC662为列对CODEC做详细的描述。

1.2ALC662

ALC662是一款5.1声道的codec,包括:

前声道左右,后声道左右,中间声道,再加一个低音炮一共为5.1声道。

ALC662LQFP48pin封装,可以划分为数字部分和模拟部分两块。

数字部分是与HDALINK连接的部分,有REST#,BITCLK,SYNC,SDOUT,SDIN,当然还有两个数字电以及数字地。

REST#信号使CODEC进入一个上电完成状态,其内部寄存器恢复默认或保留值,另外REST#至少持续100us来使得BCLK跑到一个正确的值(内部PLL锁频需要的时间)。

REST#是由HDAcontroller发出的,连接到HADLINK上所有的device。

当powerupPCIreset或者软件通过CRST寄存器初始化link的时候都会产生REST#。

BITCLK是有HADcontroller发出的连接到link上所有设备的工作24M参考时钟。

SYNC是48KHZ流同步信号,每一帧中会包含一个到几个的流,给不同的设备,每个流的streamtag就是包含在SYNC信号中。

SDOUT是有HDAcontroller发送到codec的数字信号,支持一对多连接,即LINK几个设备可以公用一个SDOUT。

SDOUT是在clock上升和下降沿都采样的信号,一次其速率为48M。

SDIN是由device向controller传输数据的。

只支持一对一传输,即不可由多个device公用一根SDIN线。

两个数字电分别用于内部core逻辑和link的用电。

其内部core逻辑为3.3V供电,link用电可以是3.3v也可以是1.5V这就需要由南桥的HADcontroller输出决定了。

模拟部分也就是最终声音信号输出或输入。

其中输入包括LINEIN,MICIN,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只是在HDALINK传输的信号必须为1.5V时(比如GM使用HDMI时由于的HADLINK只支持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边上加点泡棉之类的材料来抑制峰频从而消除啸叫。

第二章controllerandLINKProtocol

2.1controller及其构架

图2-1

图2-1表示的就是PC内部HDAudio的构架。

CPU从内存中读取音频文件信息以及解码的函数指令。

然后CPU完成音频文件的解码工作。

然后CPU再把解码后的音频数据放入内存指定位置。

然后通过controller中的DMA控制器实现DMA传输把音频数据传输到Codec。

这就完成了整个音乐播放的过程。

控制器(Controller):

HDA控制器是总线控制I/O外围设备。

它个或多个DMA引擎,其中每一个都可以在存储器和codec之间传输单个的音频流。

是从存储器到codec还是从codec到存储器,这要取决于DMA的类型。

控制器实现所有的寄存器,这些寄存器就是编程的接口通过PCI或其他典型PC外围设备接口和系统存储器相连。

它包括一

链路(Link):

控制器物理上通过HDA链路连接一个或多个codec。

链路在控制器和codec之间传输连续的数据。

在带宽和协议上链路做到了优化。

链路也要分配采样率时间基数,以BCLK(bitclock)信号出现。

这个位时钟信号由控制器产生并应用在所有的codec上。

在确定的数据传输率上链路协议支持多种采样率和大小。

Codec(音频解码器):

链路上连接了一个或多个codec。

Codec从时间多元链路协议中析取一个或多个音频流,并将它们通过一个或多个转换器(用“C”来表示)转换成一个输出流。

一个转换器通常将一路数字信号转换成一个模拟信号,但也提供附加功能,比如说作为调制解调器或连接电话线。

它可以将多元流分解,并将它以单个数字流传输,比如S/PDIF。

Codec中转换器的数目和类型,以及插孔和连接器的种类,取决于codec的功能。

Codec从链路的BCLK信号中获得采样率时钟。

有关音频设备:

这些设备包括扬声器,耳机和麦克风。

2.2LINK上的流和频道

这一节主要介绍在HADLINK上数据是怎样传输的。

为了组织数据来让这些数据在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上传输,我们又是通过streamTag流标头来区分各个不同的流。

由于我们SDOUT可能连接到几个codec上不同的流可能传输到不同的codec上因此在SYNC帧同步信号上都有一个streamTap,streamTap是在对应的sterm传输前出现。

不同的streamTap对应接下来在SDOUT上传输的stream传输到不同的codec上。

对于输入流我们知道一根SDIN上只能传输一个流所以不需要有SYNC来传输其不同的streamtap。

不过其SDIN信号线上会传输自己流的streamtap。

如下图2-4和2-5所示。

图2-4

图2-5

图2-3中S_1,S_2,S-3就是我们的采样块。

为什么会有S_1,S_2,S_3之分呢。

因为我们知道HADLink上传输每一帧的频率为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会对HADLINK上的设备进行地址分配,最多支持15个设备。

Controller分配给device地址方式:

设备在reser#无效以后第二个帧同步信号SYNC的下降沿采样SDIN信号,SDIN信号维持高电平的时间来决定设备的ID。

采样到高电平后由BITCLK计数,有多少个BITCLK的高电平即表示设备的ID是多少(0-14)。

所以说codec的热插拔是不支持的。

其地址分配情况如图2-6所示。

图2-6

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

对于SDOUT由于一个信号线上并行传输多个流给不同的设别所以在每个流信息之前SYNC信号上都有一个相应流的streamtap来同志设备接下来的流信号由哪个设备接受。

而对于每个流信号其中又包含许多块,比如音频信号的左右声道,低音跑SPIDIF那么codec又如何对此区分。

这就需要谈到在每个流开头还有一段命令包(40bit,其中8bit预留bit)这个命令包就是用来告诉codc数据流信息和控制codec工作的。

而对于SDIN上没根信号只能接一个外设传输一个流信号因此在每个流信号传输前SDIN信号现上都有一个streamtap来告诉controller是由哪个外设传过来的信号。

HDAcontroller中的DMA引擎把接受到流中的频道(比如左右声道)组合再由DMAA传输到达存储器指定位置。

当每一个DMA引擎使能时,它都要查阅存储器缓冲区描述队列,其中每一个都定义了不同长度的缓冲区。

它指挥缓冲区按照顺序从codec和向codec传输数据。

对于DMA引擎的控制器寄存器空间包括了一个指针指向缓冲区描述队列的头,同样的也有一个识别队尾的指针。

第三章HDAcontroller和codec的初始化

3.1controller初始化

HDA控制器是连接系统和codec的枢纽。

上层他是通过系统总线(一般为PCI总线)与系统进行交易,下层他又通过HDALink与codec进行交易。

当HDA控制器在上电后进行重置时,所有的控制寄存器将处于它们的上电默认状态,HAD链路是不激活的。

启动控制器的第一步是适当的配置PCI/PCIE或者其他系统总线的接口。

这一步的作用主要是激活PCI以及其他系统总线,使挂在系统总线上的设备被识别并能与系统进行交易,让HDA控制器在系统上做好传输的准备。

比如,当利用PCI时,中断线,基地址和其他PCI配置空间寄存器应该被适当的设计。

这时候HADcontroller还没进行配置,只是使其上层总线激活。

接下来是控制器的配置。

首先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.2codec的配置

Codec其实在开始RESET#有效的时候就已经初始化自己了。

RESET#必须至少有效250μs的时间来保证codec有足够的时间来进行这已初始化。

初始化完成以后由于controller初始化也已经初始化完成LINK已经准备好传输数据。

接下来命令就可以送往codec来配置其内部寄存器决定他们的能力。

首先了解一下为什么我们需要在codec初始化结束后配置codec。

以audiocodec为例,ALC662是5.1声道的codec,我们设计电路时外部的功能不一定都用到即5.1声道不一定都有用,还有spidif之类的也是可用可不用的,还有一些带有复用功能的,对于这些系统要和codec要如何知道我们是怎么用的这就需要由我们来更具自己的设计配置codec。

从而也就有了我么所说的verbtable。

我们使用厂商提供的应用软件选择我们所使用的配置。

然后会生成配置文件。

BIOS负责把配置文件加载到codec中。

BIOS在PCI/PCIEbus,controller,link,codec都初始化完成后才会对codec进行配置。

BIOS通过两种方式:

PIO和DMA来把配置信息写到codec中去。

PIO方式是通过访问IO口。

通过ImmediateCommandInputandOutputRegisters。

HDA_Baroffset:

60h(ICW),64h(IRR)和68h(ICS)(IRV,ICB)来进行配置写。

DMA方式就是CORB和RIRB这中方式以命令的形式写到codec中,下面会讲到CORBRIRB这种传输机制。

在速度上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,CORBRUN位被置1),软件可以在CORBWP指定的指针后添加新命令,然后更新CORBWP。

硬件必须继续传送新增加

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1