登录站点

用户名

密码

实时语音信号处理系统设计实例

1已有 1476 次阅读  2009-09-28 11:37   标签信号处理  语音  系统设计  实例  实时 

实时语音信号处理系统设计实例

本章重点介绍基于TMS320C671l DSP的实时语音信号处理系统功能及其设计实现。首先介绍实时语音信号处理系统的设计,主要包括TMS320C6711 DSP和AD535 Codec介绍及其在系统设计中的应用。接着介绍DSP/B1OS I/O设备驱动及驱动程序编写。第4节介绍基于软什中断和PIP实现的实时语音处理系统实现。最后是基于任务和SIO实现的实时语音处理系统实现。

1  语音信号处理概述

语音信号处理包括语音编码、语音识别、语音合成、回声消除(AEC)、语音激活检测(VAD)、语音增益自动控制(AGC)等。

1.1  语音编码

     1.语音编码器的功能

语音编码器的主要功能就是把用户语音的PCM(脉冲编码调制)样值编码成少量的比特(帧)。这种方法使得语音在链路产生误码、网络抖动和突发传输时具有健壮性(Robus-tness)。在接收端,语音帧先被译码为PCM语音样值,然后再转换成语音波形。

2.语音编码器的分类

语音编码器分为三种类型:(a)波形编码器;(b)声码器;(c)混合编码器。波形编码器会尽可能构出包括背景噪音在内的模拟波形。由于波形编码器作用于所有输入信号,因此会产生高质量的样值。然而,波形编码器工作在高比特率。例如:ITU-G.71l规范(PCM)用的比特率为64Kb/s。声码器(Vocoder)不会再生原始波形。这组编码器会提取一组参数,这组参数被送到接收端,用来导出语音产生模型,所以声码器又称为参数编码器。线性预测编码(LPC)用来获取一时变数字滤波器的参数。这个滤波器用来模拟说话人的声道输出。图6-1是合成分析操作,图6-2是低比特率编码器的MOS得分——比特率关系曲线(WEST96)。

在VoIP(Voice overIP)中常用的语音编码器是混合编码器,它融入了波形编码器和声码器的长处,它的另一个特点是它工作在非常低的比特率(4~6kb/s)。混合编码器采用合成分析(AbS)。

为了说明问题,考虑人的声道产生的一个语音模式:当人说话产生语音信号时就会发出浊音(如音素pa、da等)和清音(如音素sh、th)。激励信号就是由输入的语音信号导出的,其方法是使合成语音与输入语音的差别非常小。LPC的用法、激励的产生以及对合成分析(AbS)系统的误差检查均如图6-1所示。长话质量编码器在比特率高于8Kb/s时容易实现,如图6-2所示。长话质量的语音平均意见得分(MOS)必须在获许分以上。传统的PCM语音在比特率小于32 kb/s,语音质量会严重恶化,在这里就不讨论PCN了。混合编码和声码器在比特率相当低的MOS上的得分是可接受的。在现阶段,大多数基于VolP的编码器的工作范围在5.2~8kb/s。研究表明,标准的编码器在比特率为4 kb/s时能提供可接受的MOS得分,一些分0系统在4.8 kb/s的MOS上的得分为3.8。


 


矢量量化和码激励线性预测一种较好的方法就是用预测存储的最优参数(码元矢量)的码本对输入语音信号的表示矢量进行编码,这种技术称为矢量量化(VQ,vectorquantization)。将VQ和AbS技术结合在一起会进一步提高编码性能。AbS VQ是技术构成CELP的基础。VQ和lAbS VQ的主要区别在于进行矢量量化码簿搜索时采用的量化失真测量定义的不同[WONG96]。

3.线性预测合成分析编码器

最常用的比特率在4.8kb/s~16 kb/s之间的语音编码器是基于模型编码器的,这些编码器都是线性预测合成分析(LPAS)方法。为了随着时间的变化模拟语音信号,线性预测语音产生模型必须用适当的信号来激励。每隔一段固定时间(如每隔20ms),语音模型参数和激励参数都必须做一次估计和更新,并用来控制语音模型。下面将介绍两种LPAS编码器:前向自适应LPAS编码器和后向自适应LPAS编码器。前向自适应LPAS编码器:8kb/s G.729编码器和6.3kb/s与5.3kb/s G.723.1编码器。在前向自适应的AbS编码器中,预测滤波器的系数和增益是实时传送的。为了提供长话质量的语音性能,这两种编码器都依赖于信源模型。激励信号(以语音基调周期的信息形式表示)也要传送。这种编码器所提供的模型对语音信号来说是比较好的,但对于一些噪音或者乐器来说并不合适。因此,在背景噪音和音乐环境下,LPAS编码器的质量比7.726和7.727的编码器的质量要差一些。

G.723.1 ITU-T G.723.1编码器在6.4kb/s提供长话质量语音。同时G.723.1还包括一个工作在5.3kb/s的低质量语音编码器。G.723.1是为低比特率可视电话而设计的。在这种适应中,由于视频编码时延通常人于语音编码时延,因此对时延的要求不是很严格。G.723.1编码器的帧长为30ms,还有7.5ms的前视。再加上编码器的处理时延,编码器的单向总时延为67.5ms。其他时延是由系统缓冲区和网络造成的。

G.723.1编码器首先对语音信号进行传统电话带宽的波滤(基于G.712),再对语音信号用传统的8000Hz速率进行抽样(基于G.711),并变换成位的线性PCM码作为该编码器的输入。在编码器中对输出进行逆操作来重构语音信号。G.723.1系统用LPAS编码方法将语音信号编码成帧。编码器能够产生两种速率的语音流量:

(1)用于高速率的6.3kb/s;

(2)用于低速率的5.3kb/s。

主速率编码器使用多脉冲最大自然量化(MP-MlLQ),低速率编码器使用代数码激励线性预测(ACELP,Algebraic-Code-Excited Lineat-Prediction)方法。编码器和解码器都必须支持两种速率,并且能够在帧间对两种速度进行转换,此系统同样能够对音乐和其他音频信号进行压缩和解压缩,但它对语音信号来说是最优的。

