通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx

上传人:wj 文档编号:845226 上传时间:2023-04-29 格式:DOCX 页数:15 大小:51.84KB
下载 相关 举报
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第1页
第1页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第2页
第2页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第3页
第3页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第4页
第4页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第5页
第5页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第6页
第6页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第7页
第7页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第8页
第8页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第9页
第9页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第10页
第10页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第11页
第11页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第12页
第12页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第13页
第13页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第14页
第14页 / 共15页
通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx

《通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx》由会员分享,可在线阅读,更多相关《通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx(15页珍藏版)》请在冰点文库上搜索。

通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计Word格式.docx

ú

H(x)=ê

xh*(x)ú

ë

û

h*(x)ú

3.(7,4)循环码的编码(4位)的程序:

clear;

clc;

a=input('

请输入消息矢量:

'

);

%高次项系数在前的生成多项式Gx=[1011];

%将数组a的高位依次放在数组Data的低位

Data=zeros(1,7);

Data

(1)=a(4);

Data

(2)=a(3);

Data(3)=a

(2);

Data(4)=a

(1);

%Data除以Gx得到余数Rx[Qx,Rx]=deconv(Data,Gx);

b=Rx+Data;

%将数组b的高位放在后面c=b

(1);

b

(1)=b(7);

b(7)=c;

c=b

(2);

b

(2)=b(6);

b(6)=c;

c=b(3);

b(3)=b(5);

b(5)=c;

%将数组b校正fori=1:

7

ifrem(abs(b(i)),2)==0b(i)=0;

end

fori=1:

ifrem(abs(b(i)),2)==1b(i)=1;

disp('

输入序列:

a

编码输出序列:

b

程序运行结果为:

改变输入序列

运行结果的编码如下:

序号

输入序列

输出序列

0000

0000000

9

1000

1101000

2

0001

1010001

10

1001

0111001

3

0010

1110010

11

1010

0011010

4

0011

0100011

12

1011

1001011

5

0100

0110100

13

1100

1011100

6

0101

1100101

14

1101

0001101

0110

1000110

15

1110

0101110

8

0111

0010111

16

1111

1111111

4.相对应的译码和纠错(7位)程序:

clear;

clc;

r=[1001111];

h=[1,0,0;

1,1,0;

1,1,1;

0,1,1;

1,0,1;

0,1,0;

0,0,1];

b=flipud(h);

s=r*b;

ifrem(abs(s(i)),2)==0s(i)=0;

ifrem(abs(s(i)),2)==1s(i)=1;

ifs==[000]

e=[0000000];

elseifs==[100]

e=[0000001];

elseifs==[110]

e=[0000010];

elseifs==[111]

e=[0000100];

elseifs==[011]

e=[0001000];

elseifs==[101]

e=[0010000];

elseifs==[010]

e=[0100000];

elses==[001]

e=[1000000];

endu=r+e;

fori=1:

ifrem(abs(u(i)),2)==0u(i)=0;

ifrem(abs(u(i)),2)==1u(i)=1;

endData=zeros(1,4);

Data

(1)=u(4);

Data

(2)=u(5);

Data(3)=u(6);

Data(4)=u(7);

ife==[0000000]

没有错误:

)k=0,else

第几位错误:

)k=find(e)

;

接收码字'

)r

译码输出序列:

Data

k=5

接收码字

r=1 0 0 1 1 1 1

Data=1 0 1 1

以上编码有个缺点,就是它只能对一个消息矢量(4位)进行编码,我又在这个基础上编写了一个可以同时对位数是4的倍数的消息矢量进行编码。

5.多位循环码(4的倍数)的编码程序如下:

a=[1 1 0 0 1 0 1 1];

[X,N]=size(a);

%将信息码分为M帧,1帧4个信息码M=ceil(N/4);

d=zeros(1,4);

b=zeros(1,7*M);

Data=zeros(1,7);

fork=1:

M

forj=1:

4d(j)=a(j+(k-1)*4);

%生成多项式Gx=[1011];

Data

(1)=d(4);

Data

(2)=d(3);

Data(3)=d

(2);

Data(4)=d

(1);

%Data除以Gx得到余数Rx

[Qx,Rx]=deconv(Data,Gx);

e=Rx+Data;

b(7*k-6:

7*k)=e(1:

7);

c=b(1+(k-1)*7);

b(1+(k-1)*7)=b(7+(k-1)*7);

b(7+(k-1)*7)=c;

c=b(2+(k-1)*7);

b(2+(k-1)*7)=b(6+(k-1)*7);

b(6+(k-1)*7)=c;

c=b(3+(k-1)*7);

b(3+(k-1)*7)=b(5+(k-1)*7);

b(5+(k-1)*7)=c;

M*7

a

程序运行结果如下:

a=

1 1 0 0 1 0 1 1

b=Columns1through13

1 0 1 1 1 0 0 1 0 0 1 0

