发布网友 发布时间:2022-04-22 05:46
共1个回答
热心网友 时间:2022-05-13 07:40
Viterbi 译码示例
卷积码的Viterbi 译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程,并可以纠正接收码字中的错误比特。Viterbi 译码算法步骤如下描述:
①根据接收码符号R,计算出相应的分支量度值BM(R/ Cj),j = 1 、2 ;
②进入某一状态的2 条分支量度BM (R/ Cj)与其前状态路径量度PM累加求和;
③比较到达当前状态的2 条新的路径量度PM的大小,选择最大者作为新的状态路径量度存储起来,并保存与此路径对应的码字;
④对所有的256 个状态都实施上述加、比、选(ACS) 运算;
⑤在每一译码时刻,满足延时就从256 条留存路径中,选择路径量度最大的一条路径作为译码数据输出;
⑥进入下一译码时刻,重复以上步骤,直至译码结束。
由于卷积码译码的复杂度随着约束长度的增加以非线性方式迅速增加,在实际应用中,卷积码的实际应用性能往往受限于存储器容量和系统运算速度,尤其是对约束长度比较大的卷积码。为了在有限的硬件或软件资源条件下保证系统较高的译码性能,下面对算法进行优化。
⒈ 留存路径更新算法优化
传统的实现留存路径存储器(SMU) 更新的算法,有寄存器交换法RE 和回溯法TB ,其详细内容请参考有关文献。寄存器交换法利用数据在寄存器中不断交换,来更新留存路径,实现信息的译码,相对于TB 法不断读写存储数据和需要延时回溯判决,其优点是存储单元少、译码延时短。RE 方法的缺点是内联关系过于复杂,不适合约束长度比较大的卷积码译码器的FPGA实现。基于RE 提出了对留存路径存储及输出优化的实现方法,具体描述如下:. ①逐状态分配256 个存储器单元,单元位数由延时D (译码深度) 决定,每单元存储一个码字;
②每一个状态当前留存路径存储器的值由选定的前一状态存储器值和路径对应的码字决定(见上述Viterbi 译码算法步骤描述③) ;
③每一个译码时刻只向存储单元中存人留存路径的码字,并把选定码字写入存储单元中最低位;
④当译码时刻大于延时D 时,判决出当前时刻的所有状态中具有最大路径量度的状态,并将其对应的留存路径存储单元中的最高位作为译码结果输出;
⑤在实现存储单元的移位时,可采用循环移位的方式,避免重复读写,在软件实现时如果采用指针的方式读写地址,也可以做到只用一套存储器,这样就能继续在节省空间和提高运算速度上更进一步,在Matlab仿真中由于系统本身的特点,只须用简单的命令完成以上操作。
由于留存路径存储器中存入的只是路径信息,因而节省了存储空间;当译码输出时,只读出具有最大路径量度的状态所对应的留存路径存储单元最高位即可,不须向前回溯,减少了读RAM的次数(由D次减少至1 次) 提高了译码速度。
⒉优化判决
在输出时需要做延时判断,以确定延时足够再输出正确数据。但每一时刻做延时的后果是增加了运算量,导致系统效率较低,根据仿真实现的特点,可以做以下修改:为了避免重复做延时判断,节省运算量,译码输出时省略这一判断,每一时刻都有判决输出码字,只是在接收译码数据时把开始D时刻的接收码字丢弃, 相当于译码单元从D时刻开始输出,这是一种把部分系统功能从复杂模块转移分离到相对简单模块的思想。相对于在译码过程不断重复做判断,这种做法无论在软件或者硬件实现中,都能一定程度上提高运算速度。