编码器对帧进行操作,每帧包括240个样点,采样速率为8000Hz。在进一步的处理(高通滤波器去直流分量)后把每帧分成4个子帧,每个了帧包括60个样点,其他的各种操作包括LPC滤波器以及LSP滤波器非量化系数的计算等,将会导致30ms的分组时延。对每个子帧,用未经处理的输入信号计算LPC滤波器。最后一个子帧的滤波器系数用来预测分裂矢量量化器(PSVQ,Predictive split Vector quantizer)进行量化。正如前而所介绍的,前视占有7.5ms,所以整个编码时延为37.5ms。这个时延在评介编码器,尤其是通过数据网络传输语音时是个很重要的因素,因为如果编码及解码时延比较小的话,就意味着处理互联网中的时延及其抖动时具有更大的自由度。

1.2语音识别

语音识别是一门交叉学科,语音识别正逐步成为信息技术中人机接口的关键技术,语音识别技术与语音合成技术结合使人们能够甩掉键盘,通过语音命令进行操作。语音技术的应用已经成为一个具有竞争性的新兴高技术产业。

     1.语音识别技术

与机器进行语音交流,让机器明白你说什么,这是人们长期以米梦寐以求的事情。语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术。语音识别是一门交叉学科。近二十年来,语音识别技术取得显著进步,开始从实验室走向市场。人们预计,未来10年内,语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。

语音识别听写机在一些领域的应用被美国新闻界评为1997年计算机发展10件大事之一。很多专家都认为语音识别技术是2000年~2010年间信息技术领域十大重要的科技发展技术之一。

2.语音识别技术的基础

语音识别技术关系到多学科的研究领域,不同领域上的研究成果都对语音识别的发展作了贡献。让机器识别语音的困难在某种程度上就像一个外语不好的人听外国人讲话一样,它和不同的说话人、不同的说话速度、不同的说话内容以及不同的环境有关。语音信号本身的特点造成了语音识别的困难。这些特点包括多变性、动态性、瞬时性和连续性等。

计算机语音识别过程与人对语音识别处理过程基本上是一致的。目前主流的语音识别技术是基于统计模式识别的基本理论。一个完整的语音识别系统可大致分为三个部分:

(1)语音特征提取:其目的足从语音波彤中提取出随时间变化的语音特征序列。

(2)声学模型与模式匹配(识别算法):声学模犁通常将获取的语音特征通过学习算法(可以智能抽取变化的语音特征)产生。在识别时将输入的语音特征同声学模型(模式)进行匹配与比较,得到最佳的识别结果。

(3)语言模型与语言处理:语言模型包括由识别语音命令构成的语法网络或由统计方法构成的语言模型,语言处理可以进行语法、语义分析。对小词表语音识别系统,往往不需要语言处理部分。

声学模型是识别系统的底层模型,并且是语音识别系统中最关键的一部分。声学模型的目的是提供一种有效的方法计算语音的特征矢量序列和每个发音模板之间的距离。声学模型的设计和语言发音特点密切相关。声学模型单元大小(字发音模型、半音节模型或音素模型)对语音训练数据量大小、系统识别率,以及灵活性有较大的影响。必须根据不同语言的特点、识别系统词汇量的大小决定识别单元的大小。

语言模型对中、大词汇量的语音识别系统特别重要。当分类发生错误时可以根据语言学模型、语法结构、语义学进行判断纠正,特别是一些同音字则必须通过上下文结构才能确定词义。语言学理论包括浯义结构、语法规则、语言的数学描述模型等有关方面。目前比较成功的语言模犁通常是采用统计语法的语言模型与基于规则语法结构命令的语言模型。语法结构可以限定不同词之间的相互连接关系,减少了识别系统的搜索空间,这有利于提高系统的识别。

语音识别过程实际上是一种认识过程。就像人们听语音时,并不把语音和语言的语法结构、语义结构分开来,因为当语音发音模糊时人们可以用这些知识来指导对语言的理解过程,但是对机器来说,识别系统也要利用这些方面的知识,只是如何有效地描述这些语法和语义还有困难:

(1)小词汇量语音识别系统。通常包括几十个词的语音识别系统。

(2)中等词汇量的语音识别系统。通常包括几百个词至上千个词的识别系统。

    (3)大词汇量语音识别系统。通常包括几千至几万个词的语音识别系统。这些不同的限
制也确定了语音识别系统的困难度。

3.语音识别技术的前景和应用

在电话与通信系统中,智能语音接口正在把电话机从一个单纯的服务工具变成为一个服务的“提供者”和生活“伙伴”;使用电话与通信网络,人们可以通过语音命令方便地从远端的数据库系统中查询与提取有关的信息;随着计算机的小型化,键盘已经成为移动平台的一个很大障碍,想像一下如果手机仅仅只有一个手表那么大,再用键盘进行拨号操作已经是不可能的。语音识别正逐步成为信息技术中人机接口的关键技术,语音识别技术与语音合成技术结合使人们能够甩掉键盘,通过语音命令进行操作。语音技术的应用已经成为一个具有竞争性的新兴高技术产业。

语音识别技术发展到今天,特别是中小词汇量非特定人语音识别系统识别精度已经大于98%,对特定人语音识别系统的识别精度就更高。这些技术已经能够满足通常应用的要求。由于大规模集成电路技术的发展,这些复杂的语音识别系统也已经完全可以制成专用芯片,大量生产。在西方经济发达的国家,大量的语音识别产品已经进入市场和服务领域。一些用户交换机、电话机、手机已经包含了语音识别拨号功能,还有语音记事本、语音智能玩具等产品也包括语音识别与语音合成功能。人们可以通过电话网络用语音识别口语对话系统查询有关的机票、旅游、银行信息,并且取得很好的结果。调查统计表明多达85%以上的人对语音识别的信息查询服务系统的性能表示满意。

