通信原理二循环码.docx
《通信原理二循环码.docx》由会员分享,可在线阅读,更多相关《通信原理二循环码.docx(23页珍藏版)》请在冰豆网上搜索。
通信原理二循环码
实验报告
学科:
通信原理
(二)
题目:
数字信号基带传输系统仿真
实验设备:
安有matlab仿真软件的计算机
学院:
光电信息与通信工程学院
系别:
通信工程
学号:
姓名:
指导教师:
一、实验目的与要求
1.学习并理解信道编码的根本目的、技术要求与基本目标等基本概念;
2.掌握循环码、miller码的物理涵义、数学基础及检纠错原理;
3.掌握循环码、miller码的码型特点、检纠错能力、编译码方法及基本技术;
4.学会使用MATLAB实现循环码及miller码的编译码及检纠错模拟与分析。
二、实验仪器与设备
1.安装了matlab程序的计算机1台
三、实验原理
(一)循环码
循环码是线性分组码的一个重要子集,是目前研究得最成熟的一类码,它有许多特殊的代数性质,例如,循环码中任一许用码组经过循环移位后,所得到的码组仍然是许用码。
循环码A=an−1+an−2+…+a1+a0可以表示为如下的码多项式:
1.生成多项式g(x)
定义:
若一个循环码的所有码字多项式都是一个次数最低的、非零的、首一多项式g(x)的倍式,则称g(x)为生成该码,并称g(x)为该码的生成元或生成多项式。
可以证明生成多项式g(x)具有以下特性:
(1)g(x)是一个常数项为1的r=n−k次多项式;
(2)g(x)是xn+1的一个因式;
(3)该循环码中其它码多项式都是g(x)的倍式。
为了保证构成的生成矩阵G的各行线性不相关,通常用g(x)来构造生成矩阵。
因此,一旦生成多项式g(x)确定以后,该循环码的生成矩阵就可以确定。
设
则有:
2.监督多项式h(x)
定义:
若g(x)是(n,k)循环码的生成多项式,则有xn+1=g(x)h(x)。
其中,h(x)是k次多项式,称为监督多项式。
也称校验多项式。
监督矩阵可表示为:
其中:
3.伴随式
发送码C(x)通过含噪信道时,会因各种扰而产生误码。
例如发送码为:
00000000001111111111
接收码为:
01101001001111001001
产生错误序列:
01101001000000110110
可见,发生了两个长度分别为7和5的突发差错,其错误图样分别为1101001和11011。
若设信道产生的错误图样为e,则译码器收到的接收码可表示为:
C'=C+e
写成多项式形式即为:
C'(x)=C(x)=+e(x)
定义:
对于(n,k)循环码,接收码的多项式C(x)除以生成多项式g(x)的余数称为伴随式多项式,记为s(x)。
即:
s(x)=C'(x)modg(x)
由于C'(x)=C(x)=+e(x),且C(x)modg(x)=0,则有:
s(x)=e(x)modg(x)
【例】假设g(x)=x4+x3+x2+1,对于(7,3)循环码来说,若传输时出现一位错误,
错误图样为e1=(0001000),即e(x)=x3=。
则其伴随式s(x)可计算如下:
所以,伴随码为:
s=1000。
同样,若e1=(0010000),则相应的伴随式s
(1)(x)=x3+x2+1,而s1=1101。
si是s在下图所示的g(x)=x4+x3+x2+1除法电路中无输入时右移一位的结果,即自发运算的结果。
图2.2(7,3)循环码的伴随式计算电路
4.循环码编码方法
基本步骤如下:
(1)根据给定参数(n,k)确定生成多项式g(x);
(2)用xn−k乘以信息多项式M(x)。
这一步实际上是把信息码右端附加上n−k个“0”。
(3)求余数r(x)。
由于循环码多项式A(x)都可以被g(x)整除,即:
上式也等效于:
这样就得到了r(x)。
(4)输出的循环码多项式为:
C(x)=xn−k⋅M(x)+r(x)
5.循环码译码方法
循环码的译码过程可以分三步进行:
(1)由接收到的码多项式C'(x)计算伴随式多项式s(x);
当传输中未发生错误时,则s(x)=0;若传输中发生了错误,则s(x)≠0。
但也可能s(x)恰巧也为0,此时发生了不可检错误。
余数与出错位的对应关系只与码制及生成多项式有关,而与具体码字无关。
下图给出了G(x)=1011,C(x)=1010的出错模式,改变C(x)(码字),只会改变表中码字内容,不改变余数与出错位的对应关系。
图2.3(7,4)CRC码的出错模式(g(x)=1011)
(2)由校正子s(x)镜查表确定错误图样E(x);
(3)将错误图样E(x)与C'(x)叠加,纠正错误,得到原发送码组C(x)。
(4)再由C(x)得到原信息码组M(x)。
6.循环码检错能力分析
1)能检出全部的单个错误
对应一位错码的错码多项式E(x)=xi,而多于一项的生成多项式g(x)=......+1,显然xi除以g(x)的余数不会等于0,也即能检测出全部单个错码;
2)能检出全部离散的二位错
对应的错码多项式E(x)=xi+xj=xj(1+xj−i),只要选取的g(x)不能除尽xj−i+1且n−k>j−i。
3)能检出全部的奇数个错码
含有奇数项错码的多项式必不含x+1因子,只要选取的g(x)含有x+1因子。
4)能检测所有长度不超过n−k的突发错误
突发长度不大于b的突发错误对应的错码多项式为:
由于g(x)除不尽xi,只要Ei(x)的次数b-1不超过n−k−1次,g(x)便除不尽Ei(x)。
也就是说,能检测长度不超过n−k的突发错误。
(2)miller码
Miller码也称延迟调制码,是一种变形双向码。
其编码规则:
对原始符号“1”码元起始不跃变,中心点出现跃变来表示,即用10或01表示。
对原始符号“0”则分成单个“0”还是连续“0”予以不同处理;单个“0”时,保持0前的电平不变,即在码元边界处电平不跃变,在码元中间点电平也不跃变;对于连续“0”,则使连续两个“0”的边界处发生电平跃变。
密勒码的电平跃变如图所示 密勒码可由双相码的下降沿去触发双稳电路产生。
密勒码最初用于气象卫星和磁记录,现在也用于低速基带数传机。
4、实验内容与步骤
(1)使用pcm编码方式对输入的模拟信号抽样值进行信源编码
(2)使用循环码编码方式对之前得到的二进制数字序列进行信道编码
(3)对循环码的序列进行米勒码编码
(4)加扰
(5)米勒码解码
(6)循环码解码
(7)按pcm编码方式回复信号的抽样值
(8)计算误码率
主要代码:
cyclicmiller.m
clc;
clearall;
%------PCM--------%
t=1;
ts=0.05;
fs=1/ts;
df=0.5;
t1=[0:
ts:
t];
s=2*sin(2*pi*t1);%信号
[n,mn,dy]=fftseq(s,ts,df);
n=n/fs;
f=[0:
dy:
dy*length(mn)-dy]-fs/2;
figure
(1);subplot(3,1,1);plot(t1,s);
xlabel('时间');title('原信号波形');
%axis([-0,1,-2,2]);
figure
(1);subplot(3,1,2);stem(t1,s);
xlabel('时间');title('抽样信号波形');
axis([01-22]);
figure
(1);subplot(3,1,3);plot(f,abs(fftshift(n)));
%axis([-4,4,0,60]);
xlabel('频率');ylabel('幅频');title('原信号频谱');
s1=s./max(s);
s2=s1./(1/2048);
fori=1:
21
y=s2(i);
d=[00000000]
if(y>0)
d
(1)=1;
else
d
(1)=0;
end
y=abs(y);
if(y>=0&y<16)
d
(2)=0;d(3)=0;d(4)=0;step(i)=1;st(i)=0;
elseif(y>=16&y<32)
d
(2)=0;d(3)=0;d(4)=1;step(i)=1;st(i)=16;
elseif(y>=32&y<64)
d
(2)=0;d(3)=1;d(4)=0;step(i)=2;st(i)=32;
elseif(y>=64&y<128)
d
(2)=0;d(3)=1;d(4)=1;step(i)=4;st(i)=64;
elseif(y>=128&y<256)
d
(2)=1;d(3)=0;d(4)=0;step(i)=8;st(i)=128;
elseif(y>=256&y<512)
d
(2)=1;d(3)=0;d(4)=1;step(i)=16;st(i)=256;
elseif(y>=512&y<1024)
d
(2)=1;d(3)=1;d(4)=0;step(i)=32;st(i)=512;
elseif(y>=1024&y<=2048)
d
(2)=1;d(3)=1;d(4)=1;step(i)=64;st(i)=1024;
end
if(y<2048)
t=floor((y-st(i))/step(i));
p=dec2bin(t,4)-48;
d(5:
8)=p(1:
4);
else
d(5:
8)=[1111]
end
c(i,1:
8)=d(1:
8);
end
%-------PCM分块----------%
msg=zeros(42,7)%初始化一个42*7的矩阵
fora=1:
2:
42
msg(a,1:
4)=c(a/2+0.5,1:
4)
msg(a+1,1:
4)=c(a/2+0.5,5:
8)
end
%--------(7,4)循环码编码----------%
cx=zeros(42,7)
ccc=zeros(42,7)
fori=1:
42
[A,B]=deconv(msg(i,1:
7),[1101])
cx(i,1:
7)=msg(i,1:
7)+B
cx(i,1:
7)=abs(cx(i,1:
7))
ccc(i,1:
7)=rem(cx(i,1:
7),2);
end
%----------循环码分块---------%
xn=zeros(1,294)
xn(1:
7)=c(1,1:
7)
foraa=2:
42
forbb=1:
7
xn((aa-1)*7+bb)=ccc(aa,bb)
end
end
figure
(2);subplot(4,1,1);stairs([0:
length(xn)-1],xn);axis([0length(xn)-22]);
title('(7,4)循环码编码后信号');
yh=Miller(xn);%密勒码1的话用半占空比的1001交替表示0特别特别如果单0保持前一状态如果连0第一0保持前一状态第二0起始点电平转换
%-------加扰-------%
yhh=awgn(yh,35);
yh1=awgn(yh,-5);
yh2=awgn(yh,5);
yh3=awgn(yh,15);
yh4=awgn(yh,25);
yh5=awgn(yh,35);
%密勒码解码
decode=DeMiller(yh);
figure
(2);subplot(4,1,2);stairs([0:
length(yh)-1],yh);axis([0length(xn)-22]);title('加扰前Miller码');
figure
(2);subplot(4,1,3);stairs([0:
length(yhh)-1],yhh);axis([0length(xn)-22]);title('加扰后Miller码');
%--------判决--------%
%forii=1:
294
%ifdecode(ii)>0.5
%decode(ii)=1
%elsedecode(ii)=0
%end
%end
figure
(2);subplot(4,1,4);stairs([0:
length(xn)-1],decode);axis([0length(xn)-22]);title('Miller码解调后');
bbbbbbbbbbbbb=decode-xn
%--------码形变换-------%
mm=1;
nn=1;
forbb=1:
294
yy(mm,nn)=decode(bb)
nn=nn+1;
ifnn==8
mm=mm+1
nn=1
end
end
%-------(7,4)循环码解码--------%
er=zeros(42,7)
s=zeros(42,7)
qq=[1101]
forii=1:
42
[q,yy2]=deconv(yy(ii,1:
7),qq)
s(ii,1:
7)=abs(yy2)
s(ii,1:
7)=rem(s(ii,1:
7),2)
ifs(ii,1:
7)==[0000110]
er(ii,1:
7)=[1000000]
elseifs(ii,1:
7)==[0000011]
er(ii,1:
7)=[0100000]
elseifs(ii,1:
7)==[0000111]
er(ii,1:
7)=[0010000]
elseifs(ii,1:
7)==[0000101]
er(ii,1:
7)=[0001000]
elseifs(ii,1:
7)==[0000100]
er(ii,1:
7)=[0000100]
elseifs(ii,1:
7)==[0000010]
er(ii,1:
7)=[0000010]
elseifs(ii,1:
7)==[0000001]
er(ii,1:
7)=[0000001]
end
end
end
end
end
end
end
yyy(ii,1:
7)=yy(ii,1:
7)+er(ii,1:
7)
yyy(ii,1:
7)=rem(yyy(ii,1:
7),2)
cc(ii,1:
4)=yyy(ii,1:
4)
end
%------PCM解码码形变换-------%
ppcm=zeros(21,8)
m=1
n=1
fori=1:
42
fork=1:
4
ppcm(m,n)=cc(i,k)
n=n+1
ifn==9
m=m+1
n=1
end
end
end
%--------PCM解码---------%
zuihou=zeros(1,21)
fori=1:
21
zuihou(i)=(st(i)+step(i)*(ppcm(i,5)*8+ppcm(i,6)*4+ppcm(i,7)*2+ppcm(i,8)*1)+step(i)/2)*2/2048
ifppcm(i,1)==0
zuihou(i)=0-zuihou(i);
end
err=zuihou(i)-s(i)
end
figure(3)
%subplot(4,1,4);
plot(zuihou);
xlabel('抽样点');title('解调信号波形');
axis([0,21,-2,2]);
pe=zeros(1,5)
sn1=zeros(1,336)
sn2=zeros(1,336)
sn3=zeros(1,336)
sn4=zeros(1,336)
sn5=zeros(1,336)
sn1=fat(yh1)
sn2=fat(yh2)
sn3=fat(yh3)
sn4=fat(yh4)
sn5=fat(yh5)
snr1=sn1-c
snr2=sn2-c
snr3=sn3-c
snr4=sn4-c
snr5=sn5-c
pe
(1)=snr(snr1)/168
pe
(2)=snr(snr2)/168
pe(3)=snr(snr3)/168
pe(4)=snr(snr4)/168
pe(5)=snr(snr5)/168
figure(4)
%plot([-55152535],pe);
semilogy([-55152535],pe,'r*--');grid;title('误码率');
fftseq.m
function[M,m,df]=fftseq(m,ts,df)
fs=1/ts;
ifnargin==2
n1=0;
else
n1=fs/df;
end
n2=length(m);
n=2^(max(nextpow2(n1),nextpow2(n2)));
M=fft(m,n);
m=[m,zeros(1,n-n2)];
df=fs/n;
end
Miller.m
functionMiller=Miller(x)
m=length(x);
Miller=zeros(1,2*m);
f=0;
d=1;
fori=1:
m
%若原码为1,则交替为10或者01
ifx(i)==1
Miller(2*i-1)=f;
Miller(2*i)=not(f);
f=not(f);
d=1;
%若原码为0
else
%前一个码为1
ifd==1
Miller(2*i-1)=f;
Miller(2*i)=f;
d=0;
%前一个码为0
else
f=not(f);
Miller(2*i-1)=f;
Miller(2*i)=f;
d=0;
end
end
end
return;
Demiller.m
%DeMiller.m
functionx=DeMiller(Miller)
m=length(Miller);
x=zeros(1,m/2);
fori=1:
m/2
%若原码为1,则交替为10或者01
ifMiller(2*i-1)==Miller(2*i)
x(i)=0;
elsex(i)=1;
end
end
return;
Fat.m
functionppcm=fat(yh)
%--------解码----------%
Miller=yh;
m=length(Miller);
decode=zeros(1,m/2);
fori=1:
m/2
%若原码为1,则交替为10或者01
ifMiller(2*i-1)==Miller(2*i)
decode(i)=0;
elsedecode(i)=1;
end
end
%--------码形变换-------%
mm=1;
nn=1;
forbb=1:
294
yy(mm,nn)=decode(bb)
nn=nn+1;
ifnn==8
mm=mm+1
nn=1
end
end
%-------(7,4)循环码解码--------%
er=zeros(42,7)
s=zeros(42,7)
qq=[1101]
forii=1:
42
[q,yy2]=deconv(yy(ii,1:
7),qq)
s(ii,1:
7)=abs(yy2)
s(ii,1:
7)=rem(s(ii,1:
7),2)
ifs(ii,1:
7)==[0000110]
er(ii,1:
7)=[1000000]
elseifs(ii,1:
7)==[0000011]
er(ii,1:
7)=[0100000]
elseifs(ii,1:
7)==[0000111]
er(ii,1:
7)=[0010000]
elseifs(ii,1:
7)==[0000101]
er(ii,1:
7)=[0001000]
elseifs(ii,1:
7)==[0000100]
er(ii,1:
7)=[0000100]
elseifs(ii,1:
7)==[0000010]
er(ii,1:
7)=[0000010]
elseifs(ii,1:
7)==[0000001]
er(ii,1:
7)=[0000001]
end
end
end
end
end
end
end
yyy(ii,1:
7)=yy(ii,1:
7)+er(ii,1:
7)
yyy(ii,1:
7)=rem(yyy(ii,1:
7),2)
cc(ii,1:
4)=yyy(ii,1:
4)
end
%------PCM解码码形变换-------%
ppcm=zeros(21,8)
m=1
n=1
fori=1:
42
fork=1:
4
ppcm(m,n)=cc(i,k)
n=n+1
ifn==9
m=m+1
n=1
end
end
end
snr.m
functionpe=snr(sn)
pe=0
fori=1:
21
forj=1:
8
ifsn(i,j)~=0
pe=pe+1
end
end
End
5、实验结果
六、实验感想
本次试验是通信原理的第二个课设,识是我们上学期的通信原理
(一)的课上没有涉及到的,我这学期报了通信原理
(二)的专业选修,对循环码有了更深入的了解,但实际应用对我来说还是存在一些问题的,通过虚心求解求助同学老师帮助最后得到了实验结果,感谢老师的指导。