循环冗余校验码和卷积码的性能仿真DOCWord格式.docx
《循环冗余校验码和卷积码的性能仿真DOCWord格式.docx》由会员分享,可在线阅读,更多相关《循环冗余校验码和卷积码的性能仿真DOCWord格式.docx(9页珍藏版)》请在冰点文库上搜索。
随机产生一帧数据,然后加循环冗余校验码,判断该帧是否错误,如果错误抛弃。
调制采用BPSK,只有高斯白噪声,没有信道衰落。
要求二:
比较未进行信道编码和进行卷积编码的接收端BER性能。
要求三:
画出横坐标是SNR,纵坐标是BER的曲线图。
三、仿真方案详细设计
1、循环冗余校验码
CRC即循环冗余校验码(CyclicRedundancyCheck),它是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定,在早期的通信中应用很广泛。
CRC码由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。
它的编码规则如下:
1.移位
将原信息码(kbit)左移r位(k+r=n)
2.相除
运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。
其中,模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位。
有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。
CRC码生成后就是CRC码的校验,接收方将整个数据串当作一个整体去除以用来产生循环冗余校验余数的同一个除数。
如果数据串无差错地到达接收方,循环冗余校验器将产生余数0。
因此数据单元将通过检验。
如果在传输中数据单元被改变,除法将产生非零余数,因此数据单元将通不过检验。
2、卷积码
卷积码是一种性能优越的信道编码。
(n
k
N)
表示把k个信息比特编成n个比特,N
为编码约束长度,说明编码过程中互相约束的码段个数。
卷积码编码后的n
个码元不仅与当前组的k
个信息比特有关,而且与前N
-
1
个输入组的信息比特有关。
编码过程中相互关联的码元有N
×
n
个。
R
=
k/
是卷积码的码率,码率和约束长度是衡量卷积码的两个重要参数。
在分组码中,把k个信息比特序列编成n个比特的码组,每个码组中的(n-k)个校验位仅与本码组的k个信息位有关而与其它码组无关。
为了达到一定的纠错能力和编码效率,分组码的码组长度一般比较大。
编译码时必须把整个信息码组存储起来,由此产生的译码延迟会随着n的增加而增加。
和分组码不同,卷积码前后各码之间具有相关性,即卷积码编码后的n个码元不仅与当前段的k个信息有关,而且还与前面(N-1)(N为编码约束度)段的信息有关。
在卷积码中,k个信息比特也被编成n个比特的码组,但k和n通常很小,并且可以通过串行或并行的方式进行传输,而且时延很小。
编码过程中互相关联的码元个数为Nn。
由于卷积码在编码过程中,充分地利用
各码组之间的相关性,且k和n都比较小,因此,在与分组码同样的码率和设备复杂性条件下,从理论和实际两个方面,均已证明卷积码的性能至少不比分组码差,且实现最佳和准最佳也较分组码容易。
其编码的当前输出v(l)不仅与当前输入消息u(l)相关,还与此去前输入的m个消息u(l-1),…,u(l-m)相关,即v(l)=f(u(l),u(l-1),…,u(l-m)),
l=0,1,2…
卷积编码电路中移位寄存器初态可设定为全0,电路为按段工作方式,即对每段k比特输出入,产生一段n比特输出。
任意一输入段u(l-h)与输出v(l)的关系都是一个特殊的(n,k)线性分组码的编码关系,即存在kn的二元矩阵Gh,使得
v(l)=u(l-h)*Gh,
h=0,1,2,…,m
因此对于消息段序列u=(u(0),u
(1),…,u(m),u(m+1),…),相应的输出端序列为v=(v(0),v
(1),…,v(m),v(m+1),…),并满足:
v(0)=u(0)G0
v
(1)=u(0)G1+u
(1)G0
v(m)=u(0)Gm+u
(1)Gm-1+…+u(m-1)G1+u(m)G0
v(m+1)=u
(1)Gm+u
(2)Gm-1…+u(m)G1+u(m+1)G0
卷积编码电路在按段工作方式下只需存储或者记忆m段的消息输入,电路中输入移位寄存器最多只有m*k个有效的寄存器单元,而输出移位寄存器仅起一个并串转换作用。
四、仿真结果及结论
仿真图如下:
本次仿真实验通过在MATLAB环境下进行编程从而完成了循环冗余校验码和卷积码的性能仿真。
通过编码和仿真,并对测试结果作了分析之后,可以得出以下结论:
当改变卷积码的码率时,系统的误码性能也将随之发生变化,通过比较可知,没有进行卷积码编码的误码率相比进行了卷积编码的误码率要高,同样的,没有进行卷积码编码的误比特率也比进行了卷积编码的误比特率要高。
由上面仿真图可以明显得出以上结论。
五、总结与体会
本次仿真实验通过在MATLAB环境下进行编码实现了对CRC码和卷积码的性能仿真,通过编码,我进一步学习和掌握了有关CRC的原理以及卷积码的知识,对整个通信过程的编码和调制解调过程有了更深刻的理解,同时也加深了对纠错技术的认识。
在进行仿真实验时,我通过查阅相关资料,既复习了有关知识,也在一定程度上拓宽了我的视野。
仿真实验的特点就是最终的结果都很直观,能够很明显的看出其特性,分析起来就比较容易。
在具体的编码过程中还是遇到了很多问题,以前的知识有的都不记得了,但是通过与同学进行交流和讨论以及查阅资料最终还是完成了本次的仿真。
六、主要仿真代码
主函数:
clearall;
clc;
EsNodB=0:
10;
N_block=4000;
N_bits=64;
fork=1:
length(EsNodB)
EsNo=EsNodB(k);
uncode_err_block=0;
%初始化没有编码的错误块数为0
code_err_block=0;
error1=0;
%初始化没有编码的错误比特数error1为0
error2=0;
form=1:
N_block
msg=randint(1,N_bits);
%产生随机数据msg
g=[1,zeros(1,5),1,1,1];
msg_crc=crc_encode(msg,g);
%CRC循环校验码
[block_error,biterror]=uncode_block_bit_error(msg_crc,EsNo,g,msg);
%调用没有编码的数据处理函数
uncode_err_block=uncode_err_block+block_error;
%统计没有编码的错误块数
error1=error1+biterror;
%统计没有编码的错误比特数
[block_error1,biterror1]=code_block_bit_error(msg_crc,EsNo,g,msg);
%调用经过编码后的数据处理函数
code_err_block=code_err_block+block_error1;
%统计经过编码的错误块数
error2=error2+biterror1;
%统计经过编码的错误比特数
end
err_block(k)=uncode_err_block/N_block;
err_block2(k)=code_err_block/N_block;
%计算经过编码的误块率
ber1(k)=error1/N_bits/(N_block-uncode_err_block);
ber2(k)=error2/N_bits/(N_block-code_err_block);
end
semilogy(EsNodB,err_block,'
-*'
EsNodB,err_block2,'
-+'
EsNodB,ber1,'
-s'
EsNodB,ber2,'
-h'
);
gridon;
%网格线
xlabel('
信噪比'
ylabel('
误码率或误块率'
legend('
没有编码的误块率'
'
编码后的误块率'
没有编码的误码率'
编码后的误码率'
功能函数:
functionmsg_check=crc_encode(msg,g)%CRC校验
msg_zero=[msg,zeros(1,length(g)-1)];
[div,remaider]=deconv(msg_zero,g);
crc_check=mod(remaider(end-length(g)+2:
end),2);
%crc_check为CRC奇偶校验,循环校验位数是g的长度-1
msg_check=[msg,crc_check];
%加上冗余后进行校验
function[uncode_err_block,error1]=uncode_block_bit_error(msg_crc,EsNo,g,msg)
%统计没有编码的数据块错误数和比特数
r_msg_crc=mod_demod_bpsk(msg_crc,EsNo);
flag1=crc_decode(r_msg_crc,g);
uncode_err_block=0;
error1=0;
ifflag1==0
uncode_err_block=uncode_err_block+1;
%如果标志flag1为0,说明有错,则错误块数加1,
else
error1=sum(r_msg_crc(1:
length(msg))~=msg);
%统计没有编码的错误比特数
functionoutput=mod_demod_bpsk(input,snr_db)
%input为加冗余后的信息msg_crc,snr_db为EsNo
E=1;
%信号功率
snr=10^(snr_db/10);
%将信噪比转化为十进制
sigma=sqrt(E/(2*snr));
decis=zeros(1,length(input));
%生成全0矩阵
fori=1:
length(input);
%滤波输出
if(input(i)==0)
r0=E+sigma*randn;
r1=sigma*randn;
else
r0=sigma*randn;
r1=E+sigma*randn;
%判决器
if(r0>
r1)
decis(i)=0;
%当r0>
r1时判决为'
0'
decis(i)=1;
%r0<
1'
output=decis;
%输出output
functionflag=crc_decode(r,g)%译码
[div1,rem1]=deconv(r,g);
crc_check1=mod(rem1(end-length(g)+2:
%CRC校验
ifisequal(crc_check1,zeros(1,length(crc_check1)))
flag=1;
%如果全0,则标志flag值为1,说明没错
flag=0;
function[code_err_frame,error2]=code_block_bit_error(msg_crc,EsNo,g,msg)
%计算经过编码的错误块数和错误比特数
trel=poly2trellis(3,[75]);
b=convenc(msg_crc,trel);
%卷积编码
%调制与解调
decis=mod_demod_bpsk(b,EsNo);
r_msg_crc1=vitdec(decis,trel,3,'
trunc'
hard'
%进行硬判决
flag2=crc_decode(r_msg_crc1,g);
code_err_frame=0;
%初始化经过编码后的错误块数为0
error2=0;
ifflag2==0
code_err_frame=code_err_frame+1;
%如果标志flag2为0,说明有错,则错误块数加1
error2=sum(r_msg_crc1(1:
%统计错误比特数