1.3回声消除

回声消除(ECR,Echo Cancellation Resource)是基于DSP技术对语音通道的声音进行的实时控制。其实现方法在于:在线路上收到的声音里去掉IVR系统播放的声音,从而保证接收到的声音是纯净的,如图6-3所示。


 1.回声的特点

与传统电话相比,因特网上进行语音的实时传输,有其致命的弱点,那就是语音质量较差,影响因特网语音质量的因素是多方面的,最关键的因素之一是回声的影响。因此,要提高因特网的语音质量,就必须在因特网的语音传输过程中进行消回声的处理。也就是说,IP电话网关作为因特网的语音接入设备,必须具有回声的消除功能。由于因特网的语音传输是采用分组交换技术实现的一种全新的电信业务,传送的语音信号要经过编码、压缩、打包等一系列处理,这不仅造成回声路径的延迟较大,而且延迟抖动也较大。因此,在因特网的语音传输过程中,回声问题显得尤其突出,并具有以下特点。

    (1)回声源复杂。在传统电话系统中,存在着一种所谓的“电路回击”。该回声产生的主要原因是在系统中存在2-4线的转换。完成2-4转换的混合器因阻抗匹配,造成“泄漏”,从而导致了“电路回声”。从因特网IP电话网关的连接方式可以看出,IP电话网关一端连接PSTN,另一端连接因特网。

尽管电路同声产生于PSTN 中,但同样会传至IP电话网关,是因特网语音传输中的回声源之一,因特网语音传输中的第二种回声源是所谓的“声学同声”。卢学回声是指扬声器播放出来的声音被麦克风拾取后发回远端,这就使得远端谈话者能听到自己的声音。声学回声又分为直接回声和间接回声。直接回声是指扬声器播放出来的声音未经任何反射直接进入麦克风。这种回声延迟最短,它与远端说话者的语音能量,扬声器与话筒之间的距离、角度、扬声器的播放音量以及话筒的拾取灵敏度等因素相关。间接回声是指扬声器播放的声音经不同的路径一次或多次反射后进入麦克风所产生的回声集合。因为周围物体的变动,例如人的走动等,都会改变回声的返回路径,因为这种回声的特点是多路径、时变的。另外,背景噪声也是产生回声的因素之一。

(2)回声路径的延迟大。在因特网的语音传输中,延迟来源有3种:压缩延迟、分组传输延迟和处理延迟。语音压缩延迟是产生回声的主要延迟,例如在G.723.1标准中,压缩一帧(30ms)的最人延迟是37.5ms。分组传输延迟也是一个很重要的来源。测试表明,端到端的最大传输延迟可达250ms以上。处理延迟是指语音包的封装时延及其缓冲时延等。

(3)回声路径的延迟抖动大。在因特网的语音传输过程中,由于回声路径、语音压缩时延、分组传输路由等存在诸多不确定因素,而且波动范同较大,一般在20~50ms之间。

2.声学回声消除器及相关算法

随着消回声技术的发展,当前回声消除研究的重点,已南“电路回声”的消除,转向了“声学回声”。同卢的消除包括以下处理方法:

(1)周围环境的处理。分析声学回声的产生机理,可以知道:声学回声最简单的控制方法是改善扬声器的周围环境,尽量减少扬声器播放声音的反射。例如,可以在周围的墙壁上附加一层吸音材料,或增加一层衬垫以增加散射,理想的周围环境是其回响时间或RT-60(声音衰减60dB所需要的时间)在300ms~600ms之间。因为这样的环境一方面可以控制反射,另一方面又可以不会使讲话者感到不适。改善环境可以有效地抑制间接声学回声,但对直接声学回声却无能为力。

(2)回声抑制器。回声抑制器是使用较早的一种回声控制方法。回声抑制器是一种非线性的回声消除。它通过简单的比较器将接收到准备由扬声器播放的声音与当前话筒拾取的声音的电平进行比较。如果前者高于某个阈值,那么就允许传至扬声器,而且话筒被关闭,以阻止它拾取扬声器播放的声音而引起远端回声。如果话筒拾取的声音电平高于某个阈值,扬声器被禁止,以达到消除回声的目的。由于回声抑制是一种非线性的回声控制方法,会引起扬声器播放的不连续。影响回声消除的效果,随着高性能的回声消除器的出现,回声抑制器已很少有人使用了。

(3)声学回声消除器。声学回声消除的另一个方法是使用声学同卢消除器(AEC:AcousticEcho Chancellor),AEC是对扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号的语音模型,利用它对回声进行估计,并不断地修改滤波器的系数,使得估计值更加逼近真实的同声。然后,将回声估计值从话筒的输入信号中减去,从而达到消除回声的目的,AEC还将话筒的输入与扬声器过去的值相比较,从而消除延长延迟的多次反射的声学回声。根椐存储器存放的过去扬声器的输出值,AEC可以消除各种延迟的回声。

典型的声学回声消除器结构如图6-4所示,语音激活识别模块判断线路中是否有声音传输。语音激活识别模块的输出传给控制单元,需要时控制单元更新、保持或者置零权值(Weight)。同波估计模块是自适应模块,用于估计回波路径。在叫波估计单元之后,是非线性处理器,目的是减少回声处理后剩下的回声。如果剩余的回声超过设定的闽值,该单元将有效地阻止或消除回声。当信号被阻止后,补偿噪声发生器将插入补偿噪声(Comfort Noise)。声学回声消除器D的核心是用于回波估计的自适应滤波器算法实现,一般采用LMS(LeasetMean Square)算法。另外,TI TMS320系列的DSP有利于该算法优化的汇编指令,使得DSP在处理回声消除时更高效、更实时。

 


2实时语音信号处理系统设计

实时语音信号处理系统是指系统能够实时(或准实时)地对语音信号进行编码、解码,以及网络传输。这是应当前人们对语音处理效果越来越高的要求产生的。本节旨先通过介绍视频会议系统中的语音处理,然后重点介绍基于TMS320C6711 DSP和TLC320AD535Codec实现的实时语音处理系统。

