欢迎来到天天文库
浏览记录
ID:22052772
大小:53.00 KB
页数:5页
时间:2018-10-26
《试析浅viterbi算法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、试析浅Viterbi算法 [论文]Viterbi算法编程? [论文]固然TexasInstrument推出的C6000系列DSP使对信号处理的能力明显进步,但对信息处理能力要求的不断提升使提对DSP程序的优化越来越成为DSP开发工作中非常重要的环节。本文讨论2Mbps视频数据流的Viterbi算法的移植和优化策略、技巧。??? 一、概述? Viterbi译码算法是由Viterbi于1967年提出的一种最大似然译码办法,译码器根据接收序列R按最大似然准则力图找出正确的原始码序列。随着大规模集成电路技术的发展,采用Viterbi算法的卷积编码技术已成为广泛应用的纠
2、错方案。Viterbi译码过程可用状态表示。Sj,t和SjN/2,t表示t时刻的两个状态。在t1时刻,这两个状态值根据路径为0或者1,转移到状态S2j,t1和S2j1,t1。每一种可能的状态转移都根据接收到的有噪声的序列R计算路径度量,然后选择出各个状态的最小度量路径(幸存路径)。Viterbi算法就是通过在状态中寻找最小量路径向前回溯L步,最后得到的即为译码输出。? 在卷积码(n,k,m)表示法中,参数k表示每次输进信息码位数,n表示编码的输出卷积码位数,m称为约束长度(一些书中采用k=m1为约束长度,也可称(2,1,2)码X格图,r=k/n称为信息率,即编码效率。本
3、文运用的是(2,1,3)码,约速长度为2,状态数为2?2=-4。 TMS320C6000系列DSPs(数字信号处理器)是TI公司推出的一种并行处理的数字信号处理器,是基于TI的VLIS320C6211。该处理器的工作频率经过倍频可达到150MHz,每个时钟周期最多可并行执行8条指令,从而可以实现1200MIPS定点运算能力。? 二、编程实现及优化? 根据C6000的软件编程流程,对Viterbi算法的编程及其优化可分为三个阶段来进行。这三个阶段分别为:开发C代码、优化C代码、编写线性汇编代码。在代码编写和优化过程中,这三个阶段不是都要经过的,只要在某一阶段已经满
4、足了算法代码的功能和性能要求,就不必继续进行下面的阶段。? 1.开发C代码。这一阶段完全是根据任务要求来完成算法的代码编写工作。在C6000的集成开发环境CCS(CodeposerStudio)下进行代码的编译和功能验证,然后可用CCS的调试工具(如Profiler),利用在程序中设置断点的办法可找出程序中耗时最多、最影响整体性能的代码段。为改进代码性能,可进进下一阶段。? 在验证了算法代码实现功能并以设置断点的办法测试代码的性能,这段循环运行耗时(时钟周期)为1790。显然,性能不能达到要求,就要进进代码优化的第二阶段了。? 2.一般在代码调试中,最影响性能的是其
5、中的循环代码段。而软件流水是一种用于布置循环内的指令运行方式,尽可能充分利用CPU的功能单元等资源,使循环的多次迭代能够并行执行的一种技术。在C6000的C/C编译器里,采用软件流水使编译出来的程序代码优化是一项核心技术。所以在进一步优化之前,需要调整并尽可能简化代码的结构并往除影响软件流水的因素使其能够被编译器充分流水,这对大幅进步整个代码的性能非常重要。? 所以,在考虑影响因素同时对Viterbi算法的循环代码进行如下调整;? *运用内联函数(intrinsics)替换复杂的C语言程序。C6000编译器提供了很多intrinsics,可以快速优化C代码。Intri
6、nsics是直接参和C6000汇编指令映射的内联函数。在这里运用了_extu(x,y,z),以简化其中hamm代码部分。? *尽管软件流水循环可包含intrinsics,但不能包含函数调用。所以需要把调用函数hamm在循环中展开实现。? *由于编译器仅对最内部的循环执行流水,所以为了进步性能应尽可能创造一比较大的内循环。在代码中可以看到,在最内循环是i的两次循环,仅对它进行流水,对整个代码的性能进步不大。所以一个想法是,将i和j循环全部展开,使编译器直接面对最大的C循环以最大发挥软件流水的功能。? *另外,展开循环后代码中的变量假如可以确定其运行中的值,就尽量以实值
7、代进,这样减少了变量个数,也就是减少了所需分配的寄存器个数(C62xxCPU中有32个寄存器)。? 在进行上述调整后运行代码,进行测试发展,性能没有太大改善;用编译器反馈表(feedback)进行观察发现,循环并没有发生流水。这是为什么呢?原来在展开内部循环后导致C循环内代码尺寸太大,需要的寄存器数目大于C62XX的32个寄存器,所以不能进行软件流水。为了解决这新题目,需要简化循环或将循环拆成几个小循环。在这里先将C循环内部的小循环展开,然后将其拆成分别完成度量计算和累计度量比较的两个循环,这样就减小了每个循环中的代码尺寸。
此文档下载收益归作者所有