首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

多制式语音编码及其DSP实现(2)

多制式语音编码及其DSP实现(2)

表3是本项目中各DMA通道的配置情况。
表3 DMA配置

通道

比特流

源地址

目的地址

缓冲区(字)

中断方式(缓冲区)

DMA2

G.729a(收)

DRR11

DM

4×5×2

全满/半满

DMA3

G.729a(发)

DM

DXR11

4×5×2

全满/半满

DMA4

PCM(收)

*1

DRR10

DM

4×1

全满

*2

DRR10

DM

4×80×2

全满/半满

DMA5

PCM(发)

*1

DM

DXR10

4×1

全满

*2

DM

DXR10

4×80×2

全满/半满

DM:数据存储区
*1:对ADPCM/CVBSD编码
*2:对G.729a编码
(5)数据传输的控制
如图3所示,串行数据流在McBSP的DR管脚接收,DX管脚发送。数据收发由帧同步信号触发。帧同步由CPLD提供,位时钟由外部晶振提供。
串口与存储区之间的数据交换由CPU或DMA控制器完成。接收寄存器DRR满(发送寄存器DXR空)时,串口向DMA发出同步事件(REVT/XEVT)或向CPU发出中断请求(RINT/XINT),智能DMA或CPU数据传输已准备好。
对PCM和G.729码流,串口(McBSP0/McBSP1)的数据读写为DMA方式。
由于G.729采用分帧编码,一次编解码待处理的数据量较大。为了避免DMA读取数据过程中连续码流溢出,设计缓冲区为双倍大小。这2块缓冲区以乒乓方式工作,即DMA传递其中块缓冲区数据时,另一块缓冲区接收来自串口或CPU的下一组数据。由于VC5409的DMA支持缓冲区全满或半满都产生中断的方式,所以只要将这2块缓冲区设计成连续,就可以方便地实现乒乓工作,而不产生数据溢出。
对ADPCM/CVSD码流,由于每次处理的码流长度较短(32bit),故在中断服务例程中由CPU直接读写串口(McBSP2),而不采取DMA方式。
图3 数据流的收发和传输



3
软件系统
(1)CVSD算法的修正
CVSD是每样点1bit的编码方式,所以32kbps和16kbps的CVSD输出信号分别由32kHz和16kHz采样的PCU信号编码得到。而实际CVSD编码器的输入总是8kHz的采样信号,为了满足算法要求。对输入PCM码流进行插值滤波。
根据插值这理,可以选择低通滤波器无失真地恢复原始信号。为了取得信号质量和运算量的折中,设计了5阶的椭圆型IIR滤波器。
1:2插值(16kbps)
分子多项式系数:
[1.02295e-01,1.14533e-01,2.41943e-01,
2.41943e-01,1.45325e-01,1.02295e-01]
每母多项式系数:
[1.00000e+00,-1.26125e+00,1.91846e+00,-1.21680+00,6.79321e+01,-1.54358e+01]
1:4插值(32kbps)
分子多项式系数:
[4.48200e+02,-6.9309e+02,4.68041e+02,4.6041e+02,-6.9309e+02,4.48200e+02]
分母多项式系数:
[1.00000e+00,-3.56926e+00,5.66631e+00,-4.83285e+00,2.20789e+00,-4.2822e+01]
另外,在对编解码后的信号进行频谱测试时,发现在3kHz处,信号的幅度超出要求3db左右。为此在编码端加入了谱调整的模块,使3kHz处频谱下降3db,作为补偿。



(2)G.729算法的回声抵消模块
G.729算法编码延时为15ms,回声现象比较明显,必须引入加声抵消算法加以抑制。
自适应回声抵消器的一般算法中,所需运算量最大的是更新参数部分。阶数越大,运算量越大。考虑到DSP的性能和算法的运算量要求,采用128阶的自适应滤波器进行回声抵消。
回声抵消模块的输入是当前一帧输入语音信号与以前解码器输出的一阶合成语音。回声抵消器利用解码器输出的合成语音信号对一帧输入信号进行回声抵消,然后将抵消掉回声的一帧输入语音信号提供给编码器作为输入信号。
(3)存储区的优化
①由于使用DP寻址,变量名仅指示偏移量;而4路信号分时处理,各路所用变量与程序代码相同,所以可以使用不同页上同名变量,在不混淆各路信号数据存储区的前提下,简化程序存储区大小。
对于ADPCM程序,编解码器的有状态变量各占25字,编解码器都使用的变量占14字。鉴于DP一页有128字,所以可以考虑前两路编解码器变量共用一页存储区;后两路编解码器变量共用一页存储区。这样,2路编解码器的存储量有25×2×2+14=114字<128字,可以存储在同一页上。
为了区分同一页上的2路变量以及同一路的编解码器变量,它们的名称应有不同。因此,编解码的程序模块各需要2个版本,即总的程序存储量=单路程序量×2。
②对CVSD和ADPCM算法,由于输入输出信号不分帧(逐样点处理),而码流格式又取得了一致,所以可以共享输入输出存储单元。
(4)代码的优化
TMS320C54xx提供了强大的硬件结构和指令体系以支持基本的数据处理操作。对汇编语言,充分挖掘指令集的潜力,能大幅度降低程序的复杂度,提高运行速度。如:使用乘累加指令MAC、MAS等,在一个时钟周期内实现1次乘法和1次加(减)法;使用DELAY指令,在一个周期内实现变量更新,简化了滤波器的实现;使用循环寻址,对FIR和IIR滤波器只要在主程序中设置一次基地址,降低了开销;使用PRT+MVDD指令,进行块搬移,减少频繁内存读定的开销;使用双字运算指令DADD、DADSUB等指令对32位的变进行操作;使用EXP+NORM指令快速计算定点数的指数和尾数;使用RPT+DSUBT指令高效实现定点数除法;使用RPT+FIRS指令高效实现FIR滤波计算。
4 实现结果
各算法的复杂度和存储量如表4所示,实现所用资源。
表4 各算法的复杂度和存储量


复杂度(MIPS)

存储量(千字)

Program

Data

G.729

60

8.32

18.53

CVSD

12

1.54

0.52

ADPCM

15.5

2.048

0.28

总的复杂度=MAX(60,12,40)=60MIPS;
总的存储量=(8.32+18.53+1.54+0.52+2.048+0.28)=31.24千字;

因此,一片VC5409上的硬件资源可以满足算法要求。实际系统的各算法性能也通过了相关的标准测试。
继承事业,薪火相传
返回列表