实验九 (2,1,5)卷积码编码译码技术_第1页
实验九 (2,1,5)卷积码编码译码技术_第2页
实验九 (2,1,5)卷积码编码译码技术_第3页
实验九 (2,1,5)卷积码编码译码技术_第4页
实验九 (2,1,5)卷积码编码译码技术_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验九 (2,1,5)卷积码编码译码技术 一、实验目的1、掌握(2,1,5)卷积码编码译码技术2、了解纠错编码原理。二、实验内容1、(2,1,5)卷积码编码。2、(2,1,5)卷积码译码。三、预备知识1、纠错编码原理。2、(2,1,5)卷积码的工作原理。四、实验原理 卷积码是将发送的信息序列通过一个线性的,有限状态的移位寄存器而产生的编码。通常卷积码的编码器由K级(每级K比特)的移位寄存器和n个线性代数函数发生器(这里是模2加法器)组成。 若以(n,k,m)来描述卷积码,其中k为每次输入到卷积编码器的bit数,n为每个k元组码字对应的卷积码输出n元组码字,m为编码存储度,也就是卷积编

2、码器的k元组的级数,称m+1= K为编码约束度m称为约束长度。卷积码将k元组输入码元编成n元组输出码元,但k和n通常很小,特别适合以串行形式进行 传输,时延小。与分组码不同,卷积码编码生成的n元组元不仅与当前输入的k元组有关,还与前面m-1个输入的k元组有关,编码过程中互相关联的码元个数为n*m。卷积码的纠错性能随m的增加而增大,而差错率随N的增加而指数下降。在编码器复杂性相同的情况下,卷积码的性能优于分组码。编码器 随着信息序列不断输入,编码器就不断从一个状态转移到另一个状态并同时输出相应的码序列,所以图3所示状态图可以简单直观的描述编码器的编码过程。因此通过状态图 很容易给出输入信息序列的

3、编码结果,假定输入序列为110100,首先从零状态开始即图示a状态,由于输入信息为“1”,所以下一状态为b并输出“11”,继续输入信息“1”,由图知下一状态为d、输出“01”其它输入信息依次类推,按照状态转移路径a->b->d->c->b->c->a输出其对应的编码结果“110101001011”。译码方法代数 代数译码是将卷积码的一个编码约束长度的码段看作是n0(m+1),k0(m+1)线性分组码,每次根据(m+1)分支长接收数字,对相应的最早的那个分支上的信息数字进行估计,然后向前推进一个分支。上例中信息序列 =(10111),相应的码序列 c=(111

4、00001100111)。若接收 序列R=(10100001110111),先根据R的前三个分支(101000)和码树中前三个分支长的所有可能的 8条路径(000000)、(000011)、(001110)、(001101)、(111011)、(111000)、(110101)和(110110)进行比较,可知(111001)与接收序列(101000)的距离最小,于是判定第 0分支的信息数字为 0。然后以R的第 13分支数字(100001)按同样方法判决,依此类推下去,最后得到信息序列的估值为=(10111),遂实现了纠错。这种译码法,译码时采用的接收数字长度或译码约束长度为(m+1)n0,所以

5、只能纠正不多于(dmin-1)/2个错误(n长上的)。实用中多采用反馈择多逻辑译码法实现。维特比 维特比译码是根据接收序列在码的格图上找出一条与接收序列距离(或其他量度)为最小的一种算法。它和运筹学中求最短路径的算法相类似。若接收序列为R=(10100101100111),译码器从某个状态,例如从状态出发,每次向右延伸一个分支(对于l<L,从每个节点出发都有 2=2种可能的延伸,其中L是信息序列段数,对lL,只有一种可能),并与接收数字相应分支进行比较,计算它们之间的距离,然后将计算所得距离加到被延伸路径的累积距离值中。对到达每个状态的各条路径(有2=2条)的距离累积值进行比较,保留距离

6、值最小的一条路径,称为幸存路径(当有两条以上取最小值时,可任取其中之一),译码过程如图。图中标出到达各级节点的幸存路径的距离累积值。对给定 R的估值序列为=(10111)。这种算法所保留的路径与接收序列之间的似然概率为最大,所以又称为最大似然译码。这种译码的译码 约束长度常为编码约束长度的数倍,因而可以纠正不多于(df/2)个错误。 维特比译码器的复杂性随m呈指数增大。实用中m不大于10。它在卫星和深空通信中有广泛的应用。在解决码间串扰和数据压缩中也可应用。 序贯译码 序贯译码是根据接收序列和编码规则,在整个码树中搜索(既可以前进,也可以后退)出一条与接收序列距离(或其他量度)最小的一种算法。

7、由于它的译码器的复杂性随m值增大而线性增长,在实用中可以选用较大的m值(如2040)以保证更高的可靠性。许多深空和海事通信系统都采用序贯译码。5、 实验仿真这里我用c语言实现(2,1,5)卷积码编码,viterbi解码。6、 实验仿真程序#include <stdio.h>#include "Conio.h"#define N 34#include "math.h"#include <stdlib.h> #include<time.h>#define randomize() srand(unsigned)time(NU

