通信原理论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

相关文档
最新文档