卷积码(2,1,3)编译码课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

卷积码(2,1,3)编译码课程设计
电信系08信息工程
《信息论与编码课程设计》
——卷积码(2,1,3)
杨耀武
任刚
张明航
王飞
唐军
指导老师:梁维海刘晓丽
2010.6.25
目录
目录........................................................................................................ - 2 - (2,1,3)卷积码 .................................................................... - 3 -
1 摘要: ............................................................................... - 3 -
2 信道编码发展简史: ............................................................... -
3 -
3 卷积码编码: ........................................................................... - 5 -
3.1 编码原理 ........................................................................ - 5 -
3.2 编码器的一般结构 ........................................................ - 6 -
3.3 编码原理框图 ................................................................ - 7 -
3.4 卷积码(2,1,3)状态转移方程 .................................... - 7 -
3.5 卷积码(2,1,3)状态转移表 ........................................ - 8 -
3.6 卷积码(2,1,3)状态转移图 ........................................ - 9 -
4 维特比译码.............................................................................. - 10 -
4.1 维比特译码原理 .......................................................... - 11 -
4.2 维特比译码器原理图 .................................................. - 13 -
5 编程思路.................................................................................. - 13 -
6 卷积码编译码程序 ................................................................. - 14 -
6.1 主函数main.m ............................................................. - 14 -
6.2 状态积state_machine.m .............................................. - 14 -
6.3 汉明距离hamming_distance.m ................................... - 15 -
6.4 213编码程序encode_conv213.m ................................ - 15 -
6.5 213维比特译码decode_conv213.m ............................ - 15 -
7 实验结果及分析 ..................................................................... - 17 -
8 心得体会.................................................................................. - 17 -
9 参考文献.................................................................................. - 18 -
(2,1,3)卷积码
1 摘要:
本文一开始给出了信道编码的发展历史及研究状况,然后详细讨论了(2,1,3)卷积码的编码过程和译码过程,通过状态转移方程和输出方程得出状态转移表和状态转移图,继而得到了编码程序;然后通过维特比译码器研究,总结出了维特比译码算法,最后编译出了译码程序,而且此编码程序和译码程序都在MATLAB中调试,验证了其正确性。

2 信道编码发展简史:
1948年,Bell实验室的
C.E.Shannon发表的《通信的数学理
论》,是关于现代信息理论的奠基性论
文,它的发表标志着信息与编码理论这
一学科的创立。

Shannon在该文中指
出,任何一个通信信道都有确定的信道
容量C,如果通信系统所要求的传输速
率R小于C,则存在一种编码方法,当
码长n充分大并应用
MaximumLikelihoodDecdoding)
时,信息的错误概率可以达到任意小。

从Shannon信道编码定理可知,随着
分组码的码长n或卷积码的约束长度N
的增加,系统可以取得更好的性能(即更大的
保护能力或编码增益),而译码的最优算法是
MLD,MLD算法的复杂性随n或N的增加呈指数增加,因此当n或N较大时,MLD在物理上是不可实现的。

因此,构造物理可实现编码方案及寻找有效译码算法一直是信道编码理论与技术研究的中心任务。

Shannon指出了可以通过差错控制码在信息传输速率不大于信道容量的前提下实现可靠通信,但却没有给出具体实现差错控制编码的方法。

20世纪40年代,
R.Hamming和M.Golay提
出了第一个实用的差错控制
编码方案,使编码理论这个
应用数学分支的发展得到了
极大的推动。

通常认为是
R.Hamming提出了第一个
差错控制码。

当时他作为一
个数学家受雇于贝尔实验
室,主要从事弹性理论的研
究。

他发现计算机经常在计
算过程中出现错误,而一旦
有错误发生,程序就会停止
运行。

这个问题促使他编制
了使计算机具有检测错误能力的程序,通过对输入数据编码,使计算机能够纠正这些错误并继续运行。

Hamming所采用的方法就是
将输入数据每4个比特分为一组,然后通过计算这些信息比特的线性组合来得到3个校验比特,然后将得到的7个比特送入计算机。

计算机按照一定的原则读取这些码字,通过采用一定的算法,不仅能够检测到是否有错误发生,同时还可以找到发生单个比特错误的比特的位置,该码可以纠正7个比特中所发生的单个比特错误。

这个编码方法就是分组码的基本思想,Hamming提出的编码方案后来被命名为汉明码。

分组码所存在的固有缺点可以通过采用其他的编码方法来改善。

这种编码方法就是卷积码。