Column14

6.多位译码(7的倍数)纠错程序:

r=[10011001001001];

[X,N]=size(r);

%将接收到的码分为M帧,1帧7个信息位M=ceil(N/7);

d=zeros(1,7);

U=zeros(1,4*M);

Data1=zeros(1,7*M);

Data=zeros(1,7*M);

d(j)=r(j+(i-1)*7);

ends=d*b;

fork=1:

ifrem(abs(s(k)),2)==0s(k)=0;

ifrem(abs(s(k)),2)==1s(k)=1;

endu=d+e;

ifrem(abs(u(k)),2)==0u(k)=0;

ifrem(abs(u(k)),2)==1u(k)=1;

Data(1+7*(i-1))=e

(1);

Data(2+7*(i-1))=e

(2);

Data(3+7*(i-1))=e(3);

Data(4+7*(i-1))=e(4);

Data(5+7*(i-1))=e(5);

Data(6+7*(i-1))=e(6);

Data(7+7*(i-1))=e(7);

U(1+(i-1)*4)=u(4);

U(2+(i-1)*4)=u(5);

U(3+(i-1)*4)=u(6);

U(4+(i-1)*4)=u(7);

ifData==Data1

)m=0,else

)m=find(Data)

接收到的码字:

r

U

运行结果:

m=3 13

r=Columns1through13

1 0 0 1 1 0 0 1 0 0 1 0

U= 1 1 0 0 1 0 1 1

若把接受序列r改为r=[1011001],即1100的编码1011100的第5位和第7

位同时该变,则运行结果为:

m=4

r=

1 0 1 1 0 0 1

U=

0 0 0 1

而0001的编码为1010001

分析总结:

这两组实验基本上完成了循环码的编码和译码,但是该实验的缺点就是不能同时对7位信息码进行两位的纠错,即只能完成一位信息码的纠错。

实验二:

(7,4)汉明码的编码与译码实现

1、实验目的

实现(7,4)汉明码的编码与译码,通过这次实验不但加深了对汉明码编

码和译码原理了解,而且对线性分组码有所了解。

2、实验原理

线性分组码的构造方法比较简单、理论较为成熟,应用比较广泛。

汉明码是一种能够纠正一个错码的效率比较高的线性分组码,下面以(7,4)码为例就汉明码的编码与译码分别进行介绍:

(1)编码原理

一般来说,若汉明码长为n,信息位数为k,则监督位数r=n-k。

若希望用

r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求

2r-1³

n或2r-1³

k+r+1

(1)

设汉明码(n,k)中k=4,为了纠正一位错码,由式

(1)可知,要求监督位数r≥3。

若取r=3,则n=k+r=7。

这样就构成了(7,4)码。

a6a5a4a3a2a1a0来表示这7个码元,用s1s2s3的值表示3个监督关系式中的校正子,则s1s2s3的值与错误码元位置的对应关系可以规定如表1所列。

表2.1校正子和错码位置的关系

s1s2s3

错码位置

001

a0

101

a4

010

a1

110

a5

100

a2

111

a6

011

a3

000

无错码

则由表1可得监督关系式:

s1=a6Å

a5Å

a4Å

a2s2=a6Å

a3Å

a1s3=a6Å

a0

(2)

(3)

(4)

在发送端编码时,信息位a6a5a4a3的值决定于输入信号,因此它们是随机的。

监督位a2、a1、a0应根据信息位的取值按监督关系来确定,为使所编的码中无错码,则S1,S2,S3等于0,即

ì

a6Å

a2=0

ï

a=0 (5)

í

6 5 3 1

a=0

î

6 4 3 0

方程组(5)可等效成如下矩阵形式

a6ù

111 01 0 0ù

ê

a4ú

é

11 01 01 0ú

(6)

ú

ê

ú

1 011 0 01ú

a2ú

a1ú

式(6)可简化为HAT=0T,H为监督矩阵,则由式(6)可得到监督矩阵

111 01 0 0ù

H=ê

=[PMI] (7)

r

1 011 0 01ú

k k

因为生成矩阵G=[IQ]=[IMP'

],所以由(7)得生成矩阵G如下:

G=[IkQ]=[IkP'

]=

û

0 0 01 0 1 1ú

然后利用信息位和生成矩阵G相乘产生整个码组,即有

A=[a6a5a4a3a2a1a0]=[a6a5a4a3]G

其中A为整个码组矩阵,a6a5a4a3是信息位。

根据上述原理可以得到(7,4)汉明码的整个码组。

(2)译码与检错、纠错原理

(8)

当数字信号编码成汉明码后,由于信道噪声的存在,使得经过信道后的汉明码会发生差错,使得接收端接收到错码,因此需要多错码进行纠正,以提高通信系统的抗干扰能力及可靠性。

下面分析纠错译码原理。

