三网合一网站建设费用,重庆森林经典台词图片,黄页网站推广效果,个人网站设计背景图#xff08;内容源自详解MATLAB#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容#xff0c;有兴趣的读者请阅读原书#xff09;
clear all
N10;%信息比特的行数
n7;%hamming码组长度n2^m-1
m3;%监督位长度
[H,G]hammgen(m);%产生(n,n-…内容源自详解MATLABSIMULINK 通信系统建模与仿真 刘学勇编著第八章内容有兴趣的读者请阅读原书
clear all
N10;%信息比特的行数
n7;%hamming码组长度n2^m-1
m3;%监督位长度
[H,G]hammgen(m);%产生(n,n-m)hamming码的效验矩阵和生成矩阵
xrandi([0 1],N,n-m);%产生比特数据
ymod(x*G,2);%hamming编码
y1mod(yranderr(N,n),2);%在每个编码码组中引入一个随机比特错误
mat1eye(n);%生成n*n的单位矩阵其中每一行的1代表错误比特位置
errvecmat1*H.;%校验结果对应的所有错误矢量
y2mod(y1*H.,2);%译码
%根据译码结果对应的错误矢量找出错误比特的位置并纠错
for indx1:Nfor indx11:nif(y2(indx,:)errvec(indx1,:))y1(indx,:)mod(y1(indx,:)mat1(indx1,:),2);endend
end
x_decy1(:,m1:end);%恢复原始信息比特
sfind(x~x_dec)%纠错后的信息比特与原始信息比特对比 首先(7,4)汉明码是指7个码元中携带了4个有效信息还有三个是冗余位是用奇偶校验留下来的检错信息。
先从最简单的情况开始假设我们需要传递的信息为[0 1 0 1]
以偶校验的1,3,4位为例这三位的数据分别为0 0 1为了确保加上校验位后有偶数个1所以校验位为1后面的1 2 3位2 3 4位同理。
有了这三个校验位当四个信息位出现错误的时候我们可以根据校验位判断错误在什么地方。
可以看到1,3,4位和1,2,3位中的交集有错而2,3,4位没错所以错误只可能出现在1号位 这里我们利用三个校验位的情况成功的锁定了错误码元的所在位置。
这里没有讨论出现偶数个码元错误的情况和校验位错误的情况
现在回到代码
x是我们产生的数据其中的每一行可以称其为一组一组有4个信息码元。
y是编码后的结果我们一行一行看绿色区域是每一组的校验位红色区域是每一组的信息位红色就是x
ymod(x*G,2); 这里的代码意思是x*G得到的矩阵每个元素对2取余其实就是异或也就是我们之前在进行校验位的计算时使用的方式
G就是生成矩阵把之前的我们从4个信息位编码成7个码元的过程用矩阵乘法进行表示 红色部分就是单位矩阵用来将信息部分原封不动的传进
黄色部分就是产生校验位的部分信息码元与它进行矩阵乘法再异或后就能得到上述的校验位。 这样就解释了为什么x*G再取异或后就能实现编码过程。
接下来来看解码过程解码需要用到校验矩阵H
y2mod(y1*H.,2);%译码 可以发现由于在编码过程中的设计在乘上H’之后如果没有错误的情况下得到的矩阵中元素全都为0 现在我们假设信息码元中出现了一位错误。在解码之后得到的矩阵元素不全为0证明有错误我们需要用我们得到的 [0 ,1,1]找到错误出现的位置 总结译码的结果并不是原始数据而是表示错误情况的向量矩阵y2如果矩阵(y2)全为0 证明没有错误如果不全为0证明有错误我们通过逐行比较译码结果(y2)和所有的错误情况errvec观察每一行的译码结果与哪一行的errvec相同得到的errvec的行数就是y1中出现错误的位数
现在也可以解释为什么说errvec是校验结果对应的所有错误矢量因为errvec包含了所有含有非0元素错误的情况比对就能得到错误位数
如果译码得到的是0 0 0自然在errvec中没有对应的情况也表示y1这一行没有错误不需要修改。 clear all
N1000000; %信息比特长度
M4;%QPSK调制
n7;%汉明码编码码组长度
m3;%汉明吗监督位长度
graycode[0 1 3 2];msgrandi([0 1],N,n-m);%信息比特
msg1reshape(msg.,log2(M),N*(n-m)/log2(M)).;
msg1_debi2de(msg1,left-msb);%信息比特转化为10进制(1)
msg1graycode(msg1_de1);%格雷编码
msg1pskmod(msg1,M);%qpsk调制
Eb1norm(msg1).^2/(N*(n-m));%计算比特能量
msg2encode(msg,n,n-m);%汉明编码(2)
msg2reshape(msg2.,log2(M),N*n/log2(M)).;
msg2bi2de(msg2,left-msb);
msg2graycode(msg21);%汉明编码后的比特序列转化为十进制形式
msg2pskmod(msg2,M);%汉明码数据进行qpsk调制
Eb2norm(msg2).^2/(N*(n-m));%计算比特能量
EbNo0:10;%信噪比
EbNo_lin10.^(EbNo/10);%信噪比的线性值
for indx1:length(EbNo_lin)sigma1sqrt(Eb1/(2*EbNo_lin(indx)));%未编码的噪声标准差rx1msg1sigma1*(randn(1,length(msg1))j*randn(1,length(msg1)));%加入高斯白噪声y1pskdemod(rx1,M);%未编码QPSK解调y1_degraycode(y11);%未编码的格雷逆映射[err ber1(indx)]biterr(msg1_de.,y1_de,log2(M));%未编码的误比特率sigma2sqrt(Eb2/(2*EbNo_lin(indx)));%编码的噪声标准差rx2msg2sigma2*(randn(1,length(msg2))j*randn(1,length(msg2)));%加入高斯白噪声y2pskdemod(rx2,M);%编码qpsk解调y2graycode(y21);%编码格雷逆映射y2de2bi(y2,left-msb);%转换为二进制形式y2reshape(y2.,n,N).;y2decode(y2,n,n-m);%译码[err ber2(indx)]biterr(msg,y2);%编码的误比特率endsemilogy(EbNo,ber1,-ko,EbNo,ber2,-k*);legend(未编码,Hamming(7,4)编码)title(未编码和hamming(7,4)编码的QPSK在AWGN下的性能)xlabel(Eb/N0);ylabel(误比特率) (1)这里的转化为10进制是为了将二进制的信号转化为0-3的4进制情况这样就可以进行格雷编码进而qpsk调制 2 encode和decode编译码本质上就是例8.1中的过程这里使用现成的函数可以直接实现编译码