matlab仿真 信道编码和交织(下)
(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容,有兴趣的读者请阅读原书)
clear all
n=3;k=2;%A(3,2)循环码
N=10000;%消息比特的行数
msg=randi([0 1],N,k);%消息比特一共N*k行
pol=cyclpoly(n,k);%循环码的生成多项式
[h,g]=cyclgen(n,pol);%生成循环码
code1=encode(msg,n,k,'cyclic/binary');%循环码编码
code2=mod(msg*g,2);
noisy=randerr(N,n,[0 1;0.7 0.3]);%噪声
noisycode1=mod(code1+noisy,2);
noisycode2=mod(code2+noisy,2);%噪声叠加
newmsg1=decode(noisycode1,n,k,'cyclic');%译码
newmsg2=decode(noisycode2,n,k,'cyclic');
[number,ratio1]=biterr(newmsg1,msg);%误比特率
[number,ratio2]=biterr(newmsg2,msg);
disp(['The bit error rate1 is',num2str(ratio1)])
disp(['The bit error rate2 is',num2str(ratio2)])
循环码的产生分为两步,首先通过 cyclpoly函数形成循环码的生成多项式,再利用cyclgen函数,将生成多项式作为参数,生成循环码。
这里添加噪声之后需要异或,因为本质上循环码都是二进制的情况,添加噪声只是将0(1)变为1(0)
m=4;n=2^m-1;%码字长度
k=5;%消息长度
N=100;%消息比特行数
msg=randi([0,1],N,k);%消息比特
[genpoly,t]=bchgenpoly(n,k);%BCH码的纠错能力
code=bchenc(gf(msg),n,k);%BCH编码
noisycode=code+randerr(N,n,1:t);%每个码字加入不超过纠错能力的误码(1)
[newmsg,err,ccode]=bchdec(noisycode,n,k);%BCH译码
if ccode==code
disp('所有错误比特都被纠正')
end
if newmsg==msg
disp('译码消息与原消息相同')
end
(1)这里的纠错能力是t,也就是说当码字变化范围在t以内的时候,可以正常纠错,所以后面随机数采用的范围为1:t
clear all
m=4;
n=15;
k=11;
t=(n-k)/2;%码的纠错能力
N=1000;%信息符号的行数
msg=randi([0 2^m-1],N,k);%信息符号
msg1=gf(msg,m);
msg1=rsenc(msg1,n,k).';%15-11RS编码
msg2=de2bi(double(msg1.x),'left-msb');%转换为二进制(1)
y=bsc(msg2,0.01);%通过二进制对称信道
y=bi2de(y,'left-msb');%转换为十进制
y=reshape(y,n,N).';
dec_x=rsdec(gf(y,4),n,k);%RS解码
[err,ber]=biterr(msg,double(dec_x.x),m)%解码后的误比特率
(1)这里double中使用msg1.x而不是直接使用msg1,是因为只有在后面加上.x才能正常进行二进制的转化,最后一行的double也是相同的道理
clear all
EbN0=0:10;%SNR范围
N=1000000;%消息比特的个数
M=2;%BPSK调制
L=7;%约束长度
trel=poly2trellis(L,[171 133]);%卷积码生成多项式
tblen=6*L;%维特比译码回溯深度(1)
msg=randi([0 1],1,N);%消息比特序列
msg1=convenc(msg,trel);%卷积编码
x1=pskmod(msg1,M);%BPSK调制
for ii=1:length(EbN0)
%加入高斯白噪声,因为码率为1/2,所以每个符号的能量要比比特能量少3dB
y=awgn(x1,EbN0(ii)-3);%(2)
y1=pskdemod(y,M);%硬判决
y1=vitdec(y1,trel,tblen,'cont','hard');%维特比译码
[err,ber1(ii)]=biterr(y1(tblen+1:end),msg(1:end-tblen));%误比特率
y2=vitdec(real(y),trel,tblen,'cont','unquant');%软判决
[err,ber2(ii)]=biterr(y2(tblen+1:end),msg(1:end-tblen));%误比特率
end
ber=berawgn(EbN0,'psk',2,'nodiff');%BPSK调制理论误比特率
semilogy(EbN0,ber,'-ko',EbN0,ber1,'-k*',EbN0,ber2,'-k.');
legend('BPSK理论误比特率','硬判决误比特率','软判决误比特率')
title('卷积码性能')
xlabel('Eb/N0');ylabel('误比特率')
(1)回溯深度和约束长度的关系 (2)-3dB
参考文章链接:
http://t.csdnimg.cn/XG45Khttp://t.csdnimg.cn/XG45K
clear all
N=10000;
k=4;%编码码字消息序列长度
n=7;%编码码字长度
x=randi([0 1],N*k,1);%消息比特
code=encode(x,n,k);%(7,4)汉明编码
code1=matintrlv(code,N/10,10*n);%(N/10,10*n)矩阵交织
noise=randerr(N,n,[0:n-3;0.8 0.09 0.07 0.03 0.01]);%信道差错,包括独立差错和突发差错
noise=reshape(noise.',N*n,1);
y=bitxor(code,noise);%无交织接受信号
y=decode(y,n,k);%汉明译码
[err ber]=biterr(x,y);%统计误比特率
y1=bitxor(code1,noise);%有交织接收信号
y1=matdeintrlv(y1,N/10,10*n);%解交织
y1=decode(y1,n,k);%汉明编码
[err,ber1]=biterr(x,y1);%统计误比特率
disp('无交织时的误比特率:');
ber
disp('有交织时的误比特率:');
ber1
总结,交织器通过改变可能出错的码中各个数据的位置,从而将可能连续出现的错误分开,从而减小错误对判决的影响。