适于语音处理的SDA80D51芯片及其数字录放音系统
摘要:SDA80D51 UNISPEECH是Infineon公司新推出的具有DSP和单片机双核的芯片。介绍了该芯片的组成框图及各功能模块,并且用该芯片完成一个硬件系统,实现了语音的G.723.1编码存储和解码放音。
关键词:G.723.1 Sigma-Delta调制 前后台
目前市场上有很多语音录放系统,如录放音玩具、录音笔等,大多采用了单片机控制一个语音芯片,再接一个FLASH存储器的结构。由于语音芯片都是固定的编码算法,使得系统用途单一,不利于进一步改进,缺乏灵活性,如日本OKI公司的MSM6588只能完成ADPCM编码。
用SDA80D51芯片实现的语音录放音系统,系统硬件简单、工作可靠。所有的编解码算法都由软件来完成,设计者可以编制自己的软件,完成不同的功能。它既可以作为简单的数字录放音系统,也可以通过改变程序做语音识别、语音合成等多种系统。用途灵活、功能强大。该系统选用G.723.1语音编解码算法来完成语音的录放。
1 SDA80D51芯片介绍
SDA80D51芯片是德国Infineon公司生产的适合语音处理的芯片,它采用0.18μm工艺,核的工作电压为1.8V,I/O电压为3.3V,模拟Codec部分电压2.5V,功耗是150mW。该芯片相当于一个片上系统(SOC),内部集成了许多功能模块,如图1所示。由于它集成了许多功能模块,如图1所示。由于它集成了许多功能块,几乎只需要一片芯片就能完成语音处理和系统控制。
该芯片含有两个处理器,分别是16位DSP(OAK)和8位MCU(M8051 E-Warp)。M8051 E-Warp核由美国Mentor Graphics公司设计,它是与一般8051兼容的MCU,具有很多的增强功能,最高工作速度可达50MIPS(Million Instruction per Second),是目前为止最快的增强8051。传统8051的一个机器周期是12个时钟周期,而这个核心只需2个时钟周期,速度传统8051的6倍。许多指令都能在一个机器周期内完成。由于指令与8051兼容,使得程序员不用花许多时间学习新指令,而直接采用传统的8051编程方式就行。芯片集成有JTAG口,用Mentor Graphics公司的FS2(First Silicon Solutions)仿真器就可以实现在线仿真。
javascript:window.open(this.src);" style="cursor:pointer;"/>
OAK核是美国DSP Group公司设计的16位低功耗、低电压和高速定点DSP。采用双金属CMOS,在0.6μm或0.5μm以下工艺生产。工作电压范围在2.7V~5.5V。在5V 80MHz工作条件下,消耗电流38mA;在3.3V 80MHz条件下,消耗电流25mA。该核采用Harvard总线结构,工作速度可达100MIPS。
Codec部分由I2S、ADC和DAC组成。I2S口可用来外接一些通用的模/数芯片。两路的12位8kHz采样率的ADC,可接峰峰值为1.03V的差分电压。片内有数字AGC,可放大0到42dB(8档,6dB步长);模/数转换采用Sigma-Delta调制技术并经过一度的换算,得到16bit的PCM码流,送往处理器。两路11位8kHz采样率的DAC可软件调节增益,可放大0到-18dB(-6dB步长)。所有Codec部分可通过ASI接口连到OAK或M8051上。
SDA80D51芯片还有I2C、SPI和PWM接口模块,可以通过M8051来控制。另外在不同版本的芯片上还有多达50到250之间的GPIO(通用的输入输出口),这可以保证系统控制的灵活性。
该芯片最有特点的功能模块是存储器管理单元MMU(Memory Manage Unit),它可以管理两个核的存储区映射。物理存储器(RAM或ROM)被看成由多个块组成,每个块的大小在不同版本的芯片上定义是不同的,本系统中,块的大小是16K字节(或8K节)。MMU既可以把块(8K字)映射给OAK的程序区或数据区,也可以把块(16K字节)映射给M8051的程序区或数据区。这些完全由写M8051的特殊功能寄存器来完成。存储空间的自由挂接使得完成两个核之间的数据转换变得非常容易。此外,程序装载和启动也需要MMU的控制。
整个芯片的工作方式是M8051作为主控制芯片,完成对各种接口的控制和系统的配置。OAK作为协处理器,完成语音编解码算法等计算。两个核之间还有两个64字深的FIFO。它们用于双核通信。
2 G.723.1语音编解码
语音编解码算法一般分为三类:波形编码、参数编码(声码器)和混合编码。波形编码技术是在不建立语音模型的情况下,直接对语音波形用编码方式逼近,可有时域的脉冲编码调制和变换域编码;参数编码是在一定的语音模型基础上,在编码端分析出该模型参数,并选择适当的方式对其进行高效率的编码,而在解码端利用这些参数和语音模型,用合适的激励源(excitation)重新合成语音;混合编码则保留了参数编码的语音模型的假定,又利用了波形编码的准则优化激励信号。
G.723.1算法属于混合编码。语音模型是基于线性预测理论的全极点模型。输入是16bit的PCM码流,然后采用合成分析、矢量量化等方法,以感觉加权后的语音基音残差信号能量最小为准则进行编码。有两种类型编码方式,一种是6.3kb/s多脉冲最大似然量化方法(压缩率20:1),另一种是5.3kb/s代数码本激励线性预测ACELP(压缩率24:1)。后者的压缩率高,编码速率低,这可以降低系统存储语音时所需存储器的容量。而且解码算法简单,回放语音时不会有延迟感,语音清晰。
javascript:window.open(this.src);" style="cursor:pointer;"/>
3 语音录放音系统硬件设计
语音录放音系统硬件电路的系统框图如图2所示。由于芯片内(虚线内)集成了许多功能模块,使得电路的结构变得非常简单。
SDA80D51的RS232串行口通过MAX3222匹配电压后,连接到计算机。
芯片的启动支持SPI、I2C和RS232串口三种方式。本系统采用I2C启动方式,选用ATMEL公司的24C64。上电后,片内固化在ROM上的程序会从选定的I2C芯片拷贝256字节客户启动程序到片内程序区ff00h~ffffh处,最后把程序指针指向ff00h,开始执行。
系统程序存在SST28LF040中,由启动芯片中的用户启动程序把系统程序装载到芯片内部的RAM里,然后处理器会执行RAM中的程序指令。
语音经过编码压缩后存储在三星公司的KM29U128T(16M×8bit)内。它的寻址采用串行方式,即8根数据线既作地址线也作数据线,先输入地址,再传送数据。这样,用很少的SDA80D51地址线就可寻址很大的空间,记录大量的语音数据很方便。
用8根GPIO线实现一个4×4的小键盘,可用来作为控制接口。在录放音时,可以通过对键盘的扫描来决定下一步骤。
4 软件设计
由于要对芯片内的功能模块、系统控制和编解码算法进行编程,这使得软件设计量比较大。考虑到本文的篇幅,这里只介绍总程序结构和录放音的控制部分。
总程序框架采用前后台的工作方式。前台轮寻各个任务引擎,判断是否有任务需要处理。若有,切换状态并执行该任务;若没有,就继续查询。后台主要完成对硬件的接口、中断处理程序以及缓冲硬件数据。前台和后台的通讯是靠共享缓冲区来完成的。这种前后台的工作方式可处理多任务,每个任务只占用一个时间片。
数字录放音程序在整个软件设计中只有一个任务,它提供一个任务引警程序,由前台来调用。具体工作过程是OAK接CODEC模块,负责采集数据、编码和解码算法以及语音的回放;M8051负责配置系统工作寄存器和对FLASH的读写。两个核之间通过FIFO发消息,消息的定义格式(C语言)如下:
typedef union tag_FIFO_MESSAGE
{
struct
{
struct
{
BYTE bIdSource://发送方ID
BYTE bIdDest: //接收方ID
WORD wMsgType; //发送消息类型
WORD wDataLen; //数据长度
WORD wSeq; //消息序号
}uHead;//消息头
WORD wData[27]; //消息数据内容
WORD wCRC; //校验
}uForm;
WORD wBuf[32];
}FIFO_MESSAGE;
两个核的任务引擎程序分别用C语言编写,程序结构基本相同,都采用状态跳转的方式,即每个子程序模块都是一个状态,满足一定条件就跳到下一状态;若都不满足,就退回到前台轮寻程序。由前台程序在下一时间片继续调用停留在当前状态的程序。
如图3所示,每个圆圈都是一个状态,两个核之间的横向的箭头表示消息,向下的箭头表示状态的跳转。
在录音时,M8051的“录音初始化状态”先做初始化并发送START消息,表明录音开始,然后跳到“存语音数据状态”,等待OAK的消息。OAK的“录音初始化状态”接收到START消息后,先做初始化,然后跳到“语音采集编码状态”,在这里会不停地采集语音并用G.723.1编码,采满8K字后,向M8051发送STORE消息。M8051收到消息后,用存储器切换程序,拷贝数据到M8051的RAM区,并存到FLASH里,这由“存语音数据状态”来完成。若FLASH存满,M8051会发送STOP消息,然后OAK和M8051都进入“录音结束状态”。OAK结束后还会给M8051发送DONE消息,表明录音结束。
javascript:window.open(this.src);" style="cursor:pointer;"/>