设B为接收码组,它是一行7列的矩阵,即B=[b1b2b3b4b5b6b7],B中可能含有错码,错误图样E=A-B=[e7e6e5e4e3e2e1],在E的表达式中,有

=

ei í

当b时i=ai

当b时i¹

ai

(i=0,1,2L,7)

若ei=0,表示该码元没错;

若ei=1,表示该码元为错码。

由E=A-B得

A=B+E

(9)

A1

A2

A3

A4

A5

E2

A2+E2

A3+E2

A4+E2

A5+E2

E3

A2+E3

A3+E3

A4+E3

A5+E3

Ej

A2+Ej

A3+Ej

A4+Ej

A5+Ej

En-k

A2+E2n-k

A3+E2n-k

A4+E2n-k

A5+E2n-k

(9)表示接收码组和错误图样之和等于正确码组U,通过(9)式就可以实现纠错。

可以用标准阵来表示所有可能的2n个n元码组的接收矢量,(n,k)码的标准阵形式如下:

应该注意到,码组A1(全0码字)起两个作用:

既是其中一个正确码组,也是错误图样E1,代表A1所在行没有错误。

标准阵中的A1,E2,E3LE2n-k是陪集首,

陪集首的选择是有规定的,第j行的陪集首是在前j-1行中没有出现的最小码组,即错误图样E,如果不选错误图样作为陪集首,译码将会产生错误。

对于(7,4)汉明码,其最小码重是3,设码的纠错能力为t,根据公式

t=é

dmin-1ù

得该码的纠错能力为1,即能纠错一位错码。

由于根据完备码的定

2 ú

义有

t

2n-k=å

æ

ç

(12)

j=0è

ø

将(7,4)码代入(12)可以得知,(7,4)汉明码为完备码组,只能纠错和检错一位错码。

对于正确码组A而言,有

AHT=0 (10)

当接收到错码变成码组B时,有

S=BHT=(A+E)HT=AHT+EHT=EHT(11)

其中S为校正子所构成的校正矩阵,由于S和E如(11)所示的一一对应的关系,对于(7,4)码,错误图样与伴随式的对应关系如下

表2.2伴随式查询表

错误图样

伴随式

0000000

00000001

001

0000010

010

0000100

100

0001000

011

0010000

0100000

110

1000000

111

通过伴随式查询表,可以由伴随式得到错误图样,从而实现检错,进而实现纠错。

3、实验内容

由于编码涉及到矩阵的运算,而matlab在处理矩阵运算方面有独特优势,所以这次选择用matlab工具来实现(7,4)汉明码的编码和译码。

(7,4)码的编码比较简单,已知监督矩阵H,可以通过函数求生成矩阵G,然后信息位和生成矩阵G相乘就可得到所有的码组,(7,4)汉明码的编码程序如下:

%%%(7,4)汉明码编码——2012.11.10

clearall;

H=[1110100;

1101010;

1011001];

%(7,4)码的监督矩阵

G=gen2par(H)%(7,4)码的生成矩阵

m=[0000;

0001;

0010;

0011;

0100;

0101;

0110;

0111;

1000;

1001;

1010;

1011;

1100;

1101;

1110;

1111];

%%所有的信息位

U=[rem(m*G,2)];

(7,4)汉明码的编码结果:

disp(U);

由原理分析可知,要实现纠错和检错译码,关键在于伴随式查询表,因此

如何实现伴随式查询表是编程的关键,(7,4)汉明码的译码程序如下:

%%%下面是(7,4)码译码

A=input('

请输入接收码组:

[r,l]=size(A);

E=[0000000;

0000001;

0000010;

0000100;

000

0010000;

0100000;

1000000];

%%%%%求校正子,然后将其转化成十进制数fori=1:

r

Sx=S(i,1)*4+S(i,2)*2+S(i,3);

%%%%下面是(7,4)码检错fori=1:

switch(Sx)

case0

此接收码字没错'

case1

注意:

此接收码字的第一位有错,请纠正'

)case2

此接收码字的第二位有错,请纠正'

case4

此接收码字的第三位有错,请纠正'

)case3

此接收码字的第四位有错,请纠正'

case5

此接收码字的第五位有错,请纠正'

)case6

此接收码字的第六位有错,请纠正'

case7

此接收码字的第七位有错,请纠正'

%%%下面为在知道哪位出错的情况下,进行纠正fori=1:

B(i,:

)=A(i,:

)+E(1,:

case1

)+E(2,:

case2

)+E(3,:

)+E(4,:

case3

)+E(5,:

)+E(6,:

case6

)+E(7,:

)+E(8,:

B=rem(B,2);

纠错后的码字'

disp(B);

由于可能在纠错过程中会产生错误,在此,我们设计了检错纠错是否产生

错误的程序,程序如下:

%%%%下面为检查纠错是否产生错误k=1;

if(U(k,:

)==B)

flag=1;

break

ifflag==1

纠错无误'

el

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2