实验6 BCH循环码的编码与译码

  • 格式:docx
  • 大小:50.79 KB
  • 文档页数:5

实验6 BCH 循环码的编码与译码一、实验内容用VC 或Matlab 软件编写循环BCH 码的编码与译码程序。

利用程序对教科书的例题做一个测试。

二、实验环境1. 计算机2. Windows 2000 或以上3. Microsoft Visual C++ 6.0 或以上4. Matlab 6.0或以上 三、实验目的1. 通过BCH 循环码的编码与译码程序的编写,彻底了解并掌握循环BCH 的编码与译码原理2. 通过循环BCH 码的编码与译码程序的编写,提高编程能力。

四、实验要求1. 提前预习实验,认真阅读实验原理以及相应的参考书。

2. 对不同信道的进行误码率分析。

特别是对称信道,画出误码性能图。

即信道误码率与循环汉明码之间的关系。

3. 认真填写实验报告。

五、实验原理1. 循环BCH 的编码与译码原理(略)2. 循环BCH 的程序实现。

六、实验步骤1.基本概念:设α是()2mGF 上的一个本原,t 是整数,含有2t 个跟232,,,...,tαααα,其系数在()2GF 上,并且最低次多项式()g x 为循环码生成多项式,并称为而原本预案BCH 码。

参数如下: 码长:12m n -=校验位数:r n k mt =-≤ 最小码距:min 021d d t ≥=+ 纠错能力:t 。

其中(3)m m ≥和纠错能力t ()12m t t -<是任意整数2.计算方法:(1)有21mn =-算出m ,遭到一个m 次的本原多项式()p x ,产生()2mGF 扩域。

(2)在()2mGF 上找到一个本原a,一般情况下是利用本原多项式()p x 的根,分别计2t 个连续米次根232,,,...,t αααα所对应的()2GF 域上的最小多项式()()()122,,...,t m x m x m x(3)计算2t 个连续奇次幂之根所对应的最小多项式的公倍式,得到生成多项式()()()()132,,...,t g x LCM m x m x m x =⎡⎤⎣⎦(4)由关系式()()()C x m x g x =求得BCH 码字3.程序实现:对于BCH(15,5),有matlab实现程序如下:①BCH编码enbch155.mfunction coded = bch155(msg_seq) %定义函数bch编码% 输入为msg_seq信息位% 输出为编码后的码元codedg=[1 0 1 0 0 1 1 0 1 1 1]; %生成多项式系数n=15;k=5; %默认为BCH(15,5)%% 从输入msg_seq中提取信息位msgdisplay('信息位:')if nargin<1 %判断输入信息,若未输入,系统自动产生5组信息码,并显示出信息位nmsg=5;msg=randi([0,1],[nmsg,k])elselmsg = length(msg_seq);nmsg = ceil(lmsg/k);msg = [msg_seq(:);zeros(nmsg*k-lmsg,1)];msg = reshape(msg,k,nmsg).'endxx = [msg zeros(nmsg,n-k)]; %将输入信息码msg拓展为矩阵形式的xx%% 进行编码,将xx编码为codedcoded =zeros(nmsg,n);fori=1:nmsg[q,r]=deconv(xx(i,:),g); %产生余式r=abs(rem(r,2));coded(i,:)=r;endcoded = coded + xx; %产生信息码end②BCH解码debch155.mM=4;code = gf(code,M);[m , n]=size(code);decode=[];code1=[];T2=6;N=15;mat=gf(2,M,code.prim_poly).^([N-1:-1:0]'*([1:T2]));Tx = [0 1 zeros(1,T2-1)];fori=1:m ;code1=code(i,:);M=code1.m;T2=6;N=15;S = code1* ((gf(2,M,code1.prim_poly)).^([N-1:-1:0]'*([1:T2]))); LambdaX = gf([1 zeros(1,T2)],M,code1.prim_poly);Tx = [0 1 zeros(1,T2-1)];L=0;for k = 1:T2;LambdaXTemp = LambdaX;Delta = S(k) - LambdaXTemp(1+[1:L])*(S(k-[1:L]))';ifDelta.x;LambdaX = LambdaXTemp - Delta*Tx;if 2*L < k;L = k-L;Tx = LambdaXTemp/Delta;end;end;Tx = [0 Tx(1:T2)];end;LambdaXValue = LambdaX.x;LambdaX = gf(LambdaXValue(1:max(find(LambdaXValue))), M, code1.prim_poly); errLoc_int = roots(LambdaX);errLoc = log(errLoc_int);fori = 1:length(errLoc);errorMag = 1;code1(N-errLoc(i)) = code1(N-errLoc(i)) - errorMag;end;decode=[decode;code1];end;ccode = double(decode.x);decode = ccode(:,1:5);end③测试文件 bch_en_decode.mfunction bch_en_decode(msg) %编码ifnargin<1code=enbch155();else code=enbch155(msg); %编码endcode=code+randerr(5,15,1:3); %模拟信道产生错误,每行有1-3个随机错误display('信道传输中干扰后,接收到的信息');coder=rem(code,2) %对2取余,使范围是0、1display('解码后');decode=debch155(coder)end4.进行测试法一:不输入信息位,让系统自动产生信息位,在matlab中输入下面一行代码,得到结果>>bch_en_decode()信息位:msg =0 0 1 1 11 1 1 0 01 1 1 1 11 0 0 0 10 0 0 0 0编码后码元:coded =0 0 1 1 1 1 0 1 0 1 1 0 0 1 01 1 1 0 0 0 0 1 0 1 0 0 1 1 01 1 1 1 1 1 1 1 1 1 1 1 1 1 11 0 0 0 1 1 1 1 0 1 0 1 1 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 信道传输中干扰后,接收到的信息coder =0 0 0 1 1 1 0 1 0 1 1 0 0 1 00 1 1 0 0 0 0 1 0 1 1 0 1 1 01 1 1 1 1 1 1 1 0 0 1 0 1 1 11 0 0 0 0 0 1 1 0 1 0 1 1 0 00 0 0 0 0 0 1 1 0 0 0 0 0 1 0 解码后decode =0 0 1 1 11 1 1 0 01 1 1 1 11 0 0 0 10 0 0 0 0法二:输入信息位在matalb中输入下面两行代码,得到结果如下>>msg=[1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1];>>bch_en_decode(msg)信息位:msg =1 1 0 1 11 1 1 1 10 0 0 0 10 0 0 1 00 0 0 0 1编码后码元:coded =1 1 0 1 1 1 0 0 0 0 1 0 1 0 01 1 1 1 1 1 1 1 1 1 1 1 1 1 10 0 0 0 1 0 1 0 0 1 1 0 1 1 10 0 0 1 0 1 0 0 1 1 0 1 1 1 00 0 0 0 1 0 1 0 0 1 1 0 1 1 1 信道传输中干扰后,接收到的信息coder =1 1 0 1 1 1 0 0 0 0 1 0 1 0 11 1 1 1 0 0 1 1 1 1 1 1 0 1 10 0 0 0 1 0 1 1 0 1 1 0 1 1 10 0 1 1 0 1 1 0 1 0 0 1 1 1 00 0 1 1 1 0 1 0 0 1 1 0 1 1 1 解码后decode =1 1 0 1 11 1 1 1 10 0 0 0 10 0 0 1 00 0 0 0 1。