循环码的性能分析Word格式文档下载.docx
《循环码的性能分析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《循环码的性能分析Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
![循环码的性能分析Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/26/cf474ab3-a01e-4d80-8e5a-6f8c15c3e2ba/cf474ab3-a01e-4d80-8e5a-6f8c15c3e2ba1.gif)
循环码是线性分组码中最重要的一种子类,是目前研究得比较成熟的一类码。
环码具有许多特殊的代数性质,这些性质有助于按照要求的纠错能力系统地构造这类码,并且简化译码算法,并且目前发现的大部分线性码与循环码有密切关系。
循环码还有易于实现的特点,很容易用带反馈的移位寄存器实现其硬件。
关键词:
MATLAB循环码
Abstract
Cyclecodeislinearspace-timeblockcodesinthemostimportantofaseed,isthepresentresearchmorematurekindofcode.Cycliccodehasmanyspecialalgebraicproperties,thesepropertiestohelpinaccordancewiththerequirementsoftheerrorcorrectionabilitytoconstructthesystemofthiskindofcode,andsimplifieddecodingalgorithm,andthemostofthelinearcodeandfoundthatthereisacloserelationshipbetweencycliccode.Cycliccodeandiseasytorealizethecharacteristic,iseasytousewiththefeedbacktheshiftregisterrealizeitshardware.
Keywords:
MATLABcyclecode
1.引言
MATLAB是矩阵实验室(MatrixLaboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。
MATLAB通信系统功能函数库由七十多个函数组成,每个函数有多种选择参数,函数功能覆盖了现代通信系统的各个方面。
这些函数包括:
信号源产生函数、信源编码/解码函数、接错控制编码/解码函数、调制/解调函数(基带和通带)、滤波器函数、传输信道模型函数(基带和通带)、TDMAFDMACDMA!
数、同步函数、工具函数等。
以纠错控制编解码函数为例:
函数库提供了线性分组码、汉明码、循环码、BCH码、里德一索洛蒙码(REED---SOLOMON卷积码等6种纠错控制编码,每种编码又有编码、解码、矢量输入输出、序列输入输出等四种形式的函数表达。
2.设计原理
2.1循环码介绍
循环码是线性分组码的一种,所以它具有线性分组码的一般特性,此外还具有循环性。
循环码的编码和解码设备都不太复杂,且检(纠)错能力强。
它不但可以检测随机的错误,还可以检错突发的错误。
(n,k)循环码可以检测长为n-k
或更短的任何突发错误,包括首尾相接突发错误。
循环码是一种无权码,循环码编排的特点是相邻两个数码之间符合卡诺图中的邻接条件,即相邻两个数码之间只有一位码元不同,码元就是组成数码的单元。
符合这个特点的有多种方案,但循环码只能是表中的那种。
循环码的优点是没有瞬时错误,因为在数码变换过程中,在速度上会有快有慢,中间经过其它一些数码形式,称它们为瞬时错误。
这在某些数字系统中是不允许的,为此希望相邻两个数码之间仅有一位码元不同,即满足邻接条件,这样就不会产生瞬时错误。
循环码就是这样一种编码,它可以在卡诺图中依次循环得到。
循环码又称格雷码
(GreyCode)。
循环码最大的特点就是码字的循环特性,所谓循环特性是指:
循环码中任一许用码组经过循环移位后,所得到的码组仍然是许用码组。
若
(an1an2aia。
)为一循环码组,则(a.2a.3a。
a.1)、
(an3an4an1an2)还是许用码组。
也就是说,不论是左移还是右
移,也不论移多少位,仍然是许用的循环码组。
2.1.1循环码的多项式表示
其中ai为二进制数,通常把码组中各码元当做二进制的系数,即把上式中长为n
的各个分量看做多项式:
的各项系数,则码字与码多项式一一对应,这种多项式中,x仅表示码元位置的
标记,因此我们并不关心x的取值,这种多项式称为码多项式
2.1.2(n,k)循环码的生成多项式
按模(xn1)运算,
(n,k)循环码的生成多项式写为g(x),它是(n,k)循环码码集中唯一的,幕次为n-k的码多项式,则xkg(x)是一个幕次为n的码多项式
此时:
从上式中可以看出,生成多项式g(x)应该是xn1的一个因式,即循环码
多项式应该是xn1的一个n-k次因式。
2.1.3循环码的生成矩阵和一致校验矩阵
对所有的i=0,1,2,……k-1,用生成多项式g(x)除xnki,有:
xnkiai(x)g(x)bi(x)(2—7)
式中bi(x)是余式,表示为:
bi(x)bi,nk1xnk1bi,1xbi,0(2—8)
因此,xnkib(x)是g(x)的倍式,即xnk1bi(x)是码多项式,由此得到系统形式的生成阵
它是一个k
n阶
的矩阵。
1
bk1,nk1
bk1,1
bk1,0
G
bk2,nk1
bk2,1
bkx,0
00
b0,nk1
b0,1
b0,0
同样,由GHT=0可以得到系统形式的一致校验矩阵为:
H
(2—10)
bk2,0
如已知(7,4)循环码的生成多项式和校验多项式分别为:
g(x)x3x1,
h(x)x4x2x1。
写得其生成矩阵和校验矩阵分别为:
(2—11)
(2—12)
01
2.2循环码编码原理
有信息码构成信息多项式m(x)mk1xk1m0,其中最高幂次为k-1;
用xnk乘以信息多项式m(x),得到的xnkm(x),最高幕次为n-1,该过程相
当于把信息码(mki,mk2,,mi,m°
)移位到了码字德前k个信息位,
其后是r个全为零的监督位;
用g(x)除xnkm(x)得到余式r(x),其次数必小于g(x)的次数,即小于(n-k),将此r(x)加于信息位后做监督位,即将r(x)于xnkm(x)相加,得到的多项式必为一码多项式。
根据上面的讨论,可得到在(7,4)循环码编码的程序框图如图1所示:
图2.2.1编码程序框图
2.3循环码的纠错原理
纠错码的译码是该编码能否得到实际应用的关键所在。
译码器往往比编码较难实现,对于纠错能力强的纠错码更复杂。
根据不同的纠错或检错目的,循环码译码器可分为用于纠错目的和用于检错目的的循环码译码器。
通常,将接收到的循环码组进行除法运算,如果除尽,则说明正确传输;
如果未除尽,则在寄存器中的内容就是错误图样,根据错误图样可以确定一种逻辑,来确定差错的位置,从而达到纠错的目的。
用于纠错目的的循环码的译码算法比较复杂,感兴趣的话可以参考一些参考书。
而用于检错目的循环码,一般使用ARC通信方式。
检测过程也是将接受到的码组
进行除法运算,如果除尽,则说明传输无误;
如果未除尽,则表明传输出现差错,要求发送端重发。
用于这种目的的循环码经常被成为循环冗余校验码,即CRC校验码。
CRC校验码由于编码电路、检错电路简单且易于实现,因此得到广泛的应用。
在通过MODE传输文件的协议如ZMODEWXMODE协
如果信道产生的错
议中均用到了CRC校验技术。
在磁盘、光盘介质存储技术中也使用该方法
当码字c通过噪声信道传送时,会受到干扰而产生错误误图样是e,译码器收到的n重接受矢量是y,则表示为:
yce(2—15)
上式也可以写成多项式形式:
y(x)c(x)e(x)(2—16)
A
译码器的任务就是从y(x)中得到e(x),然后求的估值码字c(x)y(x)e(x)(2—17)
并从中得到信息组m(x)。
循环码译码可按以下三个步骤进行:
(1)有接收到的y(x)计算伴随式s(x);
(2)根据伴随式s(x)找出对应的估值错误图样e(x);
AAA
(3)计算c(x)y(x)e(x),得到估计码字c(x)。
若c(x)c(x),则译码正确,否则,若c(x)c(x),则译码错误。
由于g(x)的次数为n-k次,g(x)除E(x)后得余式(即伴随式)的最高次数为n-k-1次,故S(x)共有2n-k个可能的表达式,每一个表达式对应一个错误格式。
可以知道(7,4)循环码的S(x)共有2(7-4)=8个可能的表达式,可根
据错误图样表来纠正(7,4)循环码中的一位错误,其伴随式如表1所示BCH(7,4)循环码错误图样表:
错误图样
错误图样码字
伴随式S(x)
伴随式
E6(X)=X6
1000000
2x
100
E5(X)=X5
0100000
2
x+x
110
E4(x)=x4
0010000
X2+X+1
111
E3(x)=x3
0001000
x+1
011
E2(x)=x2
0000100
X+1
101
E1(x)=x1
0000010
X
010
Eo(x)=xo
0000001
001
E(x)=0
0000000
000
表1BCH(7,4)循环码错误图样
表
上式指出了系统循环码的译码方法:
将收到的码字R(x)用g(x)去除,如果除尽则无错;
否则有错。
如果有错,可由余式S(x)找出对应图样,然后将
错误图样E(x)与R(x)模2和,即为所求码字qx),从而实现纠错目的。
根据前面的讨论,可得(7,4)循环码译码的程序框图如图2.3.1所示:
6欢迎下载
图2.3.1译码程序框图
3程序与仿真
3.1程序函数介绍
MATLAB^提供了循环码的编码和译码函数,本程序直接调用进行编程。
(1)encode函数
功能:
编码函数
语法:
code=encode(msg,N,K,method,opt)
说明:
用method指定的方法完成纠错编码。
其中msg代表信息码元,是一个K列矩阵,N是编码后的码字长度;
K是信息位的长度;
opt是有些编码方式需要的参数。
(2)decode函数
译码函数
msg=decode(code,N,K,method,opt1,opt2,opt3,opt4);
这个函数对接收到的码字进行译码,恢复出原始的信息,译码参数和方式必须和编码时采用的严格相同。
它对接收到的码字,按method指定的方式进行译码;
optl,…,opt4是可选项的参数。
(3)cyclpoly函数
生成循环码的生成多项式。
p=cyclpoly(N,K);
p=cyclpoly(N,K,fd_flag);
从p=cyclpoly(N,K)中可找到一个给定码长N和信息位长度K生成多项式p,注意不是任意给定一个多项式都可以作为生成多项式。
(4)randint函数
引起一致地分布的任意整数矩阵语法:
out=randint(m)
out=randint(m,n)
out=randint(m,n,rg)
out=randint(m,n,rg,state)
(5)awgn函数
在某一信号中加入高斯白噪声
y=awgn(x,SNR);
信噪比SNF以dB为单位。
x的强度假定为OdBW如果x是复数,就加入复噪声。
(6)quantiz函数
产生一个量化序号和输出量化值。
index=quantiz(sig,partition);
[index,quantiz]=quantiz(sig,partition,codebook);
[index,quant,distor]=quantiz(sig,partition,codebook);
这个函数根据给定的区间参数量化信号,间隔矢量必须按递增顺序排列。
3.2各部分程序说明
1、循环码编码与解码Matlab源程序(实验以(7,4)循环码进行分析)m=3;
n=2Am-1;
k=n-m;
fs=1OO;
%设置采样频率为1OOHz
snr=1O;
%设置信噪比单位:
dB
p=cyclpoly(7,4);
%(7,4)循环码生成多项式msg=round(rand(8*k,1));
%设置8个信息组,每组k个code=encode(msg,n,k,'
cyclic/binary'
p);
%编码输入code_addnoise=awgn(code,snr,'
measured'
);
%信道输出
%将浮点数转化为2进制
forindex=1:
length(code)
if(code_addnoise(index)<
0.5)noisecode(index)=0;
else
noisecode(index)=1;
end
%译码输出
newmsg=decode(noisecode,n,k,'
%求频谱
N=length(newmsg);
fft_new=fftshift(fft(newmsg,N));
f=-fs/2:
fs/N:
(fs/2-fs/N);
%画图输出波形
figure
(1);
subplot(2,2,1);
stem(msg);
title('
编码器输入信号'
subplot(2,2,2),stem(code),title('
编码器输出信号'
subplot(2,2,3),stem(newmsg),title('
译码器输出信号'
subplot(2,2,4),plot(f,abs(fft_new)/max(abs(fft_new)));
xlabel('
频率:
Hz'
ylabel('
归一化幅度'
译码器输出后频谱图'
figure
(2)
plot(code_addnoise),title('
信道输出信号'
2.误码率
m=3;
n=2Am-1;
%定义码长
k=n-m;
%信息位长
Fs=40;
%系统采样频率
Fd=1;
%码速率
N=Fs/Fd;
M=2;
%进制数
forSNR=1:
100;
%信噪比
%制造100个信息组,每组k位
msg=randint(100,k,[0,1]);
code=encode(msg,n,k,'
cyclic/binary'
%TO入噪声
殆已调信号中加入高斯白噪声
noisycode=awgn(code,SNR,'
[],'
dB'
%各浮点数转化为二进制,波形整形过程
fori=1:
fora=1:
n
ifnoisycode(i,a)<
0.5
noisycode(i,a)=0;
noisycode(i,a)=1;
%译码newmsg=decode(noisycode,n,k,'
cyclic'
%十算误码率
[number,ratio]=biterr(newmsg,msg);
result(SNR)=ratio;
disp(['
Thebiterrorrateis'
num2str(ratio)]);
%不同信噪比下循环码经过加性高斯白噪声信道的误码率
figure
(1)
stem(result);
循环码在不同信噪比下的误码率'
)
legend('
误码率'
'
*'
信噪比'
在加性高斯白噪声下的误码率'
运行结果:
F;
.
FileEditViewInsertToolsDesktopWindowHelp
□ahI®
^^ia|■国|■口
循环玛在不同價噪比下的误码率
~IIIII||]I
一0「衆码率
0Q6
Q-1O.1
14
JI
--U
02
IS
信噪比
Thebiterrorrateis0.215
Thebiterrorrateis0.1825
Thebiterrorrateis0.1325
Thebiterrorrateis0.1475
Thebiterrorrateis0.0975
Thebiterrorrateis0.0475
Thebiterrorrateis0.0175
Thebiterrorrateis0.0125
Thebiterrorrateis0
Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0Thebiterrorrateis0The