2.1  视频会议系统中的实时语音处理

视频会议系统中实时语音处理框图,如图6-5所示。每个视频会议终端包括接收通路和发送通路。在接收通路中,终端上中央处理器接收互联网和以太网上传输的音频(当然还包括视频)码流,对其帧解析后送给DSP做解码处理。解码后的数字语音信号经D/A转换后,通过扬声器输出。在发送通路中,终端对话筒拾取到语音信号进行数字化转换后交给DSP处理。DSP对语音的处理一般包括语音增强(提高信噪比)、回声消除、语音激活检测、自动增益控制、语音编码等。编码后的语音信号一般由终端上的中央处理器通过互联网或以太网发送。可见,DSP在视频会议终端中担任着终端编码、解码的核心任务。DSP对音频信号能否实时编,解码处理,是视频会议系统的一项最重要的指标。

 


2.2  TMS320C6701 DSP

TMS320C6701是高速的浮点DSP,芯片最高时钟频率达300MHz,最大处理能力达2400MOPS。TMS320C6701 DSP采用先进的哈佛结构,解决了冯·诺伊曼(Von-Neumann)结构中高速数据传输时的传输通道上的瓶颈现象;内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间:指令执行时的多重流水线结构将指令周期降低到了最小值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求,如FIR、ITR、FFT等运算。尤为值得一提的是TMS320C670l的软件特点,多种有效灵活的寻址方式,仪为3ns的指令执行周期,还有一些特殊的运算指令更好地满足了数字信号处理中特有的运算需要。TMS320C6701 DSP功能框图如图6-6所示。


TMS320C6701提供了2个高速多通道缓存串行口。McBSP提供了双缓存的发送寄存器和三缓存的接收寄存器,具有全双工的同步或异步通信功能,允许连续的数据流传输;数据发送和接收有独立可编程的帧同步信号;能够与工业标准的解码器、模拟接口芯片或其他串行A/D与D/A设备、SPI设备等直接相连;支持外部时钟输入或内部可编程时钟;每个串行口最多可支持128个通道的发送和接收;支持传输的数据字长可以是8bit、12bit、16bit、20bit、24bit或32bit。内置μ-律和A-律压扩硬件。可以与工业标准的编/解码器,AICs接口。支持多种方式的传输接口,如T1/E1帧协议、MVIP帧方式、H.100帧方式、SCSA帧方式、IIS兼容设备等。可与多达128个通道进行收发。

McBSP通过7个引脚(DX、DR、CLKX.、CLKR、FSX、f7SR和CLKS)与外设接口。DX和DR引脚完成与外部设备进行通信时数据的发送和接收,由CLKX、CLKR、FSX、FSR实现时钟和帧同步的控制。由CLKS来提供系统时钟。发送数据时,CPU和DMA控制器将要发送的数据写到DXR(数据发送寄存器),存FSX和CLKX作用下,由DX引脚输出。接收数据时,来自DR引脚的数据在FSR和CLKR作用下,从DRR(数据接收寄存器)中读取数据。接收和发送帧同步脉冲既可以由内部采样速率产生器产生,又可以由外部脉冲源驱动,McBSP分别在相应时钟的上升沿和下降沿进行数据检测。

串行口的操作由串行口控制寄存器SPCR和引脚控制寄存器PCR来决定;接收控制寄存器RCR和发送控制寄存器XCR分别设置接收利发送的各种参数,如帧长度等。

2.3  Codec TLC320AD535

    1.AD535功能结构

TLC320AD535是一款SIGMA-DELTA型单片音频接口芯片(AIC),其功能框图如图6-7所示。它内部集成了16位的D/A和A/D转换器,采样速率最高可达22.05kb/s,其采样速率可通过DSP编程来设置。在DAC之前有一个差值滤波器以保汪输出信号平滑和ADC之后有一个抽取滤波器以提高输入信号的信噪比。


 TLC320AD535内部有7个数据和控制寄存器,用于编程控制它们的工作状态。

·寄存器0:空操作寄存器。

·寄存器1:软件复位、软件掉电、选择16位或15位工作方式、硬件或软件二次通信    请求方式的选择。

·寄存器2:使能ALTDATA输入端为ADC选择16/15位方式。

·寄存器3:选择FS与FSD之间延迟SCLK的个数,告诉主机有几个从机被联上。

·寄存器4:为输入和输出放大器选择放大器增益;选择N来设置采样频率,fs=MCLK/    (128*N)或MCLK/(512*N);在MCCLK输入端使能外部时钟输入并旁通内部的PLL。

·寄存器5,6:保留。

2.TLC320AD535和TMS320C6701 McBSP之间串行通信

TMS320C6701 DSP和TLC320AD535 Codec之间串行通信连接,如图6-8所示。TLC320AD535与DSP之间的数据传送采用串行方式,包括两种传输模式:主串行通信和二次串行通信。主串行通信用于从ADC接收数据或发送数据给DAC;二次串行通信则对控制寄存器读写控制字,从而控制器件的选择和电路配置。使用主串行通信和二次串行通信的目的是使得转换数据和控制数据能够共用一个串行口传输数据。主串行通信格式的16位都用来传输数据。ADC的数据长度由寄存器2的D4位决定。启动和复位后默认值为15+1位模式,最后一位用于请求二次通信(DO:0表示无操作,l表示请求二次通信)。


3.TLC320AD535和DSP McBSP之间串行通信时序

    (1)主串行通信。

主串行通信在ADC和DAC之间接收和传输数据。DAC字长15位,主16位串行通信字的最低位是控制位,用于确定是否要求二次通信。主串行通信数据格式如图6-9所示。

 


 TLC320AD535有两种串行数据传输模式,一种是FS高模式,通过绑定管脚SL_SELDVDD设定,其时序如图6-10所示。
 


