汉明码编译码汉明码编译码一设计思想汉明码是一种常用的纠错码,具有纠一位错误的能力。
本实验使用Matlab平台,分别用程序语言和simulink来实现汉明码的编译码。
用程序语言实现就是从原理层面,通过产生生成矩阵,错误图样,伴随式等一步步进行编译码。
用simulink实现是用封装好的汉明码编译码模块进行实例仿真,从而验证程序语言中的编译码和误码性能分析结果。
此外,在结合之前信源编码的基础上,还可实现完整通信系统的搭建。
二实现流程1.汉明码编译码生成矩阵G信息序列M产生码字C信道计算伴随式S接收码流R校验矩阵H解码码流C2解码信息序列M2图 1 汉明码编译码框图1)根据生成多项式,产生指定的生成矩阵G2)产生随机的信息序列M3)由C MG得到码字4)进入信道传输三 结论分析1. 汉明码编译码编写了GUI 界面方便呈现过程和结果。
图 2 汉明码编译码演示GUI 界面以产生(7,4)汉明码为例说明过程的具体实现。
1) 根据生成多项式,产生指定的生成矩阵G 用[H,G,n,k] = hammgen(3,'D^3+D+1')函数得到系统码形式的校验矩阵H 、G 以及码字长度n 和信息位数k100101101011100010111H ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦ 1101000011010011100101010001G ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦2) 产生随机的信息序列M0010=01000111M ⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦3) 由C MG =得到码字010001101101000010111C ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦4) 进入信道传输假设是BSC 信道,错误转移概率设定为0.1 传输后接收端得到的码流为000011110100000111101R ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦红色表示错误比特。
5) 计算=TS RH 得到伴随式 011=100001S ⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦错误图样 0000001 0000010 0000100 0001000 0010000 0100000 1000000 伴随式 101 111 011 110 001 010 100查表可知第一行码字错误图样为0100000,第二行码字错误图样为1000000,第三行码字错误图样为0000001。
进行ˆˆ=+CR E 即可得到纠错解码的码字C2。
6) 得到解码码流0110100200000001110010C ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦7) 得到解码信息序列0100200000010M ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦可以看出解码信息序列与原信息序列一样,体现了汉明码的纠错能力。
2.性能分析1)BSC 信道仿真设置BSC 错误转移概率Pe 从0到1变化,步进为0.01,在每个Pe 值进行1000次蒙特卡洛仿真,得到图3所示误码率随Pe 变化曲线图和图4所示误帧率随Pe 变化曲线图。
图 5误码率随Pe 变化曲线图图中绿线为BSC 信道误码率,红线为设定Pe 值,蓝线为Hamming 码解码误码率。
由图线可以看出仿真的BSC 信道误码率与Pe 一致。
在Pe<0.2时,Hamming码的解码误码率随着BSC信道错误传输概率Pe的减小而减小。
Hamming码的解码误码率显著下降,约为Pe的1/2。
Hamming码的纠1位错起到了很好的效果。
0.2<Pe<0.5时,Hamming码的解码误码率大于Pe。
这是因为在Pe>0.2时,传一个码字错误比特数近似为2,而Hamming码只能纠一位错,两位同时出错时会纠成另一个码字,这样就可能增加误比特数,使得“越纠越错”。
Pe>0.5时,情况恰好相反。
图6误帧率随Pe变化曲线图可以看出随着Pe增加,BSC传输误帧率和Hamming译码误帧率成S曲线上升达到1。
Hamming译码误帧率要低于BSC传输误帧率,体现了其纠错能力使得码字错误减少这一效果。
与误码率的图对比可以发现,误帧率要比误比特率高。
为了进一步验证结果的正确性,进行了simulink仿真。
图7 BSC信道仿真框图用伯努利二进制发生器产生随机序列,进行汉明码编码,进入BSC信道传输,之后进行汉明码译码,用Error Rate Calculation 模块统计误码率,结果如下:图8 simulink仿真BER随Pe变化曲线图与程序实现仿真的结果几乎一样。
2)AWGN信道仿真AWGN信道仿真直接用simulink实现。
图9 AWGN信道仿真框图设置系统的数字调制方式为2FSK,设定AWGN信道的SNR从0到8dB以1dB步进变化,得到误码率统计图。
图10 simulink仿真BER随SNR变化曲线图图中绿线为2FSK调制误码率,是由于AWGN带来的。
蓝线为汉明码解码后误码率。
可以看出,汉明码能够很好的降低误码率。
在SNR达到5dB时错误概率降低为0.001.3.完整通信系统的构建以传输图片为例,信道设置为BSC信道。
在不加入汉明码和加入汉明码两种情况下观察传输后图像的情况。
结果如下表所示。
BSC错误0.1 0.05 0.01 0.001 0转移概率PeBSC传输图像加汉明码0.0652 0.02 0.0006 0 0误码率加汉明码传输图像由结果可以看出,加入信道编码后,当BSC错误转移概率Pe<0.01后,图像恢复性能有明显的改善。
这体现了汉明码虽然只有纠一位错的能力,但由于一般信道的Pe 不会很大,其纠错的实用性和效果还是很好的。
四 思考题解答1.采用循环Hamming 码在硬件实现中的优点?与普通的线性分组码译码电路相比,循环汉明码不需要存储伴随式及错误图样,显著的节省了寄存器的使用,起到简化电路的作用。
2.Hamming 码如何改进可提高纠检错性能?可以在H 校验矩阵基础上进行扩展,最后一行为全1行,最后一列矢量为[00…1]T 。
这样任何3列是线性无关的,d min =4,进行奇偶校验,纠错能力为1,检错能力为2。
即下面通过实例的方式说明扩展H 校验矩阵的检错性能。
首先在(7,4)汉明码的基础上进行扩展,得到(8,4)扩展汉明码的生成矩阵H 。
1110100001110100=1101001011111111H ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦简化译码表如下:错误图样 0000 00010000 0010 0000 0100 0000 1000 0001 0000 0010 0000 0100 0000 10000000 伴随式00010011010110010111110111111011错码个数原序列 错码序列 伴随式 查表结果1 0000 0000 0000 0101 0100 有2 1110 1000 1110 1010 0011 无3 0001 0111 0010 0101 1001 有 40100 11101100 00100111有0'=0111H H ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦M L说明对于错码个数为1的,既可以检错也可以纠错;错码个数为2的,可以检错,但不能纠错;错码个数大于2的,被认为是错码个数为1,纠成其他码字。
附录clear all[H,G,n,k] = hammgen(3,'D^3+D+1');%%[H,G,n,k] = hammgen(3,'D^4+D^2+D+1');%[H,G,n,k] = hammgen(4,'D^4+D+1');%%[H,G,n,k] = hammgen(5,'D^5+D^2+1');%%%产生校验矩阵E=[zeros(1,n);fliplr(eye(n,n))];%产生错误图样一共是n+1个S=mod(H*E',2);%生成错误图样的伴随式%%产生消息序列%二进制随机矩阵%M= randi([0,1],1,k);%产生4位消息列nm=3;M= randi([0,1],nm,k);%产生4位消息列%消息序列code=mod(M*G,2);%对消息序列编码%BSC信道进入Pe=0.1;for j=1:nmfor i=1:ncode_bsc(j,i)=mod(code(j,i)+(unidrnd(round(1/Pe))==1),2);%模2加得到传输后的编码delta(j,i)=code_bsc(j,i)-code(j,i);%作差来计算错误位置endendep=find(delta~=0);%error positiondisplay(length(ep),'BSC错误位数')display(length(ep)/(nm*n),'BSC误比特率');Scode=mod(code_bsc*H',2 )'; %Scode=[1 1 0]';errow2=0;for i=1:nmif sum(code_bsc(i,:)-code(i,:))~=0errow2=errow2+1;endenddisplay(errow2,'BSC错误码字数');% display(errow2/nm,'BSC误码率');for m=1:nmfor i=1:n+1if S(:,i)==Scode(:,m)j=i;endend %找到对应的伴随式的位置dcode(m,:)=mod(code_bsc(m,:)+E(j,:),2);ender=length(find(dcode-code~=0));%计算误比特的个数enta=er/(nm*n);display(code,'信息序列码字')display(code_bsc,'BSC传输后的信息序列码字') display(dcode,'解码后的信息序列')% display(errow2/nm,'解码后误码率');% display(er,'解码后错误比特数');m2=dcode(:,n-k+1:end);display(dcode,'解码后信息序列');errow2=0;for i=1:nmif sum(dcode(i,:)-code(i,:))~=0errow2=errow2+1;endend% display(errow2,'解码后错误码字数');% display(errow2/nm,'解码后误码率');。