信道编码
实验人: 学号:07302443
一、实验目的
1、 加深对信道编码的理解,了解信道编码的作用
2、 进一步掌握基带信号检测和判决和最佳判决理论
3、 熟悉至少一种信道编码的编码及译码过程,分析信道编码后的误码率的变化
4、 掌握信噪比和误码率之间的关系和相互影响
5、 学习使用MATLAB ,C/C++等进行实验仿真
二、实验要求
1、用MA TLAB, ,C/C++等语言在计算机进行通信系统模拟。
2、提交完整源程序以及结果图,并要求结合课堂知识根据结果推出结论(每个设计报告10
页以上)。
3、不得抄袭。
三、实验内容
第一部分:利用线性分组码或卷积码进行信道编码
仿真条件:
1 信道输入:s(t), s(t)可以取为MPSK 信号
2 考虑常数AWGN 信道
3 噪声设为n(t)
4 信道输出为 y(t)=ks(t)+n(t)
仿真要求:
1 利用线性分组码或者卷积码进行信道编码
2 画出SER VS SNR的结果图,SNR 取0-25dB
第二部分:设计交织+纠错结合的信道编码
仿真条件:
1 信道输入信号s(t);s(t)可以取为MPSK 信号,s(t)的抽样速率为10kb/s.
2 考虑理想化衰落信道,如图1所示
3 噪声设为n(t)
4 信道输出为 y(t)=k(t)*s(t)+n(t)
仿真要求:
1 设计交织+纠错结合的信道编码。
2 画出SER VS SNR的结果图,SNR 取0-25dB
3 比较有无交织在SNR 变化情况下的结果。
4 改变衰落时间t 的值,取t=2ms, t=5ms,观察并画出结果。
图一 理想化衰落信道示意图
四、实验原理
第一部分:线性分组码
线性分组码是一类奇偶校验码,它可以由前面提到的(n ,k )形式表示。编码器将一个k 比特的信息分组(信息矢量)转变成一个更长的由给定元素符号集组成的n
比特编码分组(编码矢量)。
汉明(7,4)码是一种线性分组码,使用生成矩阵实现从信息矢量到编码矢量的转换,采用监督矩阵和伴随式的检测实现解码和检错纠错。
第二部分:卷积编码
卷积码由3个整数n , k , K 描述,这里k/n也表示分组码的编码效率(每编码比特所含的信息);K 是约束长度,表示在编码移位寄存器中k 元组的级数。卷积码的编码器有记忆性,卷积编码过程产生的n 元组,不仅是输入k 元组的函数,也是前面K-1个输入k 元组的函数。原理如图所示:
第三部分:交织编码
大多数分组码和卷积码都可以抵抗随机独立错误,对于有记忆信道,错误不再是比特间相互独立的随机分布的比特错误,这使得编码的差错性能下降。交织编码就是为解决此类为此而被研究出来。
在传输之前对编码信息进行交织,接收后解交织,这使得信道的突发错误在时间上得以扩展,从而使得译码器可以将它们当做随机错误处理,随着时间的分离,信道记忆性也会降低。当交织深度足够大时,就可以在时间上分离码元将一个有记忆信道转变为无记忆信道。
五、实验结果
第一部分:线性分组码的性能
首先,由第一次实验仿真得到基带传输系统的误码率曲线。在此部分,改进原实验,增加线性分组码的编码解码过程,观察增加信道编码后数字传输系统的性能变化。
图三为BPSK 在基带传输系统的误码率性能曲线。
双极性二符号信源误码率曲线10
1010
误码率B E R /(b i t /s y m b o l ) 10101010信噪比SNR/(dB)
图三 BPSK 基带传输误码率性能(无信道编码)
截下来,对信源信息传送前进行信道编码,采用线性汉明(7,4)码,能够纠正一比特的错误,仿真程序如下:
%*********************************************************
%实验采用BPSK 信号作为信源,仿真采用{-1,1}等概率分布
%信道编码采用线性分组码,仿真采用汉明(7,4)码
%**********************************************************
clear;
N=1000000;
M=(7*N)/4;
SNR=0:1:20;
BER=zeros(1,21);
%产生并调整信源样本数量 src 是信源输出序列,
src=randsrc(1,N,[0 1;0.5 0.5]);
if (rem(length(src),4)~=0)
src=[src,zeros(1,4-rem(length(src),4))];
end
%汉明(7,4)码的生成矩阵G
G=[1 0 0 0 1 1 1;
0 1 0 0 1 1 0;
0 0 1 0 1 0 1;
0 0 0 1 0 1 1];
%汉明(7,4)码的监督矩阵H
H=[1 1 1 0 1 0 0;
1 1 0 1 0 1 0;
1 0 1 1 0 0 1];
%H转置后为后面检测使用
h=H';
%错码位置和S[S1 S2 S3]的关系对应
A0=[0 0 1]; %错a0位
A1=[0 1 0]; %错a1位
A2=[1 0 0]; %错a2位
A3=[0 1 1]; %错a3位
A4=[1 0 1]; %错a4位
A5=[1 1 0]; %错a5位
A6=[1 1 1]; %错a6位
%利用生成矩阵每四个信源符号编码成七符号
n=length(src)/4; %src中以四个为一组的分组数目
SRC=zeros(1,n*7); %编码后矩阵
for j=1:1:n
tmp1=[src(4*j-3) src(4*j-2) src(4*j-1) src(4*j)];
tmp2=mod(tmp1*G,2);
SRC(round(7*j-6):round(7*j))=tmp2;
end
%采用双极性,则src 为{0 1},需要发送为{-1 1}
for j=1:1:M
if SRC(1,j)==0
SRC(1,j)=-1;
end
end
%实际信道传送的信号来自SRC ,和src 相比,信噪比不变
for j=1:21
sum=0;
result=zeros(1,N);
snr=SNR(1,j);
noise=randn(1,M);
a=sqrt(10^(snr/10));
b=0;
y=a.*SRC+noise;
for i=1:1:M
if y(1,i)
y(1,i)=0;
else y(1,i)=1;
end
end
%对判决后的y{0 1},进行(7,4)解码和纠错
for i=1:1:n
tmp3=y(round(7*i-6):round(7*i));
S=mod(tmp3*h,2);
if all(all(S==0))==1
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A0)==0))==1
y(1,round(7*i))=not(y(1,round(7*i)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A1)==0))==1
y(1,round(7*i-1))=not(y(1,round(7*i-1)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A2)==0))==1
y(1,round(7*i-2))=not(y(1,round(7*i-2)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A3)==0))==1
y(1,round(7*i-3))=not(y(1,round(7*i-3)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A4)==0))==1
y(1,round(7*i-4))=not(y(1,round(7*i-4)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A5)==0))==1
y(1,round(7*i-5))=not(y(1,round(7*i-5)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A6)==0))==1
y(1,round(7*i-6))=not(y(1,round(7*i-6)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
end
end
end
end
end
end
end
end
end
for i=1:1:N
if result(1,i)~=src(1,i)
sum=sum+1;
end
end
BER(1,j)=sum/N; %计算误码率
end
semilogy(SNR,BER,'-*g') %画误码率曲线
grid on; %图形控制语句
title('BPSK线性分组(7,4)编码误码率曲线')
xlabel('信噪比SNR/(dB)')
ylabel('误码率BER/(bit/symbol)')
仿真得到的曲线作对比后,如图四
10BPSK 线性分组(7,4)编码误码率性能
10误码率B E R /(b i t /s y m b o l ) 1010101010信噪比SNR/(dB)
图四 汉明(7,4)信道编码误码率性能比较
小结:从图中随对比可知,经过信道编码,使得BPSK 在的误码率性能得到了优化,尤其是到了8dB 后,误码率性能得到很大的提升,10-4对应的信噪比下降3dB 左右。同时可以发现在低信噪比时,分组码的效果是不明显的,这是由于汉明74编码的编码效率为4/7,发送的信息序列变长,在相同功率下导致每个比特的功率下降,信息受污染的可能增加,同时,增长的码序列也导致信息速率的下降,非信息位的存在降低了频带的使用率。说明分组码用带宽和时间来换取误码率性能的提高。
第二部分:衰落信道
在衰落信道,产生连串比特的错误,此时,线性分组码或卷积编码信道编码的性能下降,因为它们不能纠错连续的比特错误。下面的仿真程序是BPSK 信号经线性分组码编码后在衰落信道的误码率性能,其中衰落信道是理想的衰落信道,每10ms 为一个一周期,有1ms 时间的深衰落。当前比特率为10kbps ,故连续误码可达10个或以上。
图五为深衰落信道汉明74码的误码率性能。
%*************************************************************
%采用汉明(7,4)分组码在衰落信道传输,无交织编码,衰落时长1ms
%实验采用BPSK 信号作为信源,码速率10kbps 仿真采用{-1,1}等概率分布
%*************************************************************
clear;
N=1000000;
M=(7*N)/4;
SNR=[0:1:20];
BER=zeros(1,21);
%产生并调整信源样本数量
src=randsrc(1,N,[0 1;0.5 0.5]);
if (rem(length(src),4)~=0)
src=[src,zeros(1,4-rem(length(src),4))];
end
%汉明(7,4)码的生成矩阵G
G=[1 0 0 0 1 1 1;
0 1 0 0 1 1 0;
0 0 1 0 1 0 1;
0 0 0 1 0 1 1];
%汉明(7,4)码的监督矩阵H
H=[1 1 1 0 1 0 0;
1 1 0 1 0 1 0;
1 0 1 1 0 0 1];
%H转置后为后面检测使用
h=H';
%衰落信道特征定义
fade=ones(1,100);
fade(1,91:100)=0.1;
K=round(M/100);
fadeall=repmat(fade,1,K);
%错码位置和S[S1 S2 S3]的关系对应
A0=[0 0 1]; %错a0位
A1=[0 1 0]; %错a1位
A2=[1 0 0]; %错a2位
A3=[0 1 1]; %错a3位
A4=[1 0 1]; %错a4位
A5=[1 1 0]; %错a5位
A6=[1 1 1]; %错a6位
%利用生成矩阵每四个信源符号编码成七符号
n=length(src)/4; %src中以四个为一组的分组数目
SRC=zeros(1,n*7); %编码后矩阵
for j=1:1:n
tmp1=[src(4*j-3) src(4*j-2) src(4*j-1) src(4*j)];
tmp2=mod(tmp1*G,2);
SRC(round(7*j-6):round(7*j))=tmp2;
end
%采用双极性,则src 为{0 1},需要发送为{-1 1}
for j=1:1:M
if SRC(1,j)==0
SRC(1,j)=-1;
end
end
%实际信道传送的信号来自SRC ,和src 相比,信噪比不变
for j=1:1:21
sum=0;
result=zeros(1,N);
snr=SNR(1,j);
noise=randn(1,M);
a=sqrt(10^(snr/10));
b=0;
y=(a*fadeall).*SRC+noise;
%对接收信号y 进行判决
for i=1:1:M
if y(1,i)
y(1,i)=0;
else y(1,i)=1;
end
end
%对判决后的y{0 1},进行(7,4)解码和纠错
for i=1:1:n
tmp3=y(round(7*i-6):round(7*i));
S=mod(tmp3*h,2);
if all(all(S==0))==1
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A0)==0))==1
y(1,round(7*i))=not(y(1,round(7*i)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A1)==0))==1
y(1,round(7*i-1))=not(y(1,round(7*i-1)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A2)==0))==1
y(1,round(7*i-2))=not(y(1,round(7*i-2)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A3)==0))==1
y(1,round(7*i-3))=not(y(1,round(7*i-3)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A4)==0))==1
y(1,round(7*i-4))=not(y(1,round(7*i-4)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A5)==0))==1
y(1,round(7*i-5))=not(y(1,round(7*i-5)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A6)==0))==1
y(1,round(7*i-6))=not(y(1,round(7*i-6))); result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
end
end
end
end
end
end
end
end
end
for i=1:1:N
if result(1,i)~=src(1,i)
sum=sum+1;
end
end
BER(1,j)=sum/N; %计算误码率
end
semilogy(SNR,BER,'-*g') %画误码率曲线
grid on; %图形控制语句
title('衰落信道BPSK 误码率曲线')
xlabel('信噪比SNR/(dB)')
ylabel('误码率BER/(bit/symbol)')
此仿真程序得到线性分组码在衰落信道的误码率特性曲线,如图五所示:
衰落信道BPSK (汉明编码无交织)误码率曲线
10误码率B E R /(b i t /s y m b o l ) 10101010信噪比SNR/(dB)
图五 深衰落信道汉明编码误码率性能(1ms 衰落时长)
小结:通过第一部分的实验结果,线性分组码在衰落信道的误码率性能明显低于在高斯噪声信道的性能。这说明在衰落信道,产生大量连续比特的误码,超出了分组码的的检错纠错能力范围。接下来,使用交织编码来改善误码率性能。
仿真程序和上程序类似,在进入信道传输之前以及分组码解码前分别加入了交织和解交织的过程。程序如下:
%*************************************************************
%采用汉明(7,4)分组码在衰落信道传输, 采用交织编码抵抗深衰落
%实验采用BPSK 信号作为信源,仿真采用{-1,1}等概率分布
%*************************************************************
clear;
N=1000000;
M=(7*N)/4;
SNR=[0:1:25];
BER=zeros(1,26);
%产生并调整信源样本数量
src=randsrc(1,N,[0 1;0.5 0.5]);
if (rem(length(src),4)~=0)
src=[src,zeros(1,4-rem(length(src),4))];
end
%汉明(7,4)码的生成矩阵G
G=[1 0 0 0 1 1 1;
0 1 0 0 1 1 0;
0 0 1 0 1 0 1;
0 0 0 1 0 1 1];
%汉明(7,4)码的监督矩阵H
H=[1 1 1 0 1 0 0;
1 1 0 1 0 1 0;
1 0 1 1 0 0 1];
%H转置后为后面检测使用
h=H';
%衰落信道特征定义 fade=ones(1,100); fade(1,91:100)=0.1; K=round(M/100);
fadeall=repmat(fade,1,K); %衰落系数 %错码位置和S[S1 S2 S3]的关系对应 A0=[0 0 1]; %错a0位 A1=[0 1 0]; %错a1位 A2=[1 0 0]; %错a2位 A3=[0 1 1]; %错a3位 A4=[1 0 1]; %错a4位 A5=[1 1 0]; %错a5位 A6=[1 1 1]; %错a6位
%利用生成矩阵每四个信源符号编码成七符号
n=length(src)/4; %src中以四个为一组的分组数目 SRC=zeros(1,n*7); %74编码后矩阵 for j=1:1:n
tmp1=[src(4*j-3) src(4*j-2) src(4*j-1) src(4*j)]; tmp2=mod(tmp1*G,2);
SRC(round(7*j-6):round(7*j))=tmp2; end
%发送前进行交织编码,编码器80x7 Q=round(M/560);
send=zeros(1,M); %交织后的矩阵
Y=zeros(1,M); %解交织后得到的矩阵 for k=1:1:Q %交织编码过程 temp1=SRC(560*(k-1)+1:560*k); temp2=(reshape(temp1,7,80))'; temp3=reshape(temp2,1,560); send(560*(k-1)+1:560*k)=temp3; end
%采用双极性,则src 为{0 1},需要发送为{-1 1} for j=1:1:M
if send(1,j)==0 send(1,j)=-1; end end
%实际信道传送的信号来自send ,和src 相比,信噪比不变 for j=1:1:26 sum=0;
result=zeros(1,N); snr=SNR(1,j);
noise=randn(1,M);
a=sqrt(10^(snr/10)); b=0;
y=(a*fadeall).*send+noise; %对接收信号y 进行判决 for i=1:1:M if y(1,i)
%对判决后的y{0 1},先进行解交织,然后进行汉明(7,4)解码和纠错 for k=1:1:Q %解交织过程 temp4=y(560*(k-1)+1:560*k); temp5=(reshape(temp4,80,7))'; temp6=reshape(temp5,1,560); Y(560*(k-1)+1:560*k)=temp6; end
for i=1:1:n %检错纠错过程 tmp3=Y(round(7*i-6):round(7*i)); S=mod(tmp3*h,2); if all(all(S==0))==1
result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A0)==0))==1
Y(1,round(7*i))=not(Y(1,round(7*i))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A1)==0))==1
Y(1,round(7*i-1))=not(Y(1,round(7*i-1))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A2)==0))==1
Y(1,round(7*i-2))=not(Y(1,round(7*i-2))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A3)==0))==1
Y(1,round(7*i-3))=not(Y(1,round(7*i-3))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A4)==0))==1
Y(1,round(7*i-4))=not(Y(1,round(7*i-4))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A5)==0))==1
Y(1,round(7*i-5))=not(Y(1,round(7*i-5))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A6)==0))==1
Y(1,round(7*i-6))=not(Y(1,round(7*i-6))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3));
end end end end end end end end end
for i=1:1:N %统计错误个数 if result(1,i)~=src(1,i) sum=sum+1; end end
BER(1,j)=sum/N; %计算误码率 end
semilogy(SNR,BER,'-*g') %画误码率曲线 grid on; %图形控制语句
title('衰落信道(1ms )BPSK (交织深度80)误码率曲线') xlabel('信噪比SNR/(dB)')
ylabel('误码率BER/(bit/symbol)') 仿真程序得到加入交织编码后的误码率性能曲线,如图六
10
衰落信道(1ms )BPSK (交织深度80)误码率曲线
10
误码率B E R /(b i t /s y m b o l )
10
10
10信噪比SNR/(dB)
图六 交织编码对误码率的作用
小结:对比可知,在衰落信道中采用交织编码可以提高误码率性能,有效抵抗衰落信道的连续比特错误。可以看到,在交织深度为80,衰落时长1ms 的情况下,误码率曲线的确有优化,但是交织深度80还不是最佳的,它需要确切地考虑衰落信道的特征,记忆长度等
因素,在这里,我没有找到最佳的交织深度,但足以说明交织编码在衰落信道中的作用。另外,对于同一个信道,不一定是交织深度越深越好,过大的交织深度将导致额外的延时,是一种牺牲增加延时来换取误码率的方法。 当衰落时长分别为2ms ,5ms 时,仿真得到的误码率曲线对比,交织深度仍为80。具体如图七所示:
10
衰落信道BPSK(交织深度80) 误码率曲线
10
误码率B E R /(b i t /s y m b o l )
10
10
10信噪比SNR/(dB)
图七 不同衰落时长误码率性能比较
小结:随着衰落时长的增加,连续比特错误的可能和长度随之增加,图中可见,交织深度80的交织编码对5ms 时的信道改善作用不明显,需要重新审查,确定较优的交织深度将连串的比特错误交织成可视作独立的错误。
10
衰落信道BPSK (交织深度16649)误码率曲线
10
误码率B E R /(b i t /s y m b o l )
10
10
10信噪比SNR/(dB)
图八 交织深度16649编码性能
图八反映的是交织深度为16649的编码性能,可以看到,它反映的规律和交织深度为80的时候相似,可以肯定的一点是,80和16649这两个深度都不是最优的,最优的选择办法除了经验成分外,严谨的数学方法也是必须的条件之一。 到此,粗略地对分组码以及衰落信道的交织编码的实现。
六、实验总结
结论篇
1、 信道编码可以改善信道传输的误码率性能。本实验仿真采用的为线性分组码中的一种,
汉明(7,4)码。
2、 线性分组码增加了冗余比特,增加了检错纠错能力的同时,降低了带宽的使用率,降低
了有用信息的传输速率。
3、 分组码的查错纠错能力是有限的,在错误独立分布的高斯噪声信道,能有效发挥作用,
在连续比特错误的衰落信道,仅靠分组码难以改善误码率性能。
4、 交织编码和信道编码相结合的方法可以改善在衰落信道的传输性能,改善的效果和交织
深度有关,交织深度的取值和信道的衰落特性等多方面因素相关。关于取值的方法本人尚未掌握。
5、 交织编码可以使连续的比特错误在时间上分离,是一种时间分集方法。
心得篇
1、 通过仿真实验,加深了对信道编码部分的理解和掌握,动手实现了线性分组码以及交织
编码的仿真实验,但卷积码、LDPC 等的编码解码的实现还存在一些问题。
2、 调试交织编码部分花费了大量时间,对工具的使用欠熟练,对理论的掌握还不够熟练。 3、 仿真实验涉及大量的计算,良好的程序设计可以避免过高计算复杂度,体验到了以增加
空间复杂的换去时间复杂度下降的实例。
4、 深究通信系统会发现其需要很扎实的理论基础。
信道编码
实验人: 学号:07302443
一、实验目的
1、 加深对信道编码的理解,了解信道编码的作用
2、 进一步掌握基带信号检测和判决和最佳判决理论
3、 熟悉至少一种信道编码的编码及译码过程,分析信道编码后的误码率的变化
4、 掌握信噪比和误码率之间的关系和相互影响
5、 学习使用MATLAB ,C/C++等进行实验仿真
二、实验要求
1、用MA TLAB, ,C/C++等语言在计算机进行通信系统模拟。
2、提交完整源程序以及结果图,并要求结合课堂知识根据结果推出结论(每个设计报告10
页以上)。
3、不得抄袭。
三、实验内容
第一部分:利用线性分组码或卷积码进行信道编码
仿真条件:
1 信道输入:s(t), s(t)可以取为MPSK 信号
2 考虑常数AWGN 信道
3 噪声设为n(t)
4 信道输出为 y(t)=ks(t)+n(t)
仿真要求:
1 利用线性分组码或者卷积码进行信道编码
2 画出SER VS SNR的结果图,SNR 取0-25dB
第二部分:设计交织+纠错结合的信道编码
仿真条件:
1 信道输入信号s(t);s(t)可以取为MPSK 信号,s(t)的抽样速率为10kb/s.
2 考虑理想化衰落信道,如图1所示
3 噪声设为n(t)
4 信道输出为 y(t)=k(t)*s(t)+n(t)
仿真要求:
1 设计交织+纠错结合的信道编码。
2 画出SER VS SNR的结果图,SNR 取0-25dB
3 比较有无交织在SNR 变化情况下的结果。
4 改变衰落时间t 的值,取t=2ms, t=5ms,观察并画出结果。
图一 理想化衰落信道示意图
四、实验原理
第一部分:线性分组码
线性分组码是一类奇偶校验码,它可以由前面提到的(n ,k )形式表示。编码器将一个k 比特的信息分组(信息矢量)转变成一个更长的由给定元素符号集组成的n
比特编码分组(编码矢量)。
汉明(7,4)码是一种线性分组码,使用生成矩阵实现从信息矢量到编码矢量的转换,采用监督矩阵和伴随式的检测实现解码和检错纠错。
第二部分:卷积编码
卷积码由3个整数n , k , K 描述,这里k/n也表示分组码的编码效率(每编码比特所含的信息);K 是约束长度,表示在编码移位寄存器中k 元组的级数。卷积码的编码器有记忆性,卷积编码过程产生的n 元组,不仅是输入k 元组的函数,也是前面K-1个输入k 元组的函数。原理如图所示:
第三部分:交织编码
大多数分组码和卷积码都可以抵抗随机独立错误,对于有记忆信道,错误不再是比特间相互独立的随机分布的比特错误,这使得编码的差错性能下降。交织编码就是为解决此类为此而被研究出来。
在传输之前对编码信息进行交织,接收后解交织,这使得信道的突发错误在时间上得以扩展,从而使得译码器可以将它们当做随机错误处理,随着时间的分离,信道记忆性也会降低。当交织深度足够大时,就可以在时间上分离码元将一个有记忆信道转变为无记忆信道。
五、实验结果
第一部分:线性分组码的性能
首先,由第一次实验仿真得到基带传输系统的误码率曲线。在此部分,改进原实验,增加线性分组码的编码解码过程,观察增加信道编码后数字传输系统的性能变化。
图三为BPSK 在基带传输系统的误码率性能曲线。
双极性二符号信源误码率曲线10
1010
误码率B E R /(b i t /s y m b o l ) 10101010信噪比SNR/(dB)
图三 BPSK 基带传输误码率性能(无信道编码)
截下来,对信源信息传送前进行信道编码,采用线性汉明(7,4)码,能够纠正一比特的错误,仿真程序如下:
%*********************************************************
%实验采用BPSK 信号作为信源,仿真采用{-1,1}等概率分布
%信道编码采用线性分组码,仿真采用汉明(7,4)码
%**********************************************************
clear;
N=1000000;
M=(7*N)/4;
SNR=0:1:20;
BER=zeros(1,21);
%产生并调整信源样本数量 src 是信源输出序列,
src=randsrc(1,N,[0 1;0.5 0.5]);
if (rem(length(src),4)~=0)
src=[src,zeros(1,4-rem(length(src),4))];
end
%汉明(7,4)码的生成矩阵G
G=[1 0 0 0 1 1 1;
0 1 0 0 1 1 0;
0 0 1 0 1 0 1;
0 0 0 1 0 1 1];
%汉明(7,4)码的监督矩阵H
H=[1 1 1 0 1 0 0;
1 1 0 1 0 1 0;
1 0 1 1 0 0 1];
%H转置后为后面检测使用
h=H';
%错码位置和S[S1 S2 S3]的关系对应
A0=[0 0 1]; %错a0位
A1=[0 1 0]; %错a1位
A2=[1 0 0]; %错a2位
A3=[0 1 1]; %错a3位
A4=[1 0 1]; %错a4位
A5=[1 1 0]; %错a5位
A6=[1 1 1]; %错a6位
%利用生成矩阵每四个信源符号编码成七符号
n=length(src)/4; %src中以四个为一组的分组数目
SRC=zeros(1,n*7); %编码后矩阵
for j=1:1:n
tmp1=[src(4*j-3) src(4*j-2) src(4*j-1) src(4*j)];
tmp2=mod(tmp1*G,2);
SRC(round(7*j-6):round(7*j))=tmp2;
end
%采用双极性,则src 为{0 1},需要发送为{-1 1}
for j=1:1:M
if SRC(1,j)==0
SRC(1,j)=-1;
end
end
%实际信道传送的信号来自SRC ,和src 相比,信噪比不变
for j=1:21
sum=0;
result=zeros(1,N);
snr=SNR(1,j);
noise=randn(1,M);
a=sqrt(10^(snr/10));
b=0;
y=a.*SRC+noise;
for i=1:1:M
if y(1,i)
y(1,i)=0;
else y(1,i)=1;
end
end
%对判决后的y{0 1},进行(7,4)解码和纠错
for i=1:1:n
tmp3=y(round(7*i-6):round(7*i));
S=mod(tmp3*h,2);
if all(all(S==0))==1
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A0)==0))==1
y(1,round(7*i))=not(y(1,round(7*i)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A1)==0))==1
y(1,round(7*i-1))=not(y(1,round(7*i-1)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A2)==0))==1
y(1,round(7*i-2))=not(y(1,round(7*i-2)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A3)==0))==1
y(1,round(7*i-3))=not(y(1,round(7*i-3)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A4)==0))==1
y(1,round(7*i-4))=not(y(1,round(7*i-4)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A5)==0))==1
y(1,round(7*i-5))=not(y(1,round(7*i-5)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A6)==0))==1
y(1,round(7*i-6))=not(y(1,round(7*i-6)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
end
end
end
end
end
end
end
end
end
for i=1:1:N
if result(1,i)~=src(1,i)
sum=sum+1;
end
end
BER(1,j)=sum/N; %计算误码率
end
semilogy(SNR,BER,'-*g') %画误码率曲线
grid on; %图形控制语句
title('BPSK线性分组(7,4)编码误码率曲线')
xlabel('信噪比SNR/(dB)')
ylabel('误码率BER/(bit/symbol)')
仿真得到的曲线作对比后,如图四
10BPSK 线性分组(7,4)编码误码率性能
10误码率B E R /(b i t /s y m b o l ) 1010101010信噪比SNR/(dB)
图四 汉明(7,4)信道编码误码率性能比较
小结:从图中随对比可知,经过信道编码,使得BPSK 在的误码率性能得到了优化,尤其是到了8dB 后,误码率性能得到很大的提升,10-4对应的信噪比下降3dB 左右。同时可以发现在低信噪比时,分组码的效果是不明显的,这是由于汉明74编码的编码效率为4/7,发送的信息序列变长,在相同功率下导致每个比特的功率下降,信息受污染的可能增加,同时,增长的码序列也导致信息速率的下降,非信息位的存在降低了频带的使用率。说明分组码用带宽和时间来换取误码率性能的提高。
第二部分:衰落信道
在衰落信道,产生连串比特的错误,此时,线性分组码或卷积编码信道编码的性能下降,因为它们不能纠错连续的比特错误。下面的仿真程序是BPSK 信号经线性分组码编码后在衰落信道的误码率性能,其中衰落信道是理想的衰落信道,每10ms 为一个一周期,有1ms 时间的深衰落。当前比特率为10kbps ,故连续误码可达10个或以上。
图五为深衰落信道汉明74码的误码率性能。
%*************************************************************
%采用汉明(7,4)分组码在衰落信道传输,无交织编码,衰落时长1ms
%实验采用BPSK 信号作为信源,码速率10kbps 仿真采用{-1,1}等概率分布
%*************************************************************
clear;
N=1000000;
M=(7*N)/4;
SNR=[0:1:20];
BER=zeros(1,21);
%产生并调整信源样本数量
src=randsrc(1,N,[0 1;0.5 0.5]);
if (rem(length(src),4)~=0)
src=[src,zeros(1,4-rem(length(src),4))];
end
%汉明(7,4)码的生成矩阵G
G=[1 0 0 0 1 1 1;
0 1 0 0 1 1 0;
0 0 1 0 1 0 1;
0 0 0 1 0 1 1];
%汉明(7,4)码的监督矩阵H
H=[1 1 1 0 1 0 0;
1 1 0 1 0 1 0;
1 0 1 1 0 0 1];
%H转置后为后面检测使用
h=H';
%衰落信道特征定义
fade=ones(1,100);
fade(1,91:100)=0.1;
K=round(M/100);
fadeall=repmat(fade,1,K);
%错码位置和S[S1 S2 S3]的关系对应
A0=[0 0 1]; %错a0位
A1=[0 1 0]; %错a1位
A2=[1 0 0]; %错a2位
A3=[0 1 1]; %错a3位
A4=[1 0 1]; %错a4位
A5=[1 1 0]; %错a5位
A6=[1 1 1]; %错a6位
%利用生成矩阵每四个信源符号编码成七符号
n=length(src)/4; %src中以四个为一组的分组数目
SRC=zeros(1,n*7); %编码后矩阵
for j=1:1:n
tmp1=[src(4*j-3) src(4*j-2) src(4*j-1) src(4*j)];
tmp2=mod(tmp1*G,2);
SRC(round(7*j-6):round(7*j))=tmp2;
end
%采用双极性,则src 为{0 1},需要发送为{-1 1}
for j=1:1:M
if SRC(1,j)==0
SRC(1,j)=-1;
end
end
%实际信道传送的信号来自SRC ,和src 相比,信噪比不变
for j=1:1:21
sum=0;
result=zeros(1,N);
snr=SNR(1,j);
noise=randn(1,M);
a=sqrt(10^(snr/10));
b=0;
y=(a*fadeall).*SRC+noise;
%对接收信号y 进行判决
for i=1:1:M
if y(1,i)
y(1,i)=0;
else y(1,i)=1;
end
end
%对判决后的y{0 1},进行(7,4)解码和纠错
for i=1:1:n
tmp3=y(round(7*i-6):round(7*i));
S=mod(tmp3*h,2);
if all(all(S==0))==1
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A0)==0))==1
y(1,round(7*i))=not(y(1,round(7*i)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A1)==0))==1
y(1,round(7*i-1))=not(y(1,round(7*i-1)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A2)==0))==1
y(1,round(7*i-2))=not(y(1,round(7*i-2)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A3)==0))==1
y(1,round(7*i-3))=not(y(1,round(7*i-3)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A4)==0))==1
y(1,round(7*i-4))=not(y(1,round(7*i-4)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A5)==0))==1
y(1,round(7*i-5))=not(y(1,round(7*i-5)));
result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
else if all(all((S-A6)==0))==1
y(1,round(7*i-6))=not(y(1,round(7*i-6))); result((4*i-3):(4*i))=y((7*i-6):(7*i-3));
end
end
end
end
end
end
end
end
end
for i=1:1:N
if result(1,i)~=src(1,i)
sum=sum+1;
end
end
BER(1,j)=sum/N; %计算误码率
end
semilogy(SNR,BER,'-*g') %画误码率曲线
grid on; %图形控制语句
title('衰落信道BPSK 误码率曲线')
xlabel('信噪比SNR/(dB)')
ylabel('误码率BER/(bit/symbol)')
此仿真程序得到线性分组码在衰落信道的误码率特性曲线,如图五所示:
衰落信道BPSK (汉明编码无交织)误码率曲线
10误码率B E R /(b i t /s y m b o l ) 10101010信噪比SNR/(dB)
图五 深衰落信道汉明编码误码率性能(1ms 衰落时长)
小结:通过第一部分的实验结果,线性分组码在衰落信道的误码率性能明显低于在高斯噪声信道的性能。这说明在衰落信道,产生大量连续比特的误码,超出了分组码的的检错纠错能力范围。接下来,使用交织编码来改善误码率性能。
仿真程序和上程序类似,在进入信道传输之前以及分组码解码前分别加入了交织和解交织的过程。程序如下:
%*************************************************************
%采用汉明(7,4)分组码在衰落信道传输, 采用交织编码抵抗深衰落
%实验采用BPSK 信号作为信源,仿真采用{-1,1}等概率分布
%*************************************************************
clear;
N=1000000;
M=(7*N)/4;
SNR=[0:1:25];
BER=zeros(1,26);
%产生并调整信源样本数量
src=randsrc(1,N,[0 1;0.5 0.5]);
if (rem(length(src),4)~=0)
src=[src,zeros(1,4-rem(length(src),4))];
end
%汉明(7,4)码的生成矩阵G
G=[1 0 0 0 1 1 1;
0 1 0 0 1 1 0;
0 0 1 0 1 0 1;
0 0 0 1 0 1 1];
%汉明(7,4)码的监督矩阵H
H=[1 1 1 0 1 0 0;
1 1 0 1 0 1 0;
1 0 1 1 0 0 1];
%H转置后为后面检测使用
h=H';
%衰落信道特征定义 fade=ones(1,100); fade(1,91:100)=0.1; K=round(M/100);
fadeall=repmat(fade,1,K); %衰落系数 %错码位置和S[S1 S2 S3]的关系对应 A0=[0 0 1]; %错a0位 A1=[0 1 0]; %错a1位 A2=[1 0 0]; %错a2位 A3=[0 1 1]; %错a3位 A4=[1 0 1]; %错a4位 A5=[1 1 0]; %错a5位 A6=[1 1 1]; %错a6位
%利用生成矩阵每四个信源符号编码成七符号
n=length(src)/4; %src中以四个为一组的分组数目 SRC=zeros(1,n*7); %74编码后矩阵 for j=1:1:n
tmp1=[src(4*j-3) src(4*j-2) src(4*j-1) src(4*j)]; tmp2=mod(tmp1*G,2);
SRC(round(7*j-6):round(7*j))=tmp2; end
%发送前进行交织编码,编码器80x7 Q=round(M/560);
send=zeros(1,M); %交织后的矩阵
Y=zeros(1,M); %解交织后得到的矩阵 for k=1:1:Q %交织编码过程 temp1=SRC(560*(k-1)+1:560*k); temp2=(reshape(temp1,7,80))'; temp3=reshape(temp2,1,560); send(560*(k-1)+1:560*k)=temp3; end
%采用双极性,则src 为{0 1},需要发送为{-1 1} for j=1:1:M
if send(1,j)==0 send(1,j)=-1; end end
%实际信道传送的信号来自send ,和src 相比,信噪比不变 for j=1:1:26 sum=0;
result=zeros(1,N); snr=SNR(1,j);
noise=randn(1,M);
a=sqrt(10^(snr/10)); b=0;
y=(a*fadeall).*send+noise; %对接收信号y 进行判决 for i=1:1:M if y(1,i)
%对判决后的y{0 1},先进行解交织,然后进行汉明(7,4)解码和纠错 for k=1:1:Q %解交织过程 temp4=y(560*(k-1)+1:560*k); temp5=(reshape(temp4,80,7))'; temp6=reshape(temp5,1,560); Y(560*(k-1)+1:560*k)=temp6; end
for i=1:1:n %检错纠错过程 tmp3=Y(round(7*i-6):round(7*i)); S=mod(tmp3*h,2); if all(all(S==0))==1
result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A0)==0))==1
Y(1,round(7*i))=not(Y(1,round(7*i))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A1)==0))==1
Y(1,round(7*i-1))=not(Y(1,round(7*i-1))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A2)==0))==1
Y(1,round(7*i-2))=not(Y(1,round(7*i-2))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A3)==0))==1
Y(1,round(7*i-3))=not(Y(1,round(7*i-3))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A4)==0))==1
Y(1,round(7*i-4))=not(Y(1,round(7*i-4))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A5)==0))==1
Y(1,round(7*i-5))=not(Y(1,round(7*i-5))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3)); else if all(all((S-A6)==0))==1
Y(1,round(7*i-6))=not(Y(1,round(7*i-6))); result((4*i-3):(4*i))=Y((7*i-6):(7*i-3));
end end end end end end end end end
for i=1:1:N %统计错误个数 if result(1,i)~=src(1,i) sum=sum+1; end end
BER(1,j)=sum/N; %计算误码率 end
semilogy(SNR,BER,'-*g') %画误码率曲线 grid on; %图形控制语句
title('衰落信道(1ms )BPSK (交织深度80)误码率曲线') xlabel('信噪比SNR/(dB)')
ylabel('误码率BER/(bit/symbol)') 仿真程序得到加入交织编码后的误码率性能曲线,如图六
10
衰落信道(1ms )BPSK (交织深度80)误码率曲线
10
误码率B E R /(b i t /s y m b o l )
10
10
10信噪比SNR/(dB)
图六 交织编码对误码率的作用
小结:对比可知,在衰落信道中采用交织编码可以提高误码率性能,有效抵抗衰落信道的连续比特错误。可以看到,在交织深度为80,衰落时长1ms 的情况下,误码率曲线的确有优化,但是交织深度80还不是最佳的,它需要确切地考虑衰落信道的特征,记忆长度等
因素,在这里,我没有找到最佳的交织深度,但足以说明交织编码在衰落信道中的作用。另外,对于同一个信道,不一定是交织深度越深越好,过大的交织深度将导致额外的延时,是一种牺牲增加延时来换取误码率的方法。 当衰落时长分别为2ms ,5ms 时,仿真得到的误码率曲线对比,交织深度仍为80。具体如图七所示:
10
衰落信道BPSK(交织深度80) 误码率曲线
10
误码率B E R /(b i t /s y m b o l )
10
10
10信噪比SNR/(dB)
图七 不同衰落时长误码率性能比较
小结:随着衰落时长的增加,连续比特错误的可能和长度随之增加,图中可见,交织深度80的交织编码对5ms 时的信道改善作用不明显,需要重新审查,确定较优的交织深度将连串的比特错误交织成可视作独立的错误。
10
衰落信道BPSK (交织深度16649)误码率曲线
10
误码率B E R /(b i t /s y m b o l )
10
10
10信噪比SNR/(dB)
图八 交织深度16649编码性能
图八反映的是交织深度为16649的编码性能,可以看到,它反映的规律和交织深度为80的时候相似,可以肯定的一点是,80和16649这两个深度都不是最优的,最优的选择办法除了经验成分外,严谨的数学方法也是必须的条件之一。 到此,粗略地对分组码以及衰落信道的交织编码的实现。
六、实验总结
结论篇
1、 信道编码可以改善信道传输的误码率性能。本实验仿真采用的为线性分组码中的一种,
汉明(7,4)码。
2、 线性分组码增加了冗余比特,增加了检错纠错能力的同时,降低了带宽的使用率,降低
了有用信息的传输速率。
3、 分组码的查错纠错能力是有限的,在错误独立分布的高斯噪声信道,能有效发挥作用,
在连续比特错误的衰落信道,仅靠分组码难以改善误码率性能。
4、 交织编码和信道编码相结合的方法可以改善在衰落信道的传输性能,改善的效果和交织
深度有关,交织深度的取值和信道的衰落特性等多方面因素相关。关于取值的方法本人尚未掌握。
5、 交织编码可以使连续的比特错误在时间上分离,是一种时间分集方法。
心得篇
1、 通过仿真实验,加深了对信道编码部分的理解和掌握,动手实现了线性分组码以及交织
编码的仿真实验,但卷积码、LDPC 等的编码解码的实现还存在一些问题。
2、 调试交织编码部分花费了大量时间,对工具的使用欠熟练,对理论的掌握还不够熟练。 3、 仿真实验涉及大量的计算,良好的程序设计可以避免过高计算复杂度,体验到了以增加
空间复杂的换去时间复杂度下降的实例。
4、 深究通信系统会发现其需要很扎实的理论基础。