(2)二次串行通信。

是否需要二次串行通信,通过对DT-DIN(或VC_DIN)  的LSB(DO)位置位来实现。二次串行通信的数据格式,如图6-12所示。

 


TLC320AD535的数据传输模式和采样速率都可以通过DSP对其控制寄存器的编程来实现,因此在许多场合下,TLC320AD535都作为DSP的AIC来实现音频处理。

2.4系统硬件设计

实时语音信号处理系统硬件结构如图6-15所示。系统主要由TMS320C6701 DSP、TLCAD535 Codec、电源、逻辑控制单元(CPLD)、外部存储器(FLASH、SDRAM)组成。系统还提供标准JTAG口供测试用,HPI口供主机通信用,以及其他标准的扩展端口。在实时语音信号处理系统中,TMS320C6701 DSP负责语音信号的编码、解码。一方面,TMS320C6701DSP通过。McBSP同步接收TLC AD535 Codec采集到的语音信号(MIC IN或LINE IN),并对接收到的语音信号进行编码。另一方而,TMS320C670l DSP对编码后的数据进行解码处理,解码后的音频数据流再通过McBSP以串行通信的方式传送给TLC AD535 Codec,由其输出(LINE 0UT或HP OUT。)。这是一个语音信号处理的自检(LOOPBACK)过程,通过该系统,结合CCS集成开发环境的Pprofile分析工具,可以很好地分析DSP编解码耗费的CPU资源及实时性分析。


3  DSP/BIOS I/O口设备驱动

这里所描述的驱动器是应用在基于帧格式的I/O流系统中的,也就是说这些系统中的数据块是作为一个个单元(帧)实时处理的。这些系统使用的算法包括声音合成、呼叫处理语音声音检测和发生、语音识别、MPEG播放器、视频处理等基于帧(块)压缩或实时分析。在这些系统应用中,数据块都是周期性地从数据转换器读或周期性地向数据转换器写的连续的数据流。

DSP/BIOS提供两种I/O服务模式:管道(PIP)和流(SIO)来实现基十帧的信号处理系统。两种I/O途径都提供在应用层和外设之间的传输数据的数据缓冲管理以及一个缓冲传输结束时信号通知程序线程的方法。

通常程序的线程是抢占式的,而且阻塞其他线程的执行直到需要的I/O时才结束。DSP/BIOS提供两种抢占式线程:软件中断(SWls)和任务(TSKs)。抢占式线程是诸如通用端口通信等多速率处理系统必需的,使用在任何包含多种帧大小或数据率的系统中。PIP对象使用软件中断和任务,SIO一般只使用任务。

BIOS设备驱动模块包括两个独立的部分:适配器(Adapter)和设备控制器。这两部分一起连接硬件设备到线程(软件中断或任务),DSP/BIOS设备驱动模型如图6-16所示。


适配器:应用程序和设备控制器之间的接口由适配器提供。适配器直接和PIP或SIO象通信,并重新发送一个缓冲区给设备控制器。设备无关表明缓冲区管理和线程信号由设备驱动器中的适配器来处理。DSP/BIOS提供了两种底层I/O口(LIO)适配器:PIP模块使用PLIO适配器,SIO/DEV模块使用DLl0适配器。这些适配器为设备控制器提供通用的接口界面。这些适配器需要稍许、甚至不需要定制。

设备控制器:设备控制器提供适配器和硬件之间的接口。设备控制器面向硬件,填充或者清空适配器为其提供的缓冲区。典型的设备控制器很小,而且主要处理特殊设备。必须为每一个设备写一个独立的设备控制器。设计设备控制器和适配器之间的接口的目的是PLIO和DLIO适配器能够和任何摔制器一起使用,实现底层(LIO)界面定义。适配器和设备控制器分离是因为适配器使用DSP/BIOS调用针对PIP或SIO缓冲函数方法。另外,使适配器和设备控制器分离减少了为新设备编写控制器的大量代码。

3.1  LIO接口

LIO是一个界于应用线程和面向阻塞硬件设备之间的底层界面。LIO使用简单的缓冲管理原则和灵活的信号回调界面连接硬件设备到应用线程。LIO接口定义了创建新的LIO设备控制器时必须实现一系列函数和数据结构。

LIO接口定义一组函数和一个数据结构来实现创建一个新的LIO设备控制器。设备控制器和硬件的接口构成系统数据的源地址或目的地址。设备控制器初始化设备驱动需要的底层硬件,管理应用层和硬件之间的缓冲移动,提供应用层和硬件之间定制的接口。这些功能通过一组定义的函数和用于共享状态信息和数据缓冲的数据结构来实现。设计控制器的函数如表4-1所示,这些函数可以分为三类:全局函数、通道控制函数和中断服务例程。


1.全局函数:init()和setup()

   init()函数初始化控制器模块。该函数初始化独立控制器的I/0通道的全局数据结构。init()结构如下,没有参数和返回值。

V0id<controller>_init();

setup()用于为控制器模块设置参数和执行控制器必需的硬件初始化。setup()一般使用芯片支持库(CSL,Chip Support Librar),)配置和执行硬件的初始化。setup()函数的结构如下,传输专用控制设置结构。

void<controller>_setup(<controller>_Setup*setup);

这两个函数在初始化系统时必须由应用程序的main()函数调用,setup()必须在init()函数之后调用。在应用程序中,设备驱动器占用的硬件不能由其他函数使用。硬件的所有权必须由设备控制器明确声明。由于init()和setup()函数连接硬件和控制器所使用的通道对象,它们必须只调用一次,而且是在应用程序创建任何通道之前。

2.通道控制函数

在控制器初始化和设置以后,应用程序通过调用PLlO_new()或SIO_create()函数创建控制器(或者叫通道)实例。每一个通道使用其通道对象保持其状态和缓冲信息。LIO_Fxns结构绑定控制器到适配器并完成设备的驱动。该结构包含5个管理控制器操作的函数。open()和close()函数创建特定的通道。The submit()和cancel()控制这些特定通道中缓冲的流动。最后,ctrl()扩展控制器接口增强灵活性。这些函数接口可以面向PIP或SIO适配器。因此,当适配器需要调用控制器中的函数时,适配器引用实例对象中的这个结构。

    (1)open()和close()函数