卷积码是Elias等人在1955年提出的。

卷积码与分组码的不同在于:它充分利用了各个信息块之间的相关性。

通常卷积码记为(n,k,N)码。

卷积码的编码过程是连续进行的,依次连续将每k个信息元输入编码器,得到n个码元,得到的码元中的检验元不仅与本码的信息元有关,还与以前时刻输入到编码器的信息元(反映在编码寄存器的内容上)有关。

同样,在卷积码的译码过程中,不仅要从本码中提取译码信息,还要充分利用以前和以后时刻收到的码组.从这些码组中提取译码相关信息,而且译码也是可以连续进行的,这样可以保证卷积码的译码延时相对比较小。

通常,在系统条件相同的条件下,在达到相同译码性能时,卷积码的信息块长度和码字长度都要比分组码的信息块长度和码字长度小,相应译码复杂性也小一些。

3 卷积码编码:
3.1 编码原理
卷积码编码的当前输出v(l)不仅与当前输入消息u(l)相关,还与此去前输入的m个消息u(l-1),…,u(l-m)相关,即v(l)=f(u(l),u(l-1),…,u(l-m)), l=0,1,2…
卷积编码电路中移位寄存器初态可设定为全0,电路为按段工作方式,即对每段k比特输出入,产生一段n比特输出。

任意一输入段u(l-h)与输出v(l)的关系都是一个特殊的(n,k)线性分组码的编码关
系,即存在k?n的二元矩阵G
h
,使得
v(l)=u(l-h)?G
h
, h=0,1,2,…,m
因此对于消息段序列u=(u(0),u(1),…,u(m),u(m+1),…),相应的输出端序列为v=(v(0),v(1),…,v(m),v(m+1),…),并满足v(0)=u(0)G v(1)=u(0)G1+u(1)G
v(m)=u(0)G
m +u(1)G
1-
m
+…+u(m-1)G
1
+u(m)G
v(m+1)=u(1)G
m +u(2)G
1-
m
…+u(m)G
1
+u(m+1)
G
卷积编码电路在按段工作方式下只需存储或者记忆m段的消息输入,电路中输入移位寄存器最多只有k
m?个有效的寄存器单元,而输出移位寄存器仅起一个并串转换作用。

因此称参量m为卷积吗的记忆长度(段)
3.2 编码器的一般结构
(1)有k 个输入信息端,n 个输出端(k<="">
需k(K-1)个寄存器单元),称做(n,k,k )卷积码。

(2)通常称K 为约束长度(一般来说,约束长度越大,则码字
纠错
性能越好)。

(3)码的效率:k/n
(4)编码前,k(K-1)个寄存器单元全部复位清零。

(5)由于一段消息不仅影响当前段的编码输出,还影响其后m 段的
编码输出,所以称参量1+=m K 为卷积吗的约束比特长度为n K n A ?==。

注意进入卷积编码器的最后m 段消息仍是要编码输出的消息,对这最后m 段消息的编码处理,称作卷积编码的结尾处理。

一种常见的结尾处理方法是额外输入m 段无效的0数据比特,一方面将存储的m 段消息编码全部推出,另一方面保证编码器回到全0的初态。

(n ,k ,m)卷积编码器有效的储存单元数为M (
km m i k M i ≤==∑1),其中i m 为每个输入移位储存器的有效级数(寄存单元)。

