这是因为在Pe>0.2时,传一个码字错误比特数近似为2,而Hamming码只能纠一位错,两位同时出错时会纠成另一个码字,这样就可能增加误比特数,使得“越纠越错”。
Pe>0.5时,情况恰好相反。
图7误帧率随Pe变化曲线图
可以看出随着Pe增加,BSC传输误帧率和Hamming译码误帧率成S曲线上升达到1。
Hamming译码误帧率要低于BSC传输误帧率,体现了其纠错能力使得码字错误减少这一效果。
与误码率的图对比可以发现,误帧率要比误比特率高。
为了进一步验证结果的正确性,进行了simulink仿真。
图8BSC信道仿真框图
用伯努利二进制发生器产生随机序列,进行汉明码编码,进入BSC信道传输,之后进行汉明码译码,用ErrorRateCalculation模块统计误码率,结果如下:
图9simulink仿真BER随Pe变化曲线图
与程序实现仿真的结果几乎一样。
2)AWGN信道仿真
AWGN信道仿真直接用simulink实现。
图10AWGN信道仿真框图
设置系统的数字调制方式为2FSK,设定AWGN信道的SNR从0到8dB以1dB步进变化,得到误码率统计图。
图11simulink仿真BER随SNR变化曲线图
图中绿线为2FSK调制误码率,是由于AWGN带来的。
蓝线为汉明码解码后误码率。
可以看出,汉明码能够很好的降低误码率。
在SNR达到5dB时错误概率降低为0.001.
3.完整通信系统的构建
以传输图片为例,信道设置为BSC信道。
在不加入汉明码和加入汉明码两种情况下观察传输后图像的情况。
结果如下表所示。
BSC错误转移概率Pe
0.1
0.05
0.01
0.001
0
BSC
传输图像
加汉明码误码率
0.0652
0.02
0.0006
0
0
加汉明码传输图像
由结果可以看出,加入信道编码后,当BSC错误转移概率Pe<0.01后,图像恢复性能有明显的改善。
这体现了汉明码虽然只有纠一位错的能力,但由于一般信道的Pe不会很大,其纠错的实用性和效果还是很好的。
四思考题解答
1.采用循环Hamming码在硬件实现中的优点?
与普通的线性分组码译码电路相比,循环汉明码不需要存储伴随式及错误图样,显著的节省了寄存器的使用,起到简化电路的作用。
2.Hamming码如何改进可提高纠检错性能?
可以在H校验矩阵基础上进行扩展,最后一行为全1行,最后一列矢量为[00…1]T。
这样任何3列是线性无关的,dmin=4,进行奇偶校验,纠错能力为1,检错能力为2。
即
下面通过实例的方式说明扩展H校验矩阵的检错性能。
首先在(7,4)汉明码的基础上进行扩展,得到(8,4)扩展汉明码的生成矩阵H。
简化译码表如下:
错误图样
0000
0001
0000
0010
0000
0100
0000
1000
0001
0000
0010
0000
0100
0000
1000
0000
伴随式
0001
0011
0101
1001
0111
1101
1111
1011
错码个数
原序列
错码序列
伴随式
查表结果
1
00000000
00000101
0100
有
2
11101000
11101010
0011
无
3
00010111
00100101
1001
有
4
01001110
11000010
0111
有
说明对于错码个数为1的,既可以检错也可以纠错;
错码个数为2的,可以检错,但不能纠错;
错码个数大于2的,被认为是错码个数为1,纠成其他码字。
附录
clearall
[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;
forj=1:
nm
fori=1:
n
code_bsc(j,i)=mod(code(j,i)+(unidrnd(round(1/Pe))==1),2);%模2加得到传输后的编码
delta(j,i)=code_bsc(j,i)-code(j,i);%作差来计算错误位置
end
end
ep=find(delta~=0);%errorposition
display(length(ep),'BSC错误位数')
display(length(ep)/(nm*n),'BSC误比特率');
Scode=mod(code_bsc*H',2)';%Scode=[110]';
errow2=0;
fori=1:
nm
ifsum(code_bsc(i,:
)-code(i,:
))~=0
errow2=errow2+1;
end
end
display(errow2,'BSC错误码字数');
%display(errow2/nm,'BSC误码率');
form=1:
nm
fori=1:
n+1
ifS(:
i)==Scode(:
m)
j=i;
end
end%找到对应的伴随式的位置
dcode(m,:
)=mod(code_bsc(m,:
)+E(j,:
),2);
end
er=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;
fori=1:
nm
ifsum(dcode(i,:
)-code(i,:
))~=0
errow2=errow2+1;
end
end
%display(errow2,'解码后错误码字数');
%display(errow2/nm,'解码后误码率');