当应用程序为PIP适配器调用PLIO_new()或者为SIO适配器调用SIO_create()函数时,绑定到适配器的控制器调用open()函数。open()函数创建并初始化控制器的特定通道对象。这样的通道对象和硬件之间的缓冲数据是单向流动的。例如,数字信号编解码器(Codec)代表输入输出通道。这两个通道都是Codec设备驱动器的一部分,当一个通道需要和Codec通信时调用open()函数。也就是说,open()函数为接收和发送通道调用。open()函数应该根据适配器设置成输入或输出分配适当的通道。设置通道对象所需要的信息通过open()函数的参数传递。

ptr open(Strinq name,LIO_M0de mode,ptr args,LIO_Tcallback cbFxn,Arg cbArg);

当使用SIO适配器时,应用程序通过SIO-delete()函数调用close()函数。它通过设置通道对象中的状态变量来关闭通道。它还要禁止该通道使用的任何中断。需要注意的是:PLIO不调用close()函数。

(2)submit()和cancel()

一旦控制器完成了已经打开的通道的初始化,应用程序能够和控制器之间发送和接收数据。submit()接收应用层的数据并呈递这些数据给底层的硬件。当适配器从应用层接收到新的缓冲数据时,它调用submit()函数。通道对象用于管理控制器内部的缓冲。一个指向通道对象的指针传给submit()函数,还包括指向新缓冲区的指针及最小可设定地址单元中缓冲区的大小。这个信息应该存储在通道对象中。缓冲数也应该更新,以表明一个新的缓冲已经添加到控制器中。这些变量可以用于和中断服务例程之间的同步及通信。例如,一个采样控制器使用缓冲区的大小来告知中断服务例程已经接收或发送多少数据。submit()函数的参数及返回值如下:

Int submit(Ptr chanp,  Ptr buf, Uns nmauS);

cancel()允许应用程序终止控制器所占有的数据。当使用SIO适配器时,应用程序通过调用SIO_idle()函数调用cancel()函数。cancel()通知底层的硬件停止发送或接收数据。PLIO适配器不调用cancel()函数。cancel()应该有以下参数和返回值:

(3)ctrl()

    ctrl()函数是为控制器创建的扩展接口,引入硬件的特殊功能。ctrl()应该有以下参数和返
回值:

BOOl ctrl(Ptr chanp,  Uns cmd,  ptr args);

3.中断服务例程

中断服务例程是实际上和硬件同步的设备控制器函数。它通过中断向量表调用,并被使能以便认可。中断服务例程实际上和硬件交换数据。它通过使用通道对象和其他控制器共享状态信息。例如,当从应用层接收新的缓冲数据时,中断服务例程可以读这个信息,以便知道数据到达时把数据放置在哪里。当缓冲区填满数据时,中断服务例程通过通道对象中包含的回调函数通知适配器。

    4.总结
    设备控制器接口是一个简单而灵活的绑定应用层和特定硬件的方法。控制器使用3种基
本类型的函数共享适配器和硬件之间的数据。初始化和设置函数执行必要的硬件和软件初始
化。5个通道控制函数构成设备驱动器功能的重要部分。submit()和ISR函数联合工程设备
驱动器的核心。LIO设备控制器函数总结如图6-17所示。


3.2 LIO适配器

LIO适配器通过缓冲区管理器(PIP或SIO)从应用程序中获得一个缓冲,并让其由设备控制器清空或填充。适配器识别控制器何时结束缓冲区处理并通过缓冲管理器发送回应用程序。这些通过小量的耗费和复杂性实现。提供两个基本的LIO适配器,第一个是PLIO适配器,用于PIP模块中;第二个是DLIO适配器,用于SIO/DEV模块中。每一个适配器PIP或SIO对象由PLIO_new()或SIO_create()函数初始化。在main()函数中调用这些函数初始化适配器的数据结构。这个数据结构,或者实例对象还包括适配器提供给缓冲区的控制器信息。在应用线程和适配器之间、或者适配器和设备控制器之间实例对象是无缝连接的。

    1.PiP适配器(PLIO)

DSP/BIOS PIP模块提供“数据通道”服务。PIPs设计的目是用于管理阻塞I/O口。每一个通道对象包含一个缓冲区,该缓冲区分为固定数量、固定长度的帧。用于PIP模块的帧的数量和长度在DSP/BIOS配置工具中设置。虽然每一个帧有固定的长度,应用程序可以填充少于整个帧的数据到PIP.PIP两端。程序从读端读帧的数据。程序从写端发送帧的数据。通常一端编码用于调用I/O设备。数据通知函数执行同步数据传输。当读完或写完一帧数据,这些函数被触发,通知PIP另外一端有一帧数据或空帧。写端通过调用PIP_alloc()函数获得填充数据的帧。数据填充到帧中后,写端调用PIP_put()函数。这个调用导致notifvReader函数被调用。适当的时候,读端调用PIP_get()函数重新找回帧数据,当数据不再需要时,调用PIP_free()函数。调用PIP_free()触发notifyWriter函数,循环重新开始。PIP对象关联的消息函数由用户在通过DSP/BIOS配置工具中设置。PIP适配器,或者是PLIO,设计用于通过缓冲管理器从应用层获得缓冲,并呈递给控制器消耗,控制器完成处理缓冲区并通过缓冲区管理器返回缓冲区给应用层时。

PLIO使用以下基本的函数:

(1)Prime函数。当应用层发送一个缓冲数据给设备驱动器时,PIP管理器调用rxPrime和txPrime。这些函数使用DSP/BIOS API调用从缓冲管理器获得缓冲并呈递给控制器。“prime”函数是应用层和适配器之间的信号接口。