因此二元卷积码的状态变量记为状态向量)(l σ或简记为σ。

二元(n ,k ,m )卷积码共有M 2个不同的状态,记为1210,,,-M S S S 。

当状态为)(l σ(或σ)时,输入段u (l )(或u )产生编码输出端v (l )(或v ),并使该状态改变(或称为转移)到新的状态)1(+l σ(或'σ)。

σ 到'σ的转移过程称为一个转移分支,记为(',σσ)或()1(),(+l l σσ),并标记转移过程为v(l)/u(l)或v/u 。

以状态σ为结点,转移分支为有向边描述卷积码的所有不同状态转移的有向图,称为卷积码的状态转移
图。

3.3 编码原理框图
图(一)
由此图可知,卷积码电路中含有一个输入端,两个输出端和三个移位寄存器,即每段1比特输入,产生一段2比特输出。

3.4 卷积码(2,1,3)状态转移方程
1213
2'''u σσσσσ=??=??=?
113223v v u σσσσ=+??=++?
3.5 卷积码(2,1,3)状态转移表
表(一)
3.6 卷积码(2,1,3)状态转移图
由上面状态转移表得到状态转移的8个状态,每一个状态的转移都与当前输入消息)(l u的状态有关。

而每一个对应的输出)(l v不仅与当前输入的m个消息)(l u有关,还与此前输入的)
u
l
u-
l
- 相关,
(m
,
),
1
(

l
u
=l
l
m
f
v
-
l
u
l
u
(
,
-
(
)),
2,1,0
1
),
(=
),
)
(
(
图(二)
(a)闭合型
(b) 开放型
4 维特比译码
卷积码的译码通常有如下几个比较流行的译码算法:
由Wozencraft和Reiffen在1961年提出,Fano和Jelinek分别在1963年和1969年进行改进了的序贯译码算法。

该算法是基于码字树图结构的一种次最优概率译码算法。

由Massey在1963年提出的门限译码算法。

这个算法利用码字的代数结构进行代数译码。

由Viterbi在1967年提出的Viterbi
算法。

算法是基于码字格图结构的一种
最大似然译码算法,是一种最优译码
算法。

在Viterbi译码算法提出之后,卷积
码在通信系统中得到了极为广泛的应
用。

如GSM、3G、商业卫星通信系统等。

4.1 维比特译码原理
它的基本思想是把接收到的矢量,
和网格图上诸种可能的路径比较,删去距离大的路径,保留距离小的路径,以距离最小路径作为发码的估值
下面利用图解的方法来说明维特比解码的方法和运作过程。

设输入编码器的信息序列为(1 1 0 1 1 0 0 0 ),则由编码器输出的序列Y=(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 ),编码器的状态转移路线为abcdbdca。

若收到的序列R=(0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 ),对照网格图来说明维特比译码的方法。

由于该卷积码的约束长度为3位,因此先选择接收序列的前6 位序列R1 =(0 1 0 1 0 1),同到达第 3时刻可能的 8 个码序列(即 8 条路径)进行比较,并计算出码距。

该例中到达第3 时刻a 点的路径序列是(0 0 0 0 0 0)和(1 1 1 0 1 1 ),它们与R1的距离分别是 3 和4;到达第 3 时刻b点的路径序列是(0 0 0 0 1 1)和(1 1 1 0 0 0),它们与R1的距离分别是 3 和4,到达第 3 时刻c点的路径序列是(0 0 1 1 1 0)和(1 1 0 1 1 0),与 R1 的距离分别是 4 和1;到达第 3 时刻d 点的路径序列是(0 0 1 1 0 1)和(1 1 0 1 1 0),与R1 的距离分别是 2 和3。

上述每个节点都保留码距较小的路径为幸存路径,所以幸存路径码序列是(0 0 0 0 0 0)、(0 0 0 0 1 1)、(1 1 0 1 0 1)和(0 0 1 1 0 1),如图4(a)所示。

用与上面类同的方法可以得到第4、5、6、7 时刻的幸存路径。

需指出对于某一个节点而言比较两条路径与接收序列的累计码距时,若发生两个码距值相等,则可以任选一路径作为幸存
路径,此时不会影响最终的译码结果。

图 4(b)给出了第 5 时刻
的幸存路径,在码的终了时刻a状态,得到一根幸存路径,如图4(c)所示。

由此看到译码器输出是R’ =(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0),即可变换成序列(1 1 0 1 1 0 0 0),恢复了发端原始信息。

比较R’和R序列,可以看到在译码过程中己纠正了在码序列第1 和第7位上的差错。

当然,差错出现太频繁,以至超出卷积码的纠错能力,则会发生误纠,这是不希望的。

图4(a)
图4(b)
图4(c)
Viterbi译码的缺点是随着约束长度的增加算法的复杂度增加很快。

约束长度N为7时要比较的路径就有64条,为8时路径变为128条。

(2<<(N-1))。

所以Viterbi译码一般应用在约束长度小于
10的场合中。

4.2 维特比译码器原理图
5 编程思路
整体思路如图所示,其中输入序列使用randint 函数来产生。

译码总体上是先通过加——比——选来得到最优路径,然后根据状态转移图来得到解码后的码字。

在整个过程中需要记录的是到达各个状态的累计最小汉明距离及路径。

用D(i)= hamming_distance(W(i,:),word(1:chip*2))实现与出错码字对比得到汉明距,用[val,index] = sort(D)来实现val中存汉明距从小到大排列,index中存对应val数据所在位置。

首先初始化选前n 时刻来比较汉明距,选出最小的4~8条路径,而后每条被选出的路径每次加一时刻进行迭代运算,选出新的汉明距最小的4~8条路径,依次循环,直至迭代至码组结束。

最后选出4~8条路径中最小的一条
来进行译码。

6 卷积码编译码程序
6.1 主函数main.m
clear;clc;
msg = randint(1,20,[0,1])
word = encode_conv213(msg)
word(1) =~word(1); %信道中存在污染,人为的模拟传输过word(10) =~word(10); %程中的出错码字
word(15) =~word(15);
word1=word
msg_1 = decode_conv213(word1)
msg-msg_1
6.2 状态积state_machine.m
function [output,nextState] = state_machine(input,current_state)
output(1) = mod(current_state(1)+current_state(3),2);
output(2) = mod(input+current_state(2)+current_state(1),2); nextState(1) = current_state(2);
nextState(2) = current_state(3);
nextState(3) = input;
6.3 汉明距离hamming_distance.m
function distance = hamming_distance(a,b)
temp = a+b;
temp = mod(temp,2);
distance = sum(temp);
6.4 213编码程序encode_conv213.m
function word = encode_conv213(msg)
word = zeros(1,length(msg)*2);
current = [0 0 0];
for i = 1:length(msg)
[out,next] = state_machine(msg(i),current);
current = next;
word(2*i-1) = out(1);
word(2*i) = out(2);
end
6.5 213维比特译码decode_conv213.m
function msg = decode_conv213(word)
chip = 10; %初始状态选十个信息
for i = 1:2^chip
M(i,:) = de2bi(i-1,chip); %把所有可能性按二进制输出W(i,:) = encode_conv213(M(i,:));
%得到相应的二进制编译后的码字
D(i) = hamming_distance(W(i,:),word(1:chip*2));
%与出错码字对比得到汉明距
end
[val,index] = sort(D);
%val中存汉明距从小到大排列,index中存对应val数据所在位置
ret_msg = zeros(1,length(word)/2); %开辟译出码字的存放空间for i = 1:6
%1024种选择6种最小距离,并输出在ret_msg中,最小汉明距存于ret_dis
ret_msg(i,1:chip) = M(index(i),:);
ret_dis(i) = D(index(i));
end
iter = (length(word)-chip*2)/2; %剩余要译出的码字个数
for i=1:iter %迭代过程
for j=1:6
msg_temp1 = [ret_msg(j,1:chip+i-1) 0]; %下一状态出“0”
msg_temp2 = [ret_msg(j,1:chip+i-1) 1]; %下一状态出“1”
word_temp1 = encode_conv213(msg_temp1);
%下一状态为“0”时的编码
word_temp2 = encode_conv213(msg_temp2);
%下一状态为“1”时的编码
dis_temp1 = hamming_distance(word_temp1,word(1:chip*2+2*i));
dis_temp2 = hamming_distance(word_temp2,word(1:chip*2+2*i)); %算两种汉明距if (dis_temp1<dis_temp2)< bdsfid="353" p=""></dis_temp2)<>
ret_msg(j,1:chip+i) = msg_temp1;
ret_dis(j) = dis_temp1;
else
ret_msg(j,1:chip+i) = msg_temp2;
ret_dis(j) = dis_temp2;
%选择较小汉明距的状态储存并输出在ret_msg中,最小汉明距存于ret_dis
end
end
end
[val,index] = sort(ret_dis); %把最终选择的6种最小汉明距按从小到大排列
msg =ret_msg(index(1),:); %选出维特比译码最小的距离所译出的信息
7 实验结果及分析
msg =
Columns 1 through 20
1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1
word =
Columns 1 through 40
0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1
Word1 =
Columns 1 through 40
1 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1
msg_1 =
Columns 1 through 20
1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1
ans=
Columns 1 through 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
由Matlab实验结果可见,编码译码程序正确。

也说明了维特比译码的可靠性
8 心得体会
关于Viterbi译码,原理上很早就明白,但是具体实现还是有相当的难度,理清思路花的时间比编写程序花的时间多很多。

在写的过程中老师对我们的帮助很多,在细枝末节上偶尔也会钻牛角尖,通过本次课程设计自己亲手实践,对卷积码的编码及译码有了更深的认识。

同时对一些常用软件操作的更加的熟悉。

总之做完整个课程设计,获益良多。

9 参考文献
◆信息论与编码第二版(陈运)主编
◆Matlab程序设计与应用(刘卫国)主编。

相关文档
最新文档