8、LL)int s16=0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15;encode(unsigned int *symbols, /*编码输出*/unsigned int *data, /*编码输入*/unsigned int nbytes, /*nbytes=n/16,n为实际输入码字的数目 */unsigned int startstate /*定义初始化状态*/)int j;unsigned int input,a0=0,a1=0,a2=0,a3=0;for(j=0;j<nbytes;j+)input=*data;data+;*symbols = inp

9、uta0a1;symbols+;*symbols = inputa0a2a3;symbols+;a3=a2;a2=a1;a1=a0;a0=input;return 0; int trandistance(int m, int stat1,int stat2) /*符号m与从state1到state2时输出符号的汉明距离, 如果state1无法到state2则输出度量值为10000*/ int c; int sym,sym1,sym2; sym1=(stat2>>3)&1)(stat1>>3)&1)(stat1>>2)&1); sym2

10、=(stat2>>3)&1)(stat1>>3)&1)(stat1>>1)&1)(stat1&1); sym=(sym1<<1) | sym2; if(stat1>>3)&1)=(stat2>>2)&1)&&(stat1>>2)&1)=(stat2>>1)&1)&&( ( (stat1>>1)&1)=(stat2&1) c=(m&1)(sym&1)+(m>

11、> 1)&1)(sym >> 1)&1); else c=10000; return(c); int traninput(int a,int b) /*状态从a到b时输入卷积码的符号*/int c;if (a>>3)&1)=(b>>2)&1)&&(a>>2)&1)=(b>>1)&1)&&(a>>1)&1)=(b&1)c=(b>>3)&1);elsec=-1;return(c); int tranoutp

12、ut(int a,int b) /*状态从a到b时卷积码输出的符号*/int c,s1,s2;s1=(b>>3)&1)(a>>3)&1)(a>>2)&1);s2=(b>>3)&1)(a>>3)&1)(a>>1)&1)(a&1);if(a>>3)&1)=(b>>2)&1)&&(a>>2)&1)=(b>>1)&1)&&(a>>1)&1)=(b

13、&1)c=(s1<<1)|s2;elsec=-1;return(c); void viterbi(int initialstate, /*定义解码器初始状态*/ int *viterbiinput, /*解码器输入码字序列*/ int *viterbioutput) /*解码器输出码字序列*/struct sta /*定义网格图中每一点为一个结构体,其元素包括*/ int met; /*转移到此状态累计的度量值*/int value; /*输入符号 */struct sta *last; /*及指向前一个状态的指针*/;struct sta state16N;struct

14、sta *g;int i,j,p,q,t,r,u,l;for(i=0;i<16;i+) /* 初始化每个状态的度量值*/for(j=0;j<N;j+)stateij.met=0;for(int m=0;m<16;m+)statem0.met=trandistance(*viterbiinput,initialstate,sm);statem0.value=traninput(initialstate,sm);statem0.last=NULL;for(t=1;t<N;t+)for(p=0;p<8;p+)for(q=0;q<16;q+)if(trandista

15、nce(viterbiinputt,sp,sq)=10000)|(trandistance(viterbiinputt,sp+8,sq)=10000)/stateqt.last=NULL;0continue;elseint met1=statept-1.met+trandistance(viterbiinputt,sp,sq);int met2=statep+8t-1.met+trandistance(viterbiinputt,sp+8,sq);if(met1>met2)stateqt.met=met2;stateqt.value=traninput(sp+8,sq);stateqt.

16、last=&statep+8t-1;elsestateqt.met=met1;stateqt.value=traninput(sp,sq);stateqt.last=&statept-1; r=state0N-1.met; /*找出n步后度量值最小的状态,准备回溯路由*/ g=&state0N-1; for(u=N;u>0;u-) /*向前递归的找出最大似然路径 */ viterbioutputu-1=g->value; g=g->last; /* for(u=0;u<8;u+) *(viterbioutput+u)=stateu2.met; *

17、/ /*此行程序可用于检测第n列的度量值*/ void decode(unsigned int *input, int *output,int n)int viterbiinput100;int j;for(j=0;j<n+4;j+)viterbiinputj=(inputj*2<<1)|inputj*2+1;/printf("%3d",viterbiinputj);viterbi(s0,viterbiinput,output);void main()int n=30,i,m,j=0,decodeoutput100,jj=0;unsigned int en

18、codeinput100,wrong10=0,encodeoutput100;randomize(); for(i=0; i<n; i+)encodeinputi=rand()%2;encodeinputn=0;encodeinputn+1=0;encodeinputn+2=0;encodeinputn+3=0;encode(encodeoutput,encodeinput,n+4,s0);printf("信息序列 :n"); for(i=0;i<n; i+)printf("%2d",encodeinputi);printf("n&

19、quot;);printf("对信息序列编码后的输出 :n");for(i=0;i<(n+4)*2;i+)printf("%2d",encodeoutputi);if(i%20=19)printf("n");printf("n");decode(encodeoutput,decodeoutput,n+4);printf("无错误出现时对编码输出viterbi译码得到的序列:n");for(int ii=0;ii<n;ii+)printf("%2d",decodeoutputii); printf("n");for(i=0;i<n;i+)if(encodeinputi!=decodeoutputi)jj+; printf("译错的个数:%dn",jj);printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论