目前,大多数高压缩比的语音压缩数据生成必须采用专用的语音开发工具和开发版权,这给国内的小规模用户造成了一定的困难。在8K的采样速率下,同样是使用4兆位的flash芯片来存储数据,不同的语音算法所能提供的回放时间有很大差异。例如,采用ADPCM(自适应增量脉冲编码)算法只可提供128秒的回放时间,而采用TI的LPC(线性预测编码)算法却可得到50分钟的回放时间。在某一工程项目中,我们需要开发一种回放时间长达200分钟的低成本手持语音设备,由于使用了DSP内核芯片,在较短的时间内完成了开发工作,达到了预先提出的性能指标。
1 语音算法与芯片特点
在本项目中,我们选择了DSP集团的语音压缩最新算法Triple Rate Coder,其压缩比达到了46:1,且音质良好,MOS指标达到了3.98。
该算法的基本思想是:首先将语音分为若干小段,由于语音信号的谱变化是一个缓变量,因此在每一小段内信号是平稳变化的。然后用一个数字滤波器和一个激励函数来表示这一段时域波形的离散采样序列。在实际算法中是采用了一个十阶的线性预测滤波器,计算时还将每一帧分为4个子帧,每一子帧的滤波器系数矢量由上一帧和本帧数据计算得到,而最后一子帧的滤波器系数矢量则由矢量分解预测法得到;激励函数采用的是伪随机多脉冲激励函数,由最大似然算法得到。对每一帧计算得到滤波器系数矢量和函数生成元后,将这些系数再压缩打包就得到了最后的语音压缩数据。当对语音压缩数据进行解压时,首先将打包的数据展开,然后建立起线性预测滤波器,将重新生成的伪随机多脉冲激励函数输入滤波器,这样在滤波器的输出端就可得到被恢复的语音信号序列了。
该算法的实时运算需要22MIPS以上的运算速度,为此DSP集团将DSP内核和算法代码集成在D6571系列芯片内,以满足除PC用户以外的更广泛应用。D6571原理框图如图1所示,其本身可直接外挂并管理4兆位的flash,8K采样速率时在2.8KB的数据率下可提供25分钟的回放时间。该芯片具备工业标准的编解码器接口,可直接与串行PCM接口的音频编解码芯片相连,如美国国家半导体的TP3054或韩国三星半导体的ks8620。D6571可外接两片音频编解码芯片,上电后可用设置命令对外接音频编解码芯片的工作模式进行设置。例如:设置外接芯片的时钟是外同步还是自同步;设置外接芯片处于输出方式还是输入方式等。
根据实际开发经验,我们认为D6571芯片与其它公司所提供的某些DSP内核芯片相比,其最大的优点是几乎不需要任何开发工具或软件就可使用。因为该芯片的数据是双向的,既可由上位机将压缩后的语音数据通过它解压转变成语音,也可输入语音通过它进行实时压缩后传送给上位机。这就大大方便了长回放时间语音开发用户的使用。更何况目前许多语音压缩芯片对语音数据的管理是不公开的,例如:某些数字录音电话的语音压缩芯片。
2 系统构成
与语音处理有关的系统构成如图2所示。
语音数据存放在一片32兆位的flash中,采用三星的K29W3200,这是一种8位并行接口的闪存,并行接口有利于提高代码效率和满足实时性要求。
在语音数据的压缩和回放过程中,D6571和flash之间的数据吞吐均通过上位机进行。上位机采用89C52。系统还有64×64的点阵液晶模块ACM6464等外围设备。所有的设备均使用一条公共的8位数据总线,即CPU的P0口;P2口的六根口线用于键盘管理;P3口的两根口线作为两条串口线;这样用于外设管理的口线还剩余16根可用。系统实际使用了其中的14根线:与flash管理有关的使用6根,与D6571有关的使用4根,还有4根用于液晶显示管理。
音频编解码接口芯片采用一片TP3054,TP3054工作所需的同步脉冲、采样时钟、数据信号等只需要与D6571的四根控制线相连即可得到。
3 系统开发
本系统的语音开发分为上载、数据合成及下载三个过程。上载是指获得语音压缩数据;数据合成是指将全系统的数据按一定的结构组织成一个文件;下载是指仪器装配出厂时将文件烧录到flash中。这三个过程均通过PC机进行。由于系统板上MCU的串行信号直接输出的是TTL电平,因此,本系统的语音开发唯一需要另外制作的硬件就是使用一片MAX232来完成与PC机之间的电平转换。
D6571具有16位宽度的总线,但也允许以分时方式使用8位总线,这时上位机须用HL信号表示送上总线的是高8位还是低8位;而当D6571主动将数据送上总线时,会发出ACK信号通知上位机读取数据。HRD和HWR则是读和写的控制线。由于Triple RateCoder算法是按30毫秒分帧采样,然后再进行分析压缩的,因此无论是读取压缩数据还是回送压缩数据,均必须在一帧之内完成,否则D6571会自行进入休眠状态。向D6571输送语音数据的过程如下:首先送出解压控制命令,然后接收一个回送状态字,状态字中包含了当前帧所需要的字节数,上位机就连续送出规定数目的数据,待一帧处理完毕后,D6571会继续送出状态字。如此循环就可连续回放出语音了。而利用D6571进行语音压缩的数据处理过程正好相反,状态字中包含的是当前帧压缩所得到的字节数,上位机就应连续接收规定数目的数据。
上载时,首先要得到的是各个语音段的压缩数据。作为准备工作,先用PC机的录音机工具将我们所需的语音录制成WAV文件。然后对MCU和PC机分别编写共同配合工作的两段程序来完成以下功能:PC机通过声卡播放声音给D6571;89C52控制D6571进行语音压缩并读回压缩数据,然后通过串口线回送给PC机,PC机则将每段的压缩数据存盘。
由于每段语音播放时均要有一定的中文点阵字符显示,数据合成的任务就是要将每段数据加上索引和字符点阵数据后再合成为一个完整的近32兆位的二进制文件。文件形成时为了使数据定位和读出编程方便,数据块以flash的页为单位,一页为528字节。
下载工作则较简单,在设备出厂前直接使用系统89C52的串口将数据合成形成的文件下载到闪存中即可。
D6571的压缩率极高,使用和开发也比较方便。因此尽管本系统的语音容量长达200分钟,但系统整体设计十分简洁、经济,几乎不需调试。主要开发工作是MCU和PC机的一些程序开发使用C51和VB编程,开发速度也比较快。
由于D6571的控制命令很丰富,系统用户界面的软件是很容易编写的。例如,由于该芯片具有30阶的音量控制命令,我们未添任何硬件就为设备增加了数字音量控制功能。D6571的控制命令还包含自动增益控制、变速回放、数字滤波器等更加高级的命令,因此,它几乎可应用于任何语音场合。