Nov 9, 2008

卷积码编译码的实现

前段时间在学校做通信系统课程设计,选了信道卷积码编译码的课题,但在网上搜遍了也没找到它的MatLab实现,没办法,我只好在图书馆查资料自己解决了。这就是我课程设计论文的论证部分:
本次课程设计主要讨论卷积编译码过程,编码程序在lk_encode.m文件中,编码函数共有三个输入参数:待编码信息序列、状态转移矩阵和编码信息位数,输出为编码序列。使用(313)结构作为卷积编码器,以输入[0 1 1 0 1 0 0]信息序列为例的实现思路是:
1)  给定输入序列input,信息位数k3×3的状态转移矩阵G,卷积码位数n=7
2)  计算编码器结构的约束长度(约束长度=生成矩阵大小/k);若有多个输入,约束长度应是一个输入的编码移存器个数
3)  计算一个信息位的输出位数num=L
4)  输入序列补零生成的序列uz,只需要前后补两个零即可将移存器清零,第三个开始为数据位,在原序列后补20使ux输出为0 0 0
5)  利用for循环,循环8次输出uxux即为数据在3位移存器内的所有时刻的取值,共计21位(1位编码3位)+6位(补的20编码成6位)
6)  对输入序列ux改变矩阵大小后的结果:变换为3×9矩阵,矩阵列来自ux[]===》将数据流在移存器移动情况仿真出来
         0 1 1 0 1 0 0 0 0   
  0 0 1 1 0 1 0 0 0
  0 0 0 1 1 0 1 0 0 
7)  最后用以上矩阵乘以状态转移矩阵,对结果取模二运算输出27位编码结果

译码程序在lk_decode.m文件中,译码过程使用维特比算法,译码函数共有三个输入参数:待译码序列、状态转移矩阵、基于编码器结构的信息位数,输出为原信息序列。仍以[0 1 1 0 1 0 0]信息序列为例讨论译码实现思路:
1)  根据维特比算法现将编码输出序列划分为7组子序列,每组长为3
2)  输入编码输出序列、编码信息位数、约束长度、信息总长度、状态转移矩阵、状态数等参数
3)  利用两层嵌套for循环找到存储状态和幸存路径的矩阵,外层循环四种状态00011011,内层循环01两种可能取值。
4)  内层循环需要计算可能的下一状态,并记录之前走过的路径,所以定义mem_cont存储之前路径的二进制输入及其对应状态,next_state存储下一状态十进制值
5)  之后仿真逐位输入、状态逐次后移的过程,并将得到的next_state赋值到nextstate矩阵
6)  将找到的树杈支路输出转为十进制数放入output矩阵,为比较汉明距离做准备;
output矩阵构成:第一个状态所有可能路径对应第一行,第二个状态的所有可能路径对应第二行......
7)  两层循环结束后,就能找出所有路径的下一状态矩阵以及记录所有可能路径的一个矩阵。
8)  接下来寻找译码的幸存路径,将译码分为中间信道译码和最终信道译码两部分
9)  17级深度为中间信道译码过程,嵌套了4for循环的第一级为段的循环,第二级为每一段的状态循环,第三级为输入是01的循环,第四级是计算该状态时对应输入01的路径汉明距离的叠加
10)之后的89级为最终信道译码,已知该段对应输入为全0,故可省去第三级的01输入循环,其余与上一步相同
11)以上步骤可通过汉明距离的比较找到幸存路径,并将它存在矩阵里;根据维特比算法,需要从最后一级状态沿幸存路径回溯到起始全零状态,则可首先将幸存路径的值用for循环赋值到状态序列里,也即由段得到状态序列,再由状态序列从input矩阵中得到该段的输出
12)for循环7次按状态序列的行列规定将数据从input矩阵里逐位取出(因状态序列是十进制表示的,取出的每位也是十进制的),将其化为二进制后放入输出矩阵作为译码输出。
程序实现维特比译码实际是建立在网格图基础上的,网格图共有410列个点,每一行代表一个状态,前一列上的一个点对应后一列的两个点(代表下一状态的两种取值01),本次课程设计只实现了维特比算法的硬判决译码,即比较由最佳路径得到的序列与待译码序列的汉明距离。

No comments:

Post a Comment