当前位置:文档之家› 汉明码编译码

汉明码编译码

汉明码编译码
汉明码编译码

汉明码编译码

汉明码编译码

一设计思想

汉明码是一种常用的纠错码,具有纠一位错误的能力。本实验使用Matlab平台,分别用程序语言和simulink来实现汉明码的编译码。用程序语言实现就是从原理层面,通过产生生成矩阵,错误图样,伴随式等一步步进行编译码。用simulink实现是用封装好的汉明码编译码模块进行实例仿真,从而验证程序语言中的编译码和误码性能分析结果。此外,在结合之前信源编码的基础上,还可实现完整通信系统的搭建。

二实现流程

1.汉明码编译码

生成矩阵G

信息序列M

产生码字C

信道

计算伴随式S接收码流R

校验矩阵H

解码码流C2

解码信息序列

M2

图 1 汉明码编译码框图

1)根据生成多项式,产生指定的生成矩阵G

2)产生随机的信息序列M

3)由C MG

得到码字

4)进入信道传输

三 结论分析

1. 汉明码编译码

编写了GUI 界面方便呈现过程和结果。

图 2 汉明码编译码演示GUI 界面 以产生(7,4)汉明码为例说明过程的具体实现。

1) 根据生成多项式,产生指定的生成矩阵G

用[H,G,n,k] = hammgen(3,'D^3+D+1')函数得到系统码形式的校验矩阵H 、G 以及码字长度n 和信息位数k

100101101011100010111H ????=??????

1

10100001101001

1100101010001G ?????

?=??

??

??

2) 产生随机的信息序列M

0010=01000111M ??

????

????

3) 由C MG =得到码字

010001101101000010111C ??

??=??

????

4) 进入信道传输

假设是BSC 信道,错误转移概率设定为0.1 传输后接收端得到的码流为

000011110100000111101R ??

??=??

????

红色表示错误比特。 5) 计算=T

S RH 得到伴随式

011=100001S ??

????

????

错误图样 0000001 0000010 0000100 0001000 0010000 0100000 1000000 伴随式

101

111

011

110

001

010

100

查表可知第一行码字错误图样为0100000,第二行码字错误图样为1000000,第三行码字错误图样为0000001。

进行??=+C

R 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.20.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

转移

概率

Pe

BSC

传输

图像

加汉

明码

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=110100101

1111111H ?????

???

??

??

简化译码表如下:

错误图样 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 0000 0000 0000 0101 0100 有

2 1110 1000 1110 1010 0011 无

3 0001 0111 0010 0101 1001 有 4

0100 1110

1100 0010

0111

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:nm

for i=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);%error position

display(length(ep),'BSC错误位数')

display(length(ep)/(nm*n),'BSC误比特率');

Scode=mod(code_bsc*H',2 )'; %Scode=[1 1 0]';

errow2=0;

for i=1:nm

if sum(code_bsc(i,:)-code(i,:))~=0

errow2=errow2+1;

end

end

display(errow2,'BSC错误码字数');

% display(errow2/nm,'BSC误码率');

for m=1:nm

for i=1:n+1

if S(:,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;

for i=1:nm

if sum(dcode(i,:)-code(i,:))~=0

errow2=errow2+1;

end

end

% display(errow2,'解码后错误码字数');

% display(errow2/nm,'解码后误码率');

相关主题
文本预览
相关文档 最新文档