(2)回调函数。rxCallback和txCallback是控制器和适配器之间的信号接口。在驱动器设置期间,当完成缓冲区处理后,适配器告诉控制器调用哪个函数。这个回调通知适配器,当缓冲区准备送回到缓冲管理器,最后送回到应用层。

(3)传输函数。传输函数调用设备控制器submit()函数。submit()函数从适配器返回缓冲,然后传递新的缓冲区信息给中断服务例程。信息的传递通过通道对象实现。PLIO适配器使用这些函数在应用层和控制器之间通信。

2.SlO适配器(DLIO)

DSP/BIOS流I/O(SIO)模块提供和任务线程一起使用的高层设备无关的I/O机制。SIO超过PIP,因为它能在运行时创建新的SIO对象。为了提供这个功能,SIO有自己的设备驱动模块,叫做DEV。写DEV驱动类似于LIO驱动。一组特定设备函数,诸如打开、关闭及缓冲区管理,通过函数表使用SIO对象实现和访问。由于DEV驱动需要更高层DSP/BIOS知识,所以DEV驱动更难写。编写DEV驱动必须知道队列、信号量以及SIO模块知识。SIO适配器,也叫做DLIO,设计易于集成现有的DEV模块。通信和同步可以由最小的耗费和复杂性来实现。

DLIO适配器使用以下基本类型的函数:

(1)回调函数。回调函数是控制器和适配器之间的信号接口。驱动器设置期间,当完成缓冲区处理后,适配器告诉控制器调用哪个函数。这个回调通知适配器,当缓冲区送回到缓冲管理器时,最后送回到应用层。

(2)传输函数。传输函数调用设备控制器submit()函数。submit()函数从适配器返回缓冲,然后传递新的缓冲区信息给中断服务例程。信息的传递通过通道对象实现。DLIO使用这些函数在应用层和控制器之间进行通信。

3.3 LIO设备控制器

   LIO设备控制器构成适配器和面向缓冲的硬件接口。这个接口简单而且很好定义,这样控制器可以与PIP或SIO适配器一起使用,占用很小的资源。控制器的基本功能是在适配器和硬件之间发信号和进行缓冲管理。当一个新的缓冲由应用程序发送来时,适配器调用控制器。控制器呈递这个缓冲给硬件,通常由中断服务例程来表述。当中断服务例程完成缓冲区的处理后,它通过适当的回调函数通知适配器,接收或发送。控制器必须为应用程序的其他功能提供包括初始化硬件、开关、终止设备驱动器的数据。

流设备控制器分为两种不同的类型:sample-by-sample和DMA使能。sample-by-sample控制器通过每一个硬件中断发送或接收数据。DMA使能控制器使用DMA发送和接收采样值,并在每一个缓冲区结束时接收中断。在每一个中断结束后,DMA能够自动为下一次缓冲传输初始化自身。在许多系统中使用DMA更优越,因为DMA减少了与中断服务线程之间频繁切换所耗费的资源,这样就允许CPU做更多的数据处理。下面重点介绍DMA使能控制器及其函数使用方法。

DMA使能控制器使用DMA和底层I/O设备发送和接收缓冲区数据。控制器的初始化例程设置DMA、底层设备以及绑定这两个设备在一起的逻辑。当控制器从适配器接收缓冲时,它向DMA提交缓冲工作。DMA在缓冲和底层硬什之间传输采样值。当DMA完成缓冲处理时,中断服务例程运行并通知适配器缓冲处理结束。

EDMA使能的设备摔制器整个数据流程如下:

(1)硬件,包括EDMA由setup()函数初始化:

(2)适配器调用open()函数初始化合适的通道对象并标记该通道在使用中。

当适配器从应用层接收新的缓冲时,调用控制器的submit()函数;submit()函数将适配器传递的信息传给控制器并更新通道对象。控制器使用这个信息程序同步EDMA和McBSP传输。当McBSP需要发送或接收新的采样值时,它通过硬件通知EDMA。当。EDMA完成缓冲的传输时,其先中断服务例程执行,然后调用通道对象引用的回调函数。

在下一次调用submit()时能够对EDMA编程,设置下一次缓冲传输。一些DMA,包括EDMA有在传输结束“自动重加载”自身新的传输的能力。由于EDMA自动加载自身,CPU就从这个任务中解放出来。EDMA将下一次传输缓冲的参数保存在参数随机寄存器中,使用连接指针的方式自动加载。

    1.通道对象

通道对象在submit()和EDMA中断服务例程中共亨信息。下面是一个在C670l EDMA中使用的通道对象。

 


控制器使用这些变量保存LIO适配器上交的传输连接列表状态。

2.setup()函数

setup()函数供所有设备控制器通道设置硬件。应用层中传递给setup()函数的结构使能或者禁止控制器中的高速缓冲存储器相应调用。如果高速缓冲存储器被使能而且缓冲区不在片上,那么应用层或者是设备驱动器必须处理高速缓冲存储器相应调用。默认的设置是控制器去处理这些调用。EDMA在setup()函数中初始化McBSP和Codec,并且使能EDMA中断。

3.open()函数

open()给EDMA控制器设置特定的通道。这包括设定适当的EDMA通道(接收或发送)。函数开始时为EDMA通道创建一个配置结构,由控制器使用;然后通过检查通道对象的inUse成员确定被打开的通道没有被其他任何事情占用;根据传递的参数,设定通道对象的返回指针和返回参数。

然后open()函数为控制器使用的EDMA分配传输控制代码(TCC)。TCC告诉哪个通道导致EDMA中断。这一点很重要,因为所有的EDMA通道使用同一个EDMA中断。open()函数为控制器使用的PRAM分配地址。

然后,open()修改通用的配置使通道特定化。如果通道打开作为输入,传输信号源设置为串行口接收寄存器,源地址索引设为0,目的索引设为增量。如果通道打开设置为输出,传送的目的地址使串行发送寄存器,目的地址索引为0,源地址设置为增量。当这些变化确定后,配置写入EDMA控制器控制打开的通道,无论是输入/接收还是输出/发送。这些值同样写入为给定通道分配的参数随机寄存器。以下是使用芯片支持库(csL)编写的独立通道配置代码。



