通信原理论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通信原理课程设计
设计题目:卷积码编码
专业:电子信息工程
班级:09级电子2班
学生姓名:代洪浩郭俊
提交日期:
摘要
卷积码是P.Elias于1955年发明的一种非分组码。分组码在编码的时候,先将输入信息码元序列分成长度为k的段,然后按照编码规则给每段附加上r位监督码元,构成长度为n的码组。各个码组间没有约束关系,及监督码元只监督本码组的码元有无错码。因此在解码时各个接收码组也是分别独立地进行解码的。卷积码则不同。卷积码在编码是虽然也是把k个比特的信息段编成n个比特的码组,但是监督码元不仅和当前的k比特信息段有关,而且还同前面m=(N-1)个信息段有关。所以一个码组中的监督码元监督着N个信息段。通常将N称为码组的约束度。一般来说,对于卷积码,k和n的值是比较小的整数。通常将卷积码记做(n,k,m),其码率为k/n。
卷积码的编码
1.1卷积码编码原理框图
图1-1所示为卷积码编码器的一般原理方框图。编码器有3种主要元件构成,即移存器、模2加法器和旋转开关。移存器共有Nk级,模2加法器共有n个。每个模2加法器的输入端数目不等,它连接到某些移存器的输出端;模2加法器的输出端接到旋转开关上。在每个时隙中,一次有k个比特从左端进入移存器,并且移存器各级暂存的内容向右移k位。在此时隙中,旋转开关旋转一周,输出n个比特(n>k)。
Nk级
k个比特移存器
2
每输入k 比特
旋转一周
图1-1 卷积码编码器原理方框图
下面我们用两种方法来实现如下题目:
设(2,1,2)卷积码的输入、输出关系为112c b b =+,223c b b =+,若输入序列为[1 1 0 0 1 0 1 0 1 0 0 1 1 1 1],试编写输出卷积码。
根据题意,我们可得卷积码(2,1,2)的框图如下:
图1-2 (2,1,2)卷积码编码器方框图
左边是信息的输入,每个时隙中,只有1个比特的输入信息进入移存器,并且移存器各级暂存的内容向右移1位,开关旋转一周输出2个比特。所以,它的码率等于1/2。每当输入1比特时,该编码器输出3比特C1C2,输入和输出的关系如下:
C1=b1⊕b2 C2=b2⊕b3
上式中,b1是当前输入信息位,b2和b3是移存器存储的前两个信息位。
对于(2,1,2)卷积码,有4个状态:00 01 10 11 ,分别用a, b, c, d 来表示,则我们可得移存器状态和输入输出码元的关系,如表1-1
表1-1 移存器状态和输入输出码元的关系
根据该表所示的移存器状态和输入输出码元的关系,我们可得(2,1,2)卷积码的码树图,码树的起点是初始状态,即以a 点为起点,假如规定:输入信息位为“0”时,则状态向上支路移动;输入信息位为“1”时,则状态向下支路移动。图中的a、b、c、d 就是表示下图中的四种状态。下图为(2,1,2)卷积码的码树图:
1.2卷积码状态图
由上图可知:前一状态a 只能转到下一状态a 或b, 前一状态b 只能转到
下一状态c 或d,按照表1-1和图1-3所示的规律,可以画出(2,1,2)卷积码的状态图,如下图1-4所示。图中,虚线表示输入信息位为“1”时状态转变的路线,实线表示输入信息位为“0”时状态转变的路线;线旁的2位数字是编码输出比特,利用这种状态图可以方便的从输入序列得到输出序列。
图1-4 (2,1,2)卷积码状态图
1.2卷积码的网格图
将状态图在时间上展开,可以得到网格图,如图1-5所示
图1-5 (2,1,2)卷积码网格图
图中画了5个时隙,从该网格图中可以看出,在第四时隙以后的网格图形完全是重复第三时隙的图形。如果给出输入信息位为1 1 0 0 1时,从该网格图中可以得到输出编码序列是:10 01 10 01 10,则用网格图表示编码过程和输入输出关系比码树图更为简练。
解题方法
根据以上各图形,下面我们用两种方法来完成该题目。
解法一:用以前学过的C语言来实现,所用的软件为:Win-TC.
根据以上各图形,则可以用C语言知识来编写程序,我们所编写的程序如下:
#include
#include "conio.h"
#include "math.h"
#include
#define N 100
int encode(char f,int m)
{ int b1,b2,b3,c1,c2;
b1=m;
if(f=='a') b2=0,b3=0;
else
if(f=='b') b2=1,b3=0;
else
if(f=='c') b2=0,b3=1;
else b2=1,b3=1;
if(b1==b2) c1=0;
else c1=1;
if(b2==b3) c2=0;
else c2=1;
printf("%d%d",c1,c2);
printf(" ");
}
char nextstate(char f,int m)
{ switch(f)
{ case 'a':{ if(m==0) f='a';
else f='b';};break;
case 'b':{ if(m==0) f='c';
else f='d';};break;
case 'c':{ if(m==0) f='a';
else f='b';};break;
case 'd':{ if(m==0) f='c';
else f='d';};break;
}
return(f);
}
void main()
{ char f='a';
int e,i,n;
int input[N];
int encode(char f,int m);
char nextstate(char f,int m);
printf("please input the number of information bits:\n"); scanf("%d",&n);
printf("\n");
printf("please input the information bits:\n");
for(i=0;i scanf("%d",&input[i]); printf("the output sequence:\n"); for(i=0;i { e=input[i]; decode(f,e); f=nextstate(f,e); } getch(); }