4.The submit()

submdt()函数从适配器接收新的缓冲。如果控制器的提交次数达到MAXSUBMIT-COUNT,submit()返回-1表明失败。否则,submit()函数添加缓冲到传输连接列表。这通过管理通道对象中的变量来实现。当EDMA中断服务例程运行时,submit()通过修改这些变量阻止submitCount参数改变禁止EDMA通道。它然后使用通道对象的writelndex成员变量寻找哪个PRAM位置使用下一次传输。下面的代码根据通道模式(LIO_INPUT或LIO_OUTPUT),设定PRAM位置的源地址和目的地址。

 


5.中断服务例程

对于所有通道,EDMA只有一个中断。因此,中断服务例程需要划分出哪个通道(接收、发送或两者)导致中断服务例程运行。初次之外,中断服务例程实际上很简单。由于缓冲区已经被处理,所需要做的是递减submitCount,递增读索引,调用适当的正确参数的回调函数。

以下是处理EDMA传输数据的代码:

 


4基于软件中断和PIP实现的实时语音处理

PIP模块在编译时静态地分配I/O缓冲区内存。简单分配、释放APIs控制缓冲区的读写。当缓冲区满时,写线程(典型的是一个硬件中断)调用PIP_put函数。作为响应,PIP模块调用读消息通知函数安排处理数据。典型的读通知函数是一个DsP/BIOs内核,如SWI_post(信号通知软件线程)。当完成缓冲区的读处理,则调用PIP_free。作为响应,PIP模块调用写通知函数以便缓冲区能够被重新使用。PIP模块的驱动必须使用PIP函数,如PIP_put操作PIP缓冲区。驱动器也必须响应读和写消息通知函数配置PIP对象,如图6-18所示。

 


4.1  实时语音处理系统中DSP/BIOS对象配置

使用PIP模块和LIO设备控制器,必须创建一个PIP对象,该PIP对象使用notifyWriter函数填充LIO输入通道,使用notifyReader排出到LIO输出通道。这些是PIP适配器连接PIPAPI和LIOAPI的功能。

以下是在语音信号处理系统中配置的DSP/BIOS对象:

(1)软件中断swiEcho,运行echo函数。

(2)两个数据管道pipRx和pipTx,在echo和PLIO适配器之间交换数据。pipRx负责接收数据,pipTx负责发送数据。

(3)使用HWI-Hardware Interrupt Service Routine Manager为McBSP串行口0配置对应的中断服务例程。

HWI_INT6:多通道缓冲串行口0接收中断。中断源是MCSP_0_Receive(接收事件),中断函数是_DSK6X11_MCBSP_AD535_rxisr。

HWI_INT7:多通道缓冲串行口0发送中断。中断源是发送事件(MCSP_O_Transmit),中断函数是_DSK6X11_LMCBSP_AD535_txisr。

4.2软件流程

基于软件中断和PIP实现的实时语音处理的软件流程如图6-19所示,具体的程序流程如下:

 



5 基于任务和SIO实现的实时语音处理

SIO和任务线程一起使用,它使用动态可变缓冲区地址。在典型的应用中,静态分配SIO缓冲区,或启动时动态分配缓冲区,或者重复使用循环的缓冲区。因此,为SIO写的驱动必须接收任何缓冲区地址且不必要求这些缓冲区像PIP一样重复使用。在内部,SIO使用关联的DEV(设备)模块。SIO总是使用信号量(SEM)通知任务线程传输已经结束。这和PIP使用底层读/写通知函数是有差异的。

5.1  实时语音处理系统中DSP/BIOS对象创建

   以下在语音实时信号处理系统中实现的设备控制器(DEV)可以和任何LIO一起使用。DEV函数和LI0函数大致形成一对一的映射。每一个DEV函数执行一些操作SIO数据结构和LIO函数间数据传输的操作。SIO连接SIO/DEV API和LIO API。

在实时语音处理系统中,DSP/BIOS对象静态或动态的创建如下:

(1)任务tskEcho,运行echo函数。

(2)使用HWI-Hardware Interrupt Service Routine Manager为DMA通道4和5配置对应的中断服务例程。

(3)使用User Defined Device为DMA_AD535添加设备控制器codec。

在实例中,动态创建DSP/BIOS对象,两个SIO流:inStream和outStream,在echo和DLIO适配器间交换数据。图6-20是DLIO适配器缓冲流程图。

 


5.2  软件流程

基于任务和SIO实现的实时语音处理软件流程如图6-21所示,与基于中断和PIP实现的实时语音处理软件流程不同的是采用了任务(TSKs)抢占式线程。当初始化的任务线程条件满足时,软件将启动对应任务处理线程。该实时语音信号处理系统中设定两个任务线程:一个是接收串行口数据任务线程,另一个是向串行口发送数据任务线程。任务线程的结束和同步使用信号量(Semaphore)机制,这不通用软件中断中一般使用的是Mailbox机制。

 


6本章小结

    本章首先概括介绍了语音信号处理及其与应用在视频会议系统、VolP系统中的实时性要求。然后设计了基于TMS320C6701 DSP构建的实时语音信号处理系统。本文重点介绍TMS320C670l DSP通过两种不同的方法实现实时语音信号处理技术,即基于软件中断和PIP实现的实时语音处理和基于任务和SIO实现的实时语音处理。没有重点介绍语音信号处理的算法,重点足构建了基于DSP的实时语音信号处理系统的硬件平台和软件结构,为具体的语音信号处理算法实现与调试提供了良好的基础。

上一篇: 具有DAC和电源优化功能的MP3解码器 下一篇: C6000实时在线仿真系统设计实例

分享 举报

发表评论 评论 (1 个评论)

涂鸦板