北京邮电大学课程设计任务书
指导单位,信息工程学院信息论教研室指导教师,邵志嘉专业和班级,信息工程专业97601班学生姓名,陈 鹏设计题目,信道编码的仿真

主要技术指标:
要求完成项目:
阐明该系统的原理及抗噪声性能该系统的仿真设计和程序实现仿真测试该系统的抗噪声性能
主要参考文献:
樊昌信等《通信原理(第四版)》 国防工业出版社王立宁等《MATLAB与通信仿真》 人民邮电出版社计算机仿真课程教学笔记吴伟陵《信息处理与编码》 北京邮电大学出版社
要求完成报告的时间: 2000年7月16日
目 录
摘 要 2
信 道 2
信道 2
信道模型 2
噪声 2
信号 2
二进制双极性通信系统的蒙特卡罗仿真 2
二进制双极性通信系统的蒙特卡罗仿真模型 2
信道编码 2
信道编码 2
信道编码性能测试的蒙特卡罗仿真模型 2
线性分组码 2
卷积码 2
交织码 2
级联码 2
标准级联码系统框图 2
信道编码与扩频通信 2
二进制双极性扩频通信系统的蒙特卡罗仿真 2
级联码对双用户二进制双极性扩频系统误码性能的改善 2
结 束 语 2
主要参考文献 2
摘 要
本文采用蒙特卡罗计算机仿真方法,使用MATLAB软件对二进制双极性通信系统中的几种基本信道编码进行了仿真性能测试和讨论,并从实际角度出发,对扩频通信中的信道编码进行了初步仿真。
首先,本文阐述了对二进制双极性通信系统进行蒙特卡罗计算机仿真的具体方法,给出了二进制双极性通信系统的蒙特卡罗仿真模型以及仿真流程图。接着,本文对几种基本信道编码:(7,4)HAMMING码、(2,1,3)卷积码、级联码 ( 外编码采用(7,4)HAMMING码,交织编码采用(7,4)卷积交织编码,内编码采用(2,1,3)卷积码 ),分别进行了仿真性能测试,根据仿真结果得出了三种编码纠错性能依次增强,级联码为最佳编码方案的结论。并且,还分别对级联码中的两种交织方式:卷积交织和循环等差交织进行仿真,依照仿真结果对两种具体的交织方式进行了性能比较。最后,从仿真为实际应用服务的角度出发,仿真测试了级联码 ( 外编码采用(7,4)HAMMING码,交织编码采用(7,4)卷积交织编码,内编码采用(2,1,3)卷积码 ) 对双用户二进制双极性扩频通信系统误码性能改善情况,得出了在二进制双极性扩频通信系统中采用级联码,能够实现信道复用和误码性能双赢的结论。
信 道信道是通信系统三大组成部分(信源、信道、信宿)之一,而信道中的噪声又是不可避免的,因此对信道和噪声的研究乃是研究通信问题的基础。
信道对于广义上的信道,按功能分,可分为调制信道和编码信道,其关系可见下图信道模型
在进行二进制数字基带传输信道编码仿真时,我们通常基于编码信道的概念分析建模,对于调制信道则仅考虑每一抽样判决时刻判决器输入端情形,这样做大大简化了仿真模型,使我们把主要精力真正集中于编码仿真本身。
噪声本次数字基带传输信道编码仿真,研究干扰为加性高斯白噪声的情况。此类情况称为AWGN信道,属于加性干扰。
噪声性能指标:
信噪比SNR:
 (dB)
噪声平均功率:

(其中为功率谱密度,为带宽)
仿真时,我们视抽样判决时刻判决器输入端噪声为高斯白噪声序列。
产生高斯白噪声序列的方法:
利用MATLAB提供的函数得到(0,1)上的均匀分布随机数;
利用函数变换法:
若 为相互独立的(0,1)区间均匀分布的随机变量,则变量:

为N(0,1)独立的高斯随机数。之后利用线性变换按要求调整均值方差。
MATLAB源程序
function [gsrv1,gsrv2]=gngauss(m,sgma)
%[gsrv1,gsrv2]=gngauss(m,sgma)
%[gsrv1,gsrv2]=gngauss(sgma)
%[gsrv1,gsrv2]=gngauss
if nargin==0
m=0;sgma=1;
elseif nargin==1
sgma=m;m=0;
end
u=rand;
z=sgma*(sqrt(2*log(1/(1-u))));
gsrv1=m+z*cos(2*pi*u);
gsrv2=m+z*sin(2*pi*u);
信号
本次数字基带传输信道编码仿真,输入信道信号采用BPSK信号,二进制信源序列的1,0符号分别被映射为两个持续时间相位差为的正弦波,即
 
信号性能指标:
E:信号功率;
T:确知信号周期;
相关系数;
归一化信噪比:
(N0 为输入信道的噪声功率谱密度) 。
仿真时,我们视抽样判决时刻判决器输入(即相关器或匹配滤波器输出)为
r = ±E + n
r,判决器输入序列
±E,信号序列
n,高斯白噪声序列二进制双极性通信系统的蒙特卡罗仿真蒙特卡罗计算机仿真用于估算数字通信系统的误码率,特别适用于难于对判决器的性能进行分析的情况。利用蒙特卡罗仿真估算二进制双极性通信系统的误码率具体方法可以用下图表示:
二进制双极性通信系统的蒙特卡罗仿真模型
n
±E r 输出数据
D D’
如图,首先仿真产生判决器的输入随机变量。使用均匀分布随机数发生器产生来自于二进制数据源的二进制01信息序列,该01序列被映射为±E的序列,E代表信号能量,且可归一化为1。使用高斯噪声发生器产生均值为0,方差为的高斯随机数序列n。判决器将随机变量和判决电平0相比较。如果大于0,判决发送比特是0,否则判决发送比特是1。该判决输出与所发送的信息比特序列相比较,并计算误比特数和误码率。
进行编码仿真时,该模型应在D 和D’ 处加上相应的编码器和译码器。
下面绘制了蒙特卡罗计算机仿真的基本流程图。
蒙特卡罗计算机仿真的基本流程图
N
Y
绘制蒙特卡罗仿真曲线的一般流程图
N
Y
N
Y
MATLAB源程序
function [p]=smldPe55(snr_in_dB)
%smldPe55.m 二进制双极性通信系统的蒙特卡罗仿真
%snr_in_dB 信噪比
%p 误码率
E=1;
SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
sgma=E/sqrt(2*SNR);
N=10^5;%仿真序列长度10^5,运行时间约1分钟
temp=0;
dsource=0;
decis=0;
numoferr=0;
p=numoferr/N;
for i=1:N
temp=rand;
if (temp<0.5)
dsource=0;
else
dsource=1;
end
if(dsource==0)
r=-E+gngauss(sgma);
else
r=E+gngauss(sgma);
end
if (r<0)
decis=0;
else
decis=1;
end
if (decis~=dsource)
numoferr=numoferr+1;
end
end
numoferr,
p=numoferr/N;
% smldPe55.m 二进制双极性通信系统的蒙特卡罗仿真
%ce55.m 仿真绘图语句
%仿真序列长度10^5,运行时间约15分钟
echo on
SNRindB551=0:16;
SNRindB552=0:0.1:16;
smld_err_prb55=zeros(1,length(SNRindB551));
theo_err_prb55=zeros(1,length(SNRindB552));
for i=1:length(SNRindB551)
smld_err_prb55(i)=smldPe55(SNRindB551(i)); %计算仿真误码率
end
for i=1:length(SNRindB552)
SNR55=exp(SNRindB552(i)*log(10)/10);
theo_err_prb55(i)=Qfunct(sqrt(2*SNR55));
%Qfunct y=(1/2)*erfc(x/sqrt(2));理论误码率公式
end
figure;
semilogy(SNRindB551,smld_err_prb55,'r*-');
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('二进制双极性通信系统的蒙特卡罗仿真结果与理论值比较');
hold on
semilogy (SNRindB552,theo_err_prb55,'b:');
%ce55.m 仿真绘图语句运行结果

上图(ce55的运行结果)给出了不同信噪比条件下,发送100000比特的二进制双极性通信系统的蒙特卡罗仿真结果以及理论值曲线。从仿真结果来看,蒙特卡罗仿真结果与理论值曲线接近程度相当好,用蒙特卡罗仿真模型来模拟实际二进制双极性通信系统,是可以被接受的。
信道编码信道编码主要用于解决数字通信的可靠性问题,也就是数字信号在交换和传输过程中出现差错的问题。利用信道编译码,可以显著改善信息在传输过程中的错误概率指标,有效增强系统抗干扰能力,提高数字通信系统的可靠性。因此,信道编码是数字信号传输中最重要的课题之一。
信道编码信道编码,就是在待发送的数字信息序列m中人为地按一定规则加进信息数字序列,从而构成了码字C(信道编码),然后将此码字C作为发送序列。在编码过程中,每个码字所加进的非信息序列是供在译码器中检出或纠正错误的,常称为监督元。它们本身不是信息,单纯从信息传输的角度来说是多余的,这种多余度降低了信息传输的效率。但是从另一角度来说,所增加的冗余度换来的是译码纠错能力,提高了信息传输可靠性。一般地说,码字中多余度越高,纠错能力越强,可靠性越高。由此可见,可靠性是以降低效率即有效性为代价换来的。编码问题就是在一定的抗干扰能力的要求下,合理设计和选择多余度最小的码字问题,也就是如何使可靠性和有效性二者能够得以合理兼顾的问题。
纠错编码理论是建立在代数学重要分支——近世代数基础上的,它又是信息论的一个重要分支,从五十年代开始至今发展很快,许多内容已经建立起完整的、严密的理论体系。随着数字技术的迅速发展,大规模、超大规模集成电路的不断出现,为纠错编码技术的应用开辟了无限广阔的前景;目前,适应不同需要的多种类型的码字的不断出现,使这门学科呈现了无限生机。
信道编码一般分为两类:分组编码和卷积编码。
在分组编码中,二进制信源输入序列被划分为长度k的码字组。每个长度k的码字被映射为长度n的码字,映射关系是相互独立的,编码器的输出仅仅与当前k个信源输入比特有关,而与以前的序列无关。从而由长度n的码字组构成分组编码后的二进制信道输入序列,编码速率为k/n比特/次,记为(n,k)分组码。
在卷积编码中,也是把k个信息比特编成长度为n的信道输入,但该信道输入不但与当前k个信源输入比特有关,而且还与编码器前(L-1)k个输入有关。
本次仿真选用以下几种基本信道编码:(7,4)HAMMING码、(2,1,3)卷积码、级联码 ( 外编码采用(7,4)HAMMING码,交织编码采用(7,4)卷积交织编码,内编码采用(2,1,3)卷积码 ),分别进行性能测试,另外,还特别对级联码中的两种交织方式:卷积交织和循环等差交织进行仿真性能测试比较。
在进行信道编码性能仿真测试时,我们仍使用蒙特卡罗仿真估算二进制双极性通信系统的误码率。在二进制双极性通信系统的蒙特卡罗仿真模型中加入信道编码的编译码器,就得到了信道编码性能测试的蒙特卡罗仿真模型(如下图所示)。
信道编码性能测试的蒙特卡罗仿真模型
n
±E r 输出数据
在实际进行信道编码性能测试的蒙特卡罗仿真时,我们将仿真数据源序列分成长度为16的码组,把分得的码组数作为循环步长,每一个循环步长依次进行发送接收一个码组的仿真并将差错数进行累加,循环结束后将总误码数除以码序列长度求得仿真误码率。从理论上讲,这样做不会对信道编码性能测试的蒙特卡罗仿真结果造成偏差。从实际角度讲,这种方法不仅符合通信应用中编码先要划分数据块的通用性原则,而且可以有效降低仿真的时间复杂度和空间复杂度。
同样,在原来的蒙特卡罗计算机仿真基本流程图中加入编译码模块,并对原来的生成数据模块、叠加噪声模块、接收判决模块、差错计数模块进行改造,将各模块中的数据操作改为对数据块的操作,就可以得到信道编码性能测试的蒙特卡罗仿真流程图(如下图所示)。
信道编码性能测试的蒙特卡罗仿真流程图
N
Y
线性分组码线性分组码的线性是指码组中码元间的约束关系为线性;分组是指编码时将每k个信息位一组进行独立处理,变换成长度为n (n>k) 的二进制码组。
本次仿真采用(7,4)HAMMING码。
性能参数如下:
生成矩阵G:
1 1 0 1 0 0 0
0 1 0 0 1 0 0
1 1 1 0 0 1 0
1 0 1 0 0 0 1
校验矩阵H:
1 0 0 1 0 1 1
0 1 0 1 1 1 0
0 0 1 0 1 1 1
可纠错误图样:
伴随式
S=(S0,S1,S2)
陪集首
e = ( e0 e1 e2 e3 e4 e5 e6 )
0 0 0
0 0 0 0 0 0 0
1 0 0
1 0 0 0 0 0 0
0 1 0
0 1 0 0 0 0 0
0 0 1
0 0 1 0 0 0 0
1 1 0
0 0 0 1 0 0 0
0 1 1
0 0 0 0 1 0 0
1 1 1
0 0 0 0 0 1 0
1 0 1
0 0 0 0 0 0 1
码长,n = 7
信息位,k = 4
监督位,n – k = 3
最小距离,d = 3
码率,k/n = 4/7
(7,4)HAMMING码能纠正每一种单个随机错误。
MATLAB源程序
function [output_h74]=hamming74(input_h74)
%hamming74.m(7,4)HAMMING码编码器
%input_h74 输入序列
%output_h74 输出编码序列
if(rem(length(input_h74),4)~=0)
input_h74=[input_h74,zeros(1,4-rem(length(input_h74),4))];
end
n=length(input_h74)/4;
u=zeros(1,n*7);
j=1;
for i=1:4:n*4
u(j)=rem((input_h74(i)+input_h74(i+2)+input_h74(i+3)),2);
u(j+1)=rem((input_h74(i)+input_h74(i+1)+input_h74(i+2)),2);
u(j+2)=rem((input_h74(i+1)+input_h74(i+2)+input_h74(i+3)),2);
u(j+3)=input_h74(i);
u(j+4)=input_h74(i+1);
u(j+5)=input_h74(i+2);
u(j+6)=input_h74(i+3);
j=j+7;
end
output_h74=u;
%hamming74.m(7,4)HAMMING码编码器
function [h4_output,h7_output]=h47(h74_channel_output)
%h47.m (7,4)HAMMING码译码器
%h74_channel_output 信道输入序列
%h4_output 译码输出序列
%h7_output 纠错后的信道输入序列
if(rem(length(h74_channel_output),7)~=0)
h74_channel_output=[h74_channel_output,zeros(1,7-rem(length(h74_channel_output),7))];
end
n=length(h74_channel_output)/7;
u4=zeros(1,n*4);
u7=zeros(1,n*7);
s=zeros(1,7-4);
e=zeros(1,7);
j=1;
for i=1:7:n*7
s(i)=rem((h74_channel_output(i)+h74_channel_output(i+3)+h74_channel_output(i+5)+h74_channel_output(i+6)),2);
s(i+1)=rem((h74_channel_output(i+1)+h74_channel_output(i+3)+h74_channel_output(i+4)+h74_channel_output(i+5)),2);
s(i+2)=rem((h74_channel_output(i+2)+h74_channel_output(i+4)+h74_channel_output(i+5)+h74_channel_output(i+6)),2);
e(i)= s(i)*(1-s(i+1))*(1-s(i+2));
e(i+1)=(1-s(i))*s(i+1)*(1-s(i+2));
e(i+2)=(1-s(i))*(1-s(i+1))*s(i+2);
e(i+3)=s(i)*s(i+1)*(1-s(i+2));
e(i+4)=(1-s(i))*s(i+1)*s(i+2);
e(i+5)=s(i)*s(i+1)*s(i+2);
e(i+6)=s(i)*(1-s(i+1))*s(i+2);
for k7=0:6
u7(i+k7)=rem(h74_channel_output(i+k7)+e(i+k7),2);
end
for k4=0:3
u4(j+k4)=u7(i+7-4+k4);
end
j=j+4;
end
h4_output=u4;
h7_output=u7;
%h47.m (7,4)HAMMING码译码器
function [p]=smldPe55_74(snr_in_dB)
%smldPe55_74.m 二进制双极性(7,4)HAMMING码通信系统的蒙特卡罗仿真函数
%snr_in_dB 信噪比
%p 误码率
E=1;
SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
sgma=E/sqrt(2*SNR);
N=16;
loop=10^5/N;
Ns=N*loop; %仿真序列长度10^5,运行时间约1.5分钟
numoferr_74=0;
temp=0;
dsource=zeros(1,N);
output_h74=hamming74(dsource);
channel_output=zeros(1,length(output_h74));
[h4output,h7output]=h47(output_h74);
for j=1:loop
for i=1:N
temp=rand;
if (temp<0.5)
dsource(i)=0;
else
dsource(i)=1;
end
end
output_h74=hamming74(dsource);
for i=1:length(output_h74)
if(output_h74(i)==0)
r=-E+gngauss(sgma);
else
r=E+gngauss(sgma);
end
if (r<0)
channel_output(i)=0;
else
channel_output(i)=1;
end
end
[h4output,h7output]=h47(channel_output);
for i=1:N%length(h4output)
if(h4output(i)~=dsource(i))
numoferr_74=numoferr_74+1;
end
end
end
numoferr_74,
p=numoferr_74/Ns;
%二进制双极性(7,4)HAMMING码通信系统的蒙特卡罗仿真函数
function [p_err,gamma_db]=p_e_hd_a(gamma_db_l,gamma_db_h,k,n,d_min)
%p_e_hd_a.m 硬判决性能估计函数
%p_err 误码率
%gamma_db 信噪比范围
%gamma_db_l >10 信噪比下界
%gamma_db_h 信噪比上界
%k 信息码长
%n 编码长度
%d_min 最小距离
gamma_db=[gamma_db_l:(gamma_db_h-gamma_db_l)/20:gamma_db_h];
gamma_b=10.^(gamma_db/10);
R_c=k/n;
p_b=q(sqrt(2.*R_c.*gamma_b));
p_err=(2^k-1).*(4*p_b.*(1-p_b)).^(d_min/2);
%p_e_hd_a.m 硬判决性能估计函数
function [p_err,gamma_db]=p_e_sd_a(gamma_db_l,gamma_db_h,k,n,d_min)
%p_e_sd_a.m 软判决性能估计函数
%p_err 误码率
%gamma_db 信噪比范围
%gamma_db_l >10 信噪比下界
%gamma_db_h 信噪比上界
%k 信息码长
%n 编码长度
%d_min 最小距离
gamma_db=[gamma_db_l:(gamma_db_h-gamma_db_l)/20:gamma_db_h];
gamma_b=10.^(gamma_db/10);
R_c=k/n;
p_err=(2^k-1).*q(sqrt(d_min.*R_c.*gamma_b));
%p_e_sd_a.m 软判决性能估计函数
%ce55_74.m 仿真绘图语句
%仿真序列长度10^5,运行时间约20分钟
echo on
SNRindB55741=0:16;
SNRindB55742=0:0.1:16;
smld_err_prb55=zeros(1,length(SNRindB55741));
smld_err_prb74=zeros(1,length(SNRindB55741));
SNR5574=0;
theo_err_prb5574=zeros(1,length(SNRindB55742));%
for i=1:length(SNRindB55741)
smld_err_prb55(i)=smldPe55(SNRindB55741(i));
smld_err_prb74(i)=smldPe55_74(SNRindB55741(i));
end
for i=1:length(SNRindB55742)
SNR5574=exp(SNRindB55742(i)*log(10)/10);
theo_err_prb5574(i)=(1/2)*erfc(sqrt(2*SNR5574)/sqrt(2));
%Qfunct y=(1/2)*erfc(x/sqrt(2));
%theo_err_prb(i)=Qfunct(sqrt(2*SNR));
end
[p_err_ha,gamma_db_ha]=p_e_hd_a(5,16,4,7,3);
%p_e_hd_a.m 硬判决性能估计函数
[p_err_sa,gamma_db_sa]=p_e_sd_a(5,16,4,7,3);
%p_e_sd_a.m 软判决性能估计函数
%绘图语句
figure;
semilogy(SNRindB55741,smld_err_prb55,'b*-');
hold on
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('(7,4)HAMMING编码系统仿真结果与未编码系统的比较,以及软硬判决解码误码率界');
semilogy(SNRindB55741,smld_err_prb74,'ro-');
semilogy(SNRindB55742,theo_err_prb5574,'b:');
semilogy(gamma_db_ha,p_err_ha,'g');
semilogy(gamma_db_sa,p_err_sa,'m');
%ce55_74.m 仿真绘图语句运行结果下图(ce55_74的运行结果)给出了不同信噪比条件下,发送100000比特的二进制双极性(7,4)HAMMING编码通信系统的蒙特卡罗仿真结果,以及未编码系统的仿真结果和未编码系统的理论值曲线,还给出了软硬判决解码的误码率估计函数。但在绘图时发现,绘出的这两个函数曲线居然在未编码的理论值曲线之上。这不仅是因为仿真信噪比范围不同(蒙特卡罗仿真0:16;估计函数有效范围在16dB以上),还因为,在大于10dB以上的信噪比下,理论误码率低于10的-5次方,由于仿真的时间复杂度限制,无法得出误码率低于10的-5次方的蒙特卡罗仿真结果。从仿真角度讲,图中绘出这两个软硬判决解码的误码率估计函数曲线已失去了意义,仅做参考。
从下图的仿真结果可见,(7,4)HAMMING编码可以降低二进制双极性通信系统的误码率,从而提高通信的有效性。

卷积码卷积码是一种有记忆的编码,在任意给定的时间单元处,编码器的n个输出不仅与此时间单元的k个输入有关,而且也与前m个输入有关。卷积码通常表示为:(n,k,m)
本次仿真采用(2,1,3)卷积码。
性能参数如下:
生成矩阵G,1 0 1 1
1 1 1 1
编码个数,n=2
信息码个数,k=1
约束长度,N=m+1=4
卷积码的码率:=1/2
MATLAB源程序
function output=cnv_encd(g,k0,input)
%output=cnv_encd(g,k0,input) 卷积码编码函数
%g 生成矩阵
%k0 输入码长
%input 输入信源序列
%output 输出卷积编码序列
%+ 0..0
if rem(length(input),k0)>0
input=[input,zeros(size(1:k0-rem(length(input),k0)))];
end
n=length(input)/k0;
%g size
if rem(size(g,2),k0)>0
error('Error,g is not of the right size.')
end
%li L,n0
li=size(g,2)/k0;
n0=size(g,1);
%+ 0..0
u=[zeros(size(1:(li-1)*k0)),input,zeros(size(1:(li-1)*k0))];
%uu lie i*T,i=1,2...
u1=u(li*k0:-1:1);
for i=1:n+li-2
u1=[u1,u((i+li)*k0:-1:i*k0+1)];
end
uu=reshape(u1,li*k0,n+li-1);
%output reshape
output=reshape(rem(g*uu,2),1,n0*(n+li-1));
%output=cnv_encd(g,k0,input)卷积码编码函数
%卷积码的维特比译码函数
function [decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output)
%VITERBI 卷积码的维特比解码器
%[decoder_ouput,survivor_state,cumulated_metric]=viterbi(G,k,channel_output)
% G是一个n*Lk矩阵,该矩阵的每一行确
% 定了从移位记错器到第n个输出间的连接,
% 是码速率。
% survivor_state是表示通过网络的最佳路径的矩阵。
% 量度在另一个函数metric(x,y)中给出,而且可根据
% 硬判决和软判决来指定。
% 该算法最小化了量度而不是最大化似然
n=size(G,1); %取出矩阵G的一维大小,即得出输出端口
% 检查大小
if rem(size(G,2),k)~=0 %当G列数不是k的整数倍时
error('Size of G and k do not agree') %发出出错信息
end
if rem(size(channel_output,2),n)~=0 %当输出量元素个数不是输出端口的整数倍时
error('Channel output not of the right size') %发出出错信息
end
L=size(G,2)/k; %得出移位数,即寄存器的个数
% 由于L-1个寄存器的状态即可表示出输出状态,
% 所以总的状态数number_of_states可由前L-1个
% 寄存器的状态组合来确定
number_of_states=2^((L-1)*k);
% 产生状态转移矩阵、输出矩阵和输入矩阵
for j=0:number_of_states-1 %j表示当前寄存器组的状态因为状态是从零
%开始的,所以循环从0到number_of_states-1
for l=0:2^k-1 %l为从k个输入端的信号组成的状态,总的状
%态数为2^k,所以循环从0到2^k-11
% nxt_stat完成从当前的状态和输入的矢量得出下寄存器组的一个状态
[next_state,memory_contents]=nxt_stat(j,l,L,k);
% input数组值是用于记录当前状态到下一个状态所要的输入信号矢量
% input数组的维数: 一维坐标x=j+1指当前状态的值
% 二维坐标y=next_state+1指下一个状态的值
% 由于Matlab中数组的下标是从1开始的,而状态值
% 是从0开始的,所以以上坐标值为:状态值+1
input(j+1,next_state+1)=l;
% branch_output用于记录在状态j下输入l时的输出
branch_output=rem(memory_contents*G',2);
% nextstate数组记录了当前状态j下输入l时的下一个状态
nextstate(j+1,l+1)=next_state;
% output数组记录了当前状态j下输入l时的输出(十进制)
output(j+1,l+1)=bin2deci(branch_output);
end
end
% state_metric数组用于记录译码过程在每状态时的汉明距离
% state_metric大小为number_of_states2,(:,1)当前
% 状态位置的汉明距离,为确定值,而(:,2)为当前状态加输入
% 得到的下一个状态汉明距离,为临时值
state_metric=zeros(number_of_states,2);
% depth_of_trellis用于记录网格图的深度
depth_of_trellis=length(channel_output)/n;
% 输出矩阵,每一列为一个输出状态
channel_output_matrix=reshape(channel_output,n,depth_of_trellis);
% survivor_state描述译码过程中在网格图中的路径
survivor_state=zeros(number_of_states,depth_of_trellis+1);
%开始无尾信道输出的解码
for i=1:depth_of_trellis-L+1 %i指示网格图的深度
% flag矩阵用于记录网格图中的某一列是否被访问过
flag=zeros(1,number_of_states);
if i<=L
step=2^((L-i)*k); %在网格图的开始处,并不是所有的状态都取
else %用step来说明这个变化
step=1; %状态数从1→2→4→...→number_of_states
end
for j=0:step:number_of_states-1 %j表示寄存器的当前状态
for l=0:2^k-1 %l为当前的输入
branch_metric=0; %用于记录码间距离
% 将当前状态下输入状态l时的输出output转为n位二进制,以便
% 计算码间距离(说明:数组坐标大小变化同上)。
binary_output=deci2bin(output(j+1,l+1),n);
% 计算实际的输出码同网格图中此格某种输出的码间距离
for ll=1:n
branch_metric=branch_metric+metric(channel_output_matrix(ll,i),binary_output(ll));
end
% 选择码间距离较小的那条路径
% 选择方法:
% 当下一个状态没有被访问时就直接赋值,否则,用比它小的将其覆盖
if((state_metric(nextstate(j+1,l+1)+1,2)>state_metric(j+1,1)...
+branch_metric)|flag(nextstate(j+1,l+1)+1)==0)
% 下一个状态的汉明距离(临时值)=当前状态的汉明距离(确定值)+ 码间距离
state_metric(nextstate(j+1,l+1)+1,2)=state_metric(j+1,1)+branch_metric;
% survivor_state数组的一维坐标为下一个状态值,二维坐标为此状态
% 在网格图中的列位置,记录的数值为当前状态,这样就可以从网格图中
% 某位置的某个状态得出其对应上一个列位置的状态,从而能很方便的完
% 成译码过程。
survivor_state(nextstate(j+1,l+1)+1,i+1)=j;
flag(nextstate(j+1,l+1)+1)=1; %指示该状态已被访问过
end
end
end
state_metric=state_metric(:,2:-1:1); %移动state_metric,将临时值移为确定值
end
%开始尾部信道输出解码
for i=depth_of_trellis-L+2:depth_of_trellis
flag=zeros(1,number_of_states);
% 状态数从number_of_states→number_of_states/2→...→2→1
% 程序说明同上,只不过输入矢量只为0
last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));
for j=0:last_stop-1
branch_metric=0;
binary_output=deci2bin(output(j+1,1),n);
for ll=1:n
branch_metric=branch_metric+metric(channel_output_matrix(ll,i),binary_output(ll));
end
if((state_metric(nextstate(j+1,1)+1,2)>state_metric(j+1,1)...
+branch_metric)|flag(nextstate(j+1,1)+1)==0)
state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,1)+1,i+1)=j;
flag(nextstate(j+1,1)+1)=1;
end
end
state_metric=state_metric(:,2:-1:1);
end
% 从最佳路径中产生解码
% 译码过程可从数组survivor_state的最后一个位置向前逐级译码
state_sequence=zeros(1,depth_of_trellis+1);
% survivor_state数组的最后的输出状态肯定是“0”
state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
% 逐级译码过程
for i=1:depth_of_trellis
state_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)...
+1),depth_of_trellis-i+2);
end
decorder_output_matrix=zeros(k,depth_of_trellis-L+1);
for i=1:depth_of_trellis-L+1
% 根据数组input的定义来得出从当前状态到下一个状态的输入信号矢量
dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);
% 转成二进制信号
dec_output_bin=deci2bin(dec_output_deci,k);
% 将一次译码存入译码输出矩阵decoder_output_matrix相应的位置
decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';
end
% 按照一维序列形式重新组织输出
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
% state_metric为网格图最后一个列位置中“0”状态位置的汉明距
% 离,这个值就是整个译码过程中的汉明距离。
cumulated_metric=state_metric(1,1);
%卷积码的维特比译码函数
%nxt_stat.m 记录状态函数
% next_state用于记录下一个状态的值
% memory_contents用于记录
function [next_state,memory_contents]=nxt_stat(current_state,input,L,k)
% 将当前状态值(十进制)转成位数为k*(L-1)的二进制
binary_state=deci2bin(current_state,k*(L-1));
% 将输入状态值(十进制)转成位数为k的二进制序列
binary_input=deci2bin(input,k);
% 寄存器组的下一个状态值(二进制)
next_state_binary=[binary_input,binary_state(1:(L-2)*k)];
% 将寄存器组的下一个状态值(二进制)转成十进制
next_state=bin2deci(next_state_binary);
% 用memory_contents来记录各个寄存器在下一个状态下的信息(二进制)
% 以便与生成矩阵相乘得出输出
memory_contents=[binary_input,binary_state];
%nxt_stat.m 记录状态函数
function y=bin2deci(x)
%bin2dec.m 二进制序列转换十进制数值函数
%x 二进制序列
%y 十进制数值
li=length(x);
y=(li-1:-1:0);
y=2.^y;
y=x*y';
%bin2dec.m 二进制序列转换十进制数值函数
function y=deci2bin(x,li)
%dec2bin.m 十进制数值转换二进制序列函数
y=zeros(1,li);
i=1;
while x>=0&i<=li
y(i)=rem(x,2);
x=(x-y(i))/2;
i=i+1;
end
y=y(li:-1:1);
% dec2bin.m十进制数值转换二进制序列函数
function distance=metric(x,y)
%metric.m 距离量度函数
%被比较比特 x y
%hamming距离 distance
if x==y
distance=0;
else
distance=1;
end
% metric.m距离量度函数
function [p]=smldPe55_cnv(snr_in_dB)
%smldPe55_cnv.m 二进制双极性(2,1,3)卷积码通信系统的蒙特卡罗仿真函数
%snr_in_dB 信噪比
%p 误码率
E=1;
SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
sgma=E/sqrt(2*SNR);
N=16;
loop=10^5/N;
Ns=N*loop; %仿真序列长度10^5,运行时间约5分钟
dsource=zeros(1,N);
G=[1 0 1 1;1 1 1 1],%(2,1,3)卷积码编码矩阵
k=1,
output_cnv_encd=cnv_encd(G,k,dsource);
channel_output=zeros(1,length(output_cnv_encd));
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
numoferr_cnv=0;
for j=1:loop
for i=1:N
temp=rand;
if (temp<0.5)
dsource(i)=0;
else
dsource(i)=1;
end
end
%length(dsource)
output_cnv_encd=cnv_encd(G,k,dsource);
%length(output_cnv_encd)
for i=1:length(output_cnv_encd)
if(output_cnv_encd(i)==0)
r=-E+gngauss(sgma);
else
r=E+gngauss(sgma);
end
if (r<0)
channel_output(i)=0;
else
channel_output(i)=1;
end
end
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
%length(decoder_output),pause
for i=1:length(dsource)
if(decoder_output(i)~=dsource(i))
numoferr_cnv=numoferr_cnv+1;
end
end
end
numoferr_cnv,
p=numoferr_cnv/Ns;
%smldPe55_cnv.m 二进制双极性(2,1,3)卷积码通信系统的蒙特卡罗仿真函数
%ce55_cnv.m 二进制双极性(2,1,3)卷积码通信系统的蒙特卡罗仿真绘图
%仿真序列长度10^5,运行时间约2小时
echo on
SNRindB1=0:16;
SNRindB2=0:0.1:16;
smld_err_prb=zeros(1,length(SNRindB1));
smld_err_prb_cnv=zeros(1,length(SNRindB1));
SNR=0;
theo_err_prb=zeros(1,length(SNRindB2));
for i=1:length(SNRindB1)
smld_err_prb(i)=smldPe55(SNRindB1(i));
smld_err_prb_cnv(i)=smldPe55_cnv(SNRindB1(i));
end
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb(i)=(1/2)*erfc(sqrt(2*SNR)/sqrt(2));
%Qfunct y=(1/2)*erfc(x/sqrt(2));
%theo_err_prb(i)=Qfunct(sqrt(2*SNR));
end
%绘图函数
figure;
semilogy(SNRindB1,smld_err_prb,'b*-');
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('(2,1,3)卷积编码系统仿真结果与未编码系统的比较');
hold on
semilogy(SNRindB1,smld_err_prb_cnv,'ro-');
semilogy(SNRindB2,theo_err_prb,'b:');
%ce55_cnv.m 二进制双极性(2,1,3)卷积码通信系统的蒙特卡罗仿真绘图运行结果下图(ce55_cnv的运行结果)给出了不同信噪比条件下,发送100000比特的二进制双极性(2,1,3)卷积编码通信系统的蒙特卡罗仿真结果,以及未编码系统的仿真结果和未编码系统的理论值曲线。
从下图的仿真结果可见,(2,1,3)卷积编码可以降低二进制双极性通信系统的误码率,从而提高通信的有效性。
需要特别指出的是,仿真时每发送一个码组前后都会将卷积器清零,对此我们可以认为是系统在发送端为同步校准而插入比特0的操作,在接收端这些插入的0比特又会被系统自动去掉。因此从用户角度看,仿真序列并未改变,所得到的仿真误码率结果依然正确,只不过更准确地应该称之为用户误码率,而非系统误码率。

为方便比较,下面将(2,1,3)卷积编码系统仿真结果、(7,4)HAMMING编码系统仿真结果、未编码系统仿真结果和未编码系统的理论值曲线绘制在一起。

由图可知,相同信噪比条件下,按照仿真结果误码率从高到低顺序依次为:未编码系统、(7,4)HAMMING编码系统、(2,1,3)卷积编码系统,从而可以得出(2,1,3)卷积编码纠错能力优于(7,4)HAMMING编码的结论,与理论结论相符。
交织码从广义上说,交织编码属于分组编码,但由于采用存储器实现交织,它同时又具有卷积编码的记忆特征。在发端,它将分组长度L的信息序列通过交织器重排,在收端通过解交织器恢复原序列,以求使信道中突发错误变为无记忆随机独立差错。交织编码是一种信道改造技术,它通过信号设计将一个原来属于突发差错的有记忆信道改造为基本上是独立差错的随机无记忆信道。交织编码作为克服衰落信道中突发性干扰的有效方法,通常和其它用于纠正无记忆独立差错的信道编码相结合构成级联码(见下文),广泛应用于当代移动通信。
交织码通常表示为(M,N),分组长度L=MN,交织方式用M行N列的交织矩阵表示。一般,交织方式分为分组交织和卷积交织。分组交织的交织矩阵按列写入,按行读出;去交织矩阵按行写入按列读出。卷积交织的交织矩阵和去交织矩阵的写入与读出均按行进行。
本次仿真采用(7,4)卷积交织编码。
性能参数如下:
交织矩阵:
分组卷积交织前序号:
[ 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ];
卷积交织后序号重排:
[ 1 23 17 11 5 17 21 8 2 24 18 12 6 28 15 9 3 25 19 13 7 22 16 10 4 26 20 14 ];
性能分析:
任何长度小于等于M = 7的突发差错,经交织、去交织后成为独立差错。
任何长度大于M = 7的突发差错,经交织、去交织后有可能变成短突发差错。
特殊的,间隔为M = 7的独立差错,经交织、去交织后会变成长度为N = 4的突发差错。
MATLAB源程序
function [aa]=jiaozhi(bb,n)
%jiaozhi.m 卷积交织函数
%n=28 分组长度
%bb 卷积交织前原分组序列
%aa 卷积交织后分组序列
%序号重排方式:
cc=[ 1 23 17 11 5 17 21 8 2 24 18 12 6 28 15 9 3 25 19 13 7 22 16 10 4 26 20 14 ];
for i=1:n
aa(i)=bb(cc(i));
end
%jiaozhi.m 卷积交织函数
function [bb]=jiejiaozhi(aa,n)
%jiejiaozhi.m 解卷积交织函数
%n=28
%aa 解卷积交织前原分组序列
%bb 解卷积交织后分组序列
%序号重排方式:
cc=[ 1 23 17 11 5 17 21 8 2 24 18 12 6 28 15 9 3 25 19 13 7 22 16 10 4 26 20 14 ];
for i=1:n
bb(cc(i))=aa(i);
end
%jiejiaozhi.m 解卷积交织函数
特别的,本次仿真还采用了一种循环等差交织编码。所谓循环等差,是指将序号从大到小顺时针排成一圈,从1开始等间隔逆时针取28个数,间隔为4,这样依次取的28个数即序号重排方式。
性能参数如下:
交织矩阵:
分组交织前序号:
[ 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ];
循环等差交织后序号重排:
[ 1 24 19 14 9 4 27 22 17 12 7 2 25 20 15 10 5 28 23 18 13 8 3 26 21 16 11 6];
性能分析:
任何长度小于等于M + 3 = 7 + 3 =10的突发差错,经交织、去交织后成为独立差错。
任何长度大于M + 3 = 7 + 3 =10的突发差错,经交织、去交织后有可能变成短突发差错。
特殊的,间隔为M + 3 = 7 + 3 =10的独立差错,经交织、去交织后会变成长度为N - 1= 4 – 1 =3的突发差错。
特殊的,间隔为…4、5、4、5…的独立差错,经交织、去交织后会变成长度为5或6的突发差错。
从前3条性能分析的比较看,循环等差交织比卷积交织更好。但是从第4条看,循环等差交织比卷积交织又差了。因此,只能通过实际仿真来比较两种交织方式的性能(见下文级联码部分)。
MATLAB源程序
function [aa]=jiaozhi_nocnv(bb,n)
%jiaozhi_nocnv.m 循环等差交织函数
%n=28 分组长度
%bb 循环等差交织前原分组序列
%aa 循环等差交织后还原分组序列
%序号重排方式:
%j[n]=[ 1 24 19 14 9 4 27 22 17 12 7 2 25 20 15 10 5 28 23 18 13 8 3 26 21 16 11 6 ]
j=1;
for i=1:n
j=rem(j+5-1,n)+1; %序号重排方式迭代算法
aa(n+1-i)=bb(j);
end
%jiaozhi_nocnv.m 循环等差交织函数
function [bb]=jiejiaozhi_nocnv(aa,n)
%jiaozhi_nocnv.m 解循环等差交织函数
%n=28 分组长度
%aa 解循环等差交织前原分组序列
%bb 解循环等差交织后还原分组序列
%序号重排方式:
%j[n]=[ 1 24 19 14 9 4 27 22 17 12 7 2 25 20 15 10 5 28 23 18 13 8 3 26 21 16 11 6 ]
j=1;
for i=1:n
j=rem(j+5-1,n)+1; %序号重排方式迭代算法
bb(j)=aa(n+1-i);
end
%jiaozhi_nocnv.m 解循环等差交织函数级联码在许多实际信道中,出现的误码既不是单纯随机独立差错,也不是明显的单个突发差错,而是混合型差错。级联码就是最常用于纠正这类混合型差错的一种性能优良,高效的编码方式。
按照 NASA 1984年给出的标准级联码系统,级联码的编码被分成外编码、交织编码和内编码三部分,其中外编码采用分组线性码,内编码采用卷积码。标准级联码系统框图如下:
标准级联码系统框图编码器
输入
输出
译码器
事实上,我们可以把系统框图中外编码器、交织器和内编码器三部分级联后的总体,看作一个级联码的编码器,同理,外译码器、去交织器和内译码器三部分级联后的总体构成了级联码的译码器。
本次仿真外编码采用(7,4)HAMMING码,内编码采用(2,1,3)卷积码。交织编码采用(7,4)卷积交织编码或循环等差交织编码。除特别说明外,交织编码采用前者即(7,4)卷积交织编码。
各编码性能参数如前所述。
仿真时,首先进行了级联码和仅内码时的性能比较,接着还比较了上文交织码部分两种交织方式的性能,同时还在最后对(7,4)HAMMING码、(2,1,3)卷积码、级联码各仿真结果进行了综合比较。
级联码和仅内码时的性能比较:
MATLAB源程序
function [p]=smldPe55_cnv_jz_74(snr_in_dB)
%smldPe55_cnv_jz_74.m 二进制双极性级联码(卷积交织)通信系统蒙特卡罗仿真函数
%外编码采用(7,4)HAMMING码
%交织编码采用(7,4)卷积交织编码
%内编码采用(2,1,3)卷积码
%snr_in_dB 信噪比
%p 误码率%
E=1;
SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
sgma=E/sqrt(2*SNR);
N=16;
loop=10^5/N; %仿真序列长度10^5,运行时间约8分钟;
Ns=N*loop;
G=[1 0 1 1; 1 1 1 1]; %(2,1,3)卷积码编码矩阵
k=1;
numoferr_cnv_jz_74=0;
temp=0;
dsource=zeros(1,N);
output_h74=hamming74(dsource);
output_h74_jz28=jiaozhi(output_h74,28);
output_cnv_encd=cnv_encd(G,k,output_h74_jz28);
channel_output=zeros(1,length(output_cnv_encd));
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
[decoder_output_jjz28]=jiejiaozhi(decoder_output,28);
[h4output,h7output]=h47(decoder_output_jjz28);
for j=1:loop
for i=1:N
temp=rand;
if (temp<0.5)
dsource(i)=0;
else
dsource(i)=1;
end
end
%length(dsource)
output_h74=hamming74(dsource);
output_h74_jz28=jiaozhi(output_h74,28); %卷积交织
output_cnv_encd=cnv_encd(G,k,output_h74_jz28);
%length(output_cnv_encd),pause
for i=1:length(output_cnv_encd)
if(output_cnv_encd(i)==0)
r=-E+gngauss(sgma);
else
r=E+gngauss(sgma);
end
if (r<0)
channel_output(i)=0;
else
channel_output(i)=1;
end
end
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
[decoder_output_jjz28]=jiejiaozhi(decoder_output,28); %解卷积交织
%length(decoder_output),pause
[h4output,h7output]=h47(decoder_output_jjz28);
for i=1:N%length(h4output)
if(h4output(i)~=dsource(i))
numoferr_cnv_jz_74=numoferr_cnv_jz_74+1;
end
end
end
numoferr_cnv_jz_74,
p=numoferr_cnv_jz_74/Ns;%length(decoder_output),pause
%smldPe55_cnv_jz_74.m 二进制双极性级联码(卷积交织)通信系统蒙特卡罗仿真函数
%ce55_cnv_ja_74.m二进制双极性级联码(卷积交织)通信系统的蒙特卡罗仿真绘图
%外编码采用(7,4)HAMMING码
%交织编码采用(7,4)卷积交织编码
%内编码采用(2,1,3)卷积码
%仿真序列长度10^5,运行时间约3.5小时
echo on
SNRindB1=0:1:16;
smld_err_prb=zeros(length(SNRindB1));
smld_err_prb_cnv=zeros(length(SNRindB1));
smld_err_prb_cnv_jz_74=zeros(length(SNRindB1));
SNRindB2=0:0.1:16;
theo_err_prb55=zeros(length(SNRindB2));
for i=1:length(SNRindB1)
smld_err_prb(i)=smldPe55(SNRindB1(i));
smld_err_prb_cnv(i)=smldPe55_cnv(SNRindB1(i));
smld_err_prb_cnv_jz_74(i)=smldPe55_cnv_jz_74(SNRindB1(i));
end
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb55(i)=Qfunct(sqrt(2*SNR));
Qfunct y=(1/2)*erfc(x/sqrt(2));
End
%绘图函数
figure;
semilogy(SNRindB2,theo_err_prb55,'b:');
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('单用户未扩频级联交织码误比特率曲线,与仅内码和未编码时误比特率曲线比较');
hold on
semilogy(SNRindB1,smld_err_prb,'b*-');
semilogy(SNRindB1,smld_err_prb_cnv,'gs-');
semilogy(SNRindB1,smld_err_prb_cnv_jz_74,'rx-');
%ce55_cnv_jz_74.m二进制双极性级联码(卷积交织)通信系统的蒙特卡罗仿真绘图运行结果下图(ce55_cnv_jz_74的运行结果)给出了不同信噪比条件下,发送100000比特的二进制双极性级联码 ( 外编码采用(7,4)HAMMING码,交织编码采用(7,4)卷积交织编码,内编码采用(2,1,3)卷积码 ) 通信系统的蒙特卡罗仿真结果,二进制双极性(2,1,3)卷积编码通信系统的蒙特卡罗仿真结果,以及未编码系统的仿真结果和未编码系统的理论值曲线。
从下图的仿真结果可见,级联码与仅内码时相比,在信噪比高于2dB时,可以更好地降低二进制双极性通信系统的误码率,从而能更进一步提高通信的有效性。但是,在信噪比过低时(低于2dB),级联码在降低二进制双极性通信系统的误码率性能方面,反而比与仅内码时稍差一些。换言之,仿真结果表明,在信噪比低于2dB时,级联码的外编码和交织器不仅没有起到进一步纠错的作用,反而会降低内编码器的纠错性能,但是和未编码时相比,仍然能够降低二进制双极性通信系统的误码率,提高通信的有效性。

级联码两种交织方式性能比较,以及(7,4)HAMMING码、(2,1,3)卷积码、级联码各仿真结果的综合比较:
MATLAB源程序
function [p]=smldPe55_cnv_jznocnv_74(snr_in_dB)
%smldPe55_cnv_jznocnv_74.m 二进制双极性级联码(循环等差交织)通信系统蒙特卡罗仿真函数
%snr_in_dB 信噪比
%p 误码率
E=1;
SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
sgma=E/sqrt(2*SNR);
N=16;
loop=10^5/N; %仿真序列长度10^5,运行时间约8分钟
Ns=N*loop;
G=[1 0 1 1; 1 1 1 1]; %(2,1,3)卷积码编码矩阵
k=1;
numoferr_cnv_jznocnv_74=0;%
temp=0;
dsource=zeros(1,N);
output_h74=hamming74(dsource);
output_h74_jz28=jiaozhi_nocnv(output_h74,28);
output_cnv_encd=cnv_encd(G,k,output_h74_jz28);
channel_output=zeros(1,length(output_cnv_encd));
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
[decoder_output_jjz28]=jiejiaozhi_nocnv(decoder_output,28);
[h4output,h7output]=h47(decoder_output_jjz28);
for j=1:loop
for i=1:N
temp=rand;
if (temp<0.5)
dsource(i)=0;
else
dsource(i)=1;
end
end
%length(dsource)
output_h74=hamming74(dsource);
output_h74_jz28=jiaozhi_nocnv(output_h74,28); %循环等差交织
output_cnv_encd=cnv_encd(G,k,output_h74_jz28);
%length(output_cnv_encd),pause
for i=1:length(output_cnv_encd)
if(output_cnv_encd(i)==0)
r=-E+gngauss(sgma);
else
r=E+gngauss(sgma);
end
if(r<0)
channel_output(i)=0;
else
channel_output(i)=1;
end
end
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
[decoder_output_jjz28]=jiejiaozhi_nocnv(decoder_output,28); %解循环等差交织
%length(decoder_output),pause
%[h4output,h7output]=h47(h7_channel_output);
[h4output,h7output]=h47(decoder_output_jjz28);
for i=1:N%length(h4output)
if(h4output(i)~=dsource(i))
numoferr_cnv_jznocnv_74=numoferr_cnv_jznocnv_74+1;
end
end
end
numoferr_cnv_jznocnv_74,
p=numoferr_cnv_jznocnv_74/Ns;
%length(decoder_output),pause
%smldPe55_cnv_jznocnv_74.m 二进制双极性级联码(循环等差交织)通信系统蒙特卡罗仿真函数
%ce55_cnv_jznocnv_74.m 二进制双极性级联码(循环等差交织)通信系统的蒙特卡罗仿真绘图
%外编码采用(7,4)HAMMING码
%交织编码采用(7,4)卷积交织编码
%内编码采用(2,1,3)卷积码
%仿真序列长度10^5,运行时间约8小时
echo on
SNRindB1=0:1:16;
smld_err_prb=zeros(length(SNRindB1));
smld_err_prb_cnv=zeros(length(SNRindB1));
smld_err_prb_cnv_jz_74=zeros(length(SNRindB1));
smld_err_prb_cnv_jznocnv_74=zeros(length(SNRindB1));
SNRindB2=0:0.1:16;
theo_err_prb55=zeros(length(SNRindB2));
for i=1:length(SNRindB1)
i,SNRindB1(i),
smld_err_prb(i)=smldPe55(SNRindB1(i));
smld_err_prb_cnv(i)=smldPe55_cnv(SNRindB1(i));
smld_err_prb_cnv_jz_74(i)=smldPe55_cnv_jz_74(SNRindB1(i));
smld_err_prb_cnv_jznocnv_74(i)=smldPe55_cnv_jznocnv_74(SNRindB1(i));
end
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb55(i)=Qfunct(sqrt(2*SNR));
Qfunct y=(1/2)*erfc(x/sqrt(2));
End
%绘图函数
figure;
semilogy(SNRindB2,theo_err_prb55,'b:');
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('单用户未扩频级联交织码误比特率曲线,与未编码和仅内码时误比特率曲线比较');
hold on
semilogy(SNRindB1,smld_err_prb,'b*-');
semilogy(SNRindB1,smld_err_prb_cnv,'gs-');
semilogy(SNRindB1,smld_err_prb_cnv_jz_74,'rx-');
%与 ce55_cnv_jz_74 运行结果相同
%绘图函数
figure;
semilogy(SNRindB2,theo_err_prb55,'b:');
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title(' HAMMING码、卷积码、级联码(两种交织方式)仿真结果及未编码系统的比较');
%title('卷积交织和循环等差交织:两种交织编码的比较');
hold on
semilogy(SNRindB1,smld_err_prb,'b*-');
semilogy(SNRindB1,smld_err_prb_cnv,'gs-');
semilogy(SNRindB1,smld_err_prb_cnv_jz_74,'rx-');
semilogy(SNRindB1,smld_err_prb_cnv_jznocnv_74,'m>-');
%ce55_cnv_jznocnv_74.m 二进制双极性级联码(循环等差交织)通信系统的蒙特卡罗仿真绘图运行结果为便于分析,下图将(2,1,3)卷积编码系统的仿真结果、(7,4)HAMMING编码系统的仿真结果、级联码两种交织方式各自的仿真结果,以及未编码系统的仿真结果和未编码系统的理论值曲线绘制在一起(即ce55_74的运行结果和ce55_cnv_jznocnv_74的运行结果)。
卷积交织和循环等差交织两种交织编码的比较:
由图可见,以仅内码时的曲线(即(2,1,3)卷积编码系统仿真结果)为基准,循环等差交织对应的曲线始终位于仅内码时的曲线下方;而卷积交织对应的曲线在信噪比低于2dB时位于仅内码时的曲线下方,在信噪比等于2dB时与仅内码时的曲线交叉,在信噪比高于2dB时才位于仅内码时的曲线下方和循环等差交织对应的曲线上方之间,在信噪比为3dB到4dB的范围时,卷积交织对应的曲线和循环等差交织对应的曲线重合,在信噪比高于3dB时卷积交织对应的曲线才位于循环等差交织对应的曲线下方。因此,我们只能初步推论,卷积交织和循环等差交织性能接近,在信噪比为4dB到5dB的范围时,卷积交织性能稍优于循环等差交织,在信噪比高于5dB时因为受仿真序列长度限制,测不到误码率有效值,无法作出判断(受仿真设备和时间复杂度限制,无法增加仿真序列长度的数量级)。
HAMMING码、卷积码、级联码(两种交织方式)性能比较如图所示,相同信噪比条件下,按照仿真结果误码率从高到低顺序依次为:未编码系统、(7,4)HAMMING编码系统、(2,1,3)卷积编码系统、级联码编码系统,从而可以得出编码纠错能力从大到小的排序为:级联码 ( 外编码采用(7,4)HAMMING码,交织编码采用(7,4)卷积交织编码,内编码采用(2,1,3)卷积码 ),(2,1,3)卷积码、(7,4)HAMMING码。

信道编码与扩频通信直接扩频技术是二十一世纪通信的主要潮流之一。特别是在移动通信领域,码分多址已经成为公认的二十一世纪蜂窝式移动通信基本特征。故而通过仿真手段讨论扩频通信与信道编码的关系,具有相当重要的现实意义。从某种意义上说,直接扩频技术也可以看作一种信道编码的分组编码形式,编译码都是通过码序列分组和同一个PN码的乘运算实现。应用这一思想,可以进行二进制双极性扩频通信系统的蒙特卡罗仿真。
二进制双极性扩频通信系统的蒙特卡罗仿真双用户二进制双极性扩频通信系统的蒙特卡罗仿真模型
输出数据1
±E r
n A sin(wn)
±E r
输出数据2
双用户二进制双极性扩频通信系统的蒙特卡罗仿真流程图
N
Y
为了简化二进制双极性扩频通信系统的蒙特卡罗仿真模型,使我们把主要精力真正集中于编码仿真本身,本次仿真用户数为2,PN码采用长度为30的gold码。如上图所示,双用户二进制双极性扩频通信系统的蒙特卡罗仿真模型中还加入了正弦干扰序列发生器,以用来测试扩频技术对人为正弦干扰的抑制作用。在双用户二进制双极性扩频通信系统的蒙特卡罗仿真流程图中,正弦干扰被视做噪声的一部分置于叠加噪声模块。
MATLAB源程序
function [p1,p2]=ss_Pe94_2105(snr_in_dB,A,w)
%ss_Pe94_2105.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真
%snr_in_dB 信噪比
%p 误码率
%A 正弦干扰幅度
%w 正弦干扰角频率
%PN码采用长度Lc为30的gold码,Lc=length(gold)=30
snr=10^(snr_in_dB/10);
sgma=1;
Eb=2*sgma^2*snr;
N=10^5; %仿真序列长度10^5,运行时间约3分钟
p1=0;
p2=0;
gold1=[0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0];
gold2=[0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1];
Lc=length(gold1); %Lc=30;
pn_seq1=2*gold1-1;
pn_seq2=2*gold2-1;
E_chip=Eb/Lc;
temp=0;
data1=0;
data2=0;
repeated_data1=zeros(1,Lc);
repeated_data2=zeros(1,Lc);
trans_sig1=zeros(1,Lc);
trans_sig2=zeros(1,Lc);
noise=zeros(1,Lc);
n=1:Lc;
interference=zeros(1,Lc);
rec_sig=zeros(1,Lc);
temp1=zeros(1,Lc);
temp2=zeros(1,Lc);
decision_variable1=0;
decision_variable2=0;
decision1=0;
decision2=0;
num_of_err_1=0;
num_of_err_2=0;
time=0;
for i=1:N
temp=rand;
if (temp<0.5)
data1=-1;
else
data1=1;
end
for j=1:Lc
repeated_data1(j)=data1;
end
trans_sig1=sqrt(E_chip)*repeated_data1.*pn_seq1;
temp=rand;
if (temp<0.5)
data2=-1;
else
data2=1;
end
for j=1:Lc
repeated_data2(j)=data2;
end
trans_sig2=sqrt(E_chip)*repeated_data2.*pn_seq2;
noise=sgma*randn(1,Lc);
time=time+1,
n=(time-1)*Lc+1:time*Lc;
interference=A*sin(w*n);
rec_sig=trans_sig1+trans_sig2+noise+interference;
temp1=rec_sig.*pn_seq1;
decision_variable1=sum(temp1);
if (decision_variable1<0)
decision1=-1;
else
decision1=1;
end
if (decision1~=data1)
num_of_err_1=num_of_err_1+1;
end
temp2=rec_sig.*pn_seq2;
decision_variable2=sum(temp2);
if (decision_variable2<0)
decision2=-1;
else
decision2=1;
end
if (decision2~=data2)
num_of_err_2=num_of_err_2+1;
end
end
num_of_err_1,
num_of_err_2,
p1=num_of_err_1/N;
p2=num_of_err_2/N;
%ss_Pe94_2105.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真
echo on
%cd94_2_030_105.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真绘图
%PN码采用长度Lc为30的gold码,Lc=length(gold)=30
%仿真序列长度10^5,运行时间约1小时
A1=3;A2=7;A3=12;A4=0;%A1 A2 A3 A4 正弦干扰幅度
w0=1;%w0 正弦干扰角频率
SNRindB=0:2:30;
for i=1:length(SNRindB)
[smld_err_prb11(i),smld_err_prb12(i)]=ss_Pe94_2105(SNRindB(i),A1,w0);
[smld_err_prb21(i),smld_err_prb22(i)]=ss_Pe94_2105(SNRindB(i),A2,w0);
[smld_err_prb31(i),smld_err_prb32(i)]=ss_Pe94_2105(SNRindB(i),A3,w0);
[smld_err_prb41(i),smld_err_prb42(i)]=ss_Pe94_2105(SNRindB(i),A4,w0);
end;
%绘图函数
semilogy(SNRindB,smld_err_prb11,'mx-');
title('双用户二进制双极性扩频通信系统的蒙特卡罗仿真')
axis([0,30,10^(-5),1])
hold on
semilogy(SNRindB,smld_err_prb12,'mo-');
semilogy(SNRindB,smld_err_prb21,'gx-');
semilogy(SNRindB,smld_err_prb22,'go-');
semilogy(SNRindB,smld_err_prb31,'kx-');
semilogy(SNRindB,smld_err_prb32,'ko-');
semilogy(SNRindB,smld_err_prb41,'rx-');
semilogy(SNRindB,smld_err_prb42,'ro-');
%绘图函数
SNRindB2=0:0.1:30;
theo_err_prb=zeros(1,length(SNRindB2));
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb(i)=Qfunct(sqrt(2*SNR));
%Qfunct y=(1/2)*erfc(x/sqrt(2)); 理论误码率公式
end
semilogy(SNRindB2,theo_err_prb,'b:'); %绘图函数
%cd94_2_030_105.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真绘图运行结果下图(cd94_2_030_105的运行结果)给出了不同信噪比条件(0dB-30dB)和不同幅度(A1=3、A2=7、A3=12、A4=0)正弦干扰下,发送100000比特的双用户二进制双极性扩频通信系统的蒙特卡罗仿真结果以及理论值曲线。
从仿真结果来看,无正弦干扰下的蒙特卡罗仿真结果与理论值曲线吻合程度好的令人惊叹,仿真中两用户在同一信道真正实现了和平共处,因此用蒙特卡罗仿真模型来模拟实际双用户二进制双极性扩频通信系统,是可以被接受的;同时可以看出,扩频技术对人为的正弦干扰具有抑制能力,并且对于同样的人为正弦干扰,不同gold码的抑制干扰能力相对来说也有高下之分,在本次仿真中,用户1使用的gold码抑制正弦干扰能力更强。

级联码对双用户二进制双极性扩频系统误码性能的改善无正弦干扰下的仿真结果和扩频理论都已经说明,从单个用户角度来看,双用户二进制双极性扩频通信系统和原来的单用户二进制双极性通信系统是相同的。于是我们可以推论,在双用户二进制双极性扩频通信系统中对上文各种信道编码性能测试结果,也将和前面的测试结果相同,即按照误码率性能指标,信道编码的最好方案是级联码。另外,考虑到实际应用信道编码时通常采用级联码,本次双用户二进制双极性扩频通信系统中的信道编码仿真采用了级联码。
在双用户二进制双极性扩频通信系统的蒙特卡罗仿真模型框图中加入级联码的编译码器,就构成了测试级联码对双用户二进制双极性扩频通信系统误码性能改善的蒙特卡罗仿真模型,系统框图如下:
双用户二进制双极性扩频级联码通信系统的蒙特卡罗仿真模型
数据1
±E r
n A sin(wn)
±E r
数据2
双用户二进制双极性扩频级联码通信系统的蒙特卡罗仿真流程图
N
Y
MATLAB源程序
function [p1,p2]=ss_Pe94_2(snr_in_dB,A,w)
%ss_Pe94_2.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真函数
%snr_in_dB 信噪比
%p 误码率
%A 正弦干扰幅度
%w 正弦干扰角频率
%PN码采用长度Lc为30的gold码,Lc=length(gold)=30
snr=10^(snr_in_dB/10);
sgma=1;
Eb=2*sgma^2*snr;
N=16; %N
loop=10^4; %loop
Ns=N*loop1*loop2; %仿真序列长度loop*N=16*10^4,运行时间约5分钟
p1=0;
p2=0;
gold1=[0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0];
gold2=[0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1];
Lc=length(gold1); %Lc=30;
pn_seq1=2*gold1-1;
pn_seq2=2*gold2-1;
E_chip=Eb/Lc;
temp=0;
data1=0;
data2=0;
repeated_data1=zeros(1,Lc);
repeated_data2=zeros(1,Lc);
trans_sig1=zeros(1,Lc);
trans_sig2=zeros(1,Lc);
noise=zeros(1,Lc);
n=1:Lc;
interference=zeros(1,Lc);
rec_sig=zeros(1,Lc);
temp1=zeros(1,Lc);
temp2=zeros(1,Lc);
decision_variable1=0;
decision_variable2=0;
decision1=0;
decision2=0;
num_of_err_1=0;
num_of_err_2=0;
time=0;
for h=1:loop
for i=1:N
temp=rand;
if (temp<0.5)
data1=-1;
else
data1=1;
end
for j=1:Lc
repeated_data1(j)=data1;
end
trans_sig1=sqrt(E_chip)*repeated_data1.*pn_seq1;
temp=rand;
if (temp<0.5)
data2=-1;
else
data2=1;
end
for j=1:Lc
repeated_data2(j)=data2;
end
trans_sig2=sqrt(E_chip)*repeated_data2.*pn_seq2;
noise=sgma*randn(1,Lc);
time=time+1,
n=(time-1)*Lc+1:time*Lc;
interference=A*sin(w*n);
rec_sig=trans_sig1+trans_sig2+noise+interference;
temp1=rec_sig.*pn_seq1;
decision_variable1=sum(temp1);
if (decision_variable1<0)
decision1=-1;
else
decision1=1;
end
if (decision1~=data1)
num_of_err_1=num_of_err_1+1;
end
temp2=rec_sig.*pn_seq2;
decision_variable2=sum(temp2);
if (decision_variable2<0)
decision2=-1;
else
decision2=1;
end
if (decision2~=data2)
num_of_err_2=num_of_err_2+1;
end
end
end
num_of_err_1,
num_of_err_2,
p1=num_of_err_1/Ns;
p2=num_of_err_2/Ns;
%ss_Pe94_2.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真函数
function [p1,p2]=ss_Pe94_2_cnv_jz_74(snr_in_dB,A,w)
%ss_Pe94_2_cnv_jz_74.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真函数
%snr_in_dB 信噪比
%p 误码率
%A 正弦干扰幅度
%w 正弦干扰角频率
%PN码采用长度Lc为30的gold码,Lc=length(gold)=30
snr=10^(snr_in_dB/10);
sgma=1;
Eb=2*sgma^2*snr;
N=16; %N
loop=10^4; %loop
Ns=N*loop; %仿真序列长度Ns=loop*N=16*10^4,运行时间约15分钟dsource1=zeros(1,N);
dsource2=zeros(1,N);
output1_h74=hamming74(dsource1);
output2_h74=hamming74(dsource2);
G=[1 0 1 1 ; 1 1 1 1 ];
k=1;
output_cnv_encd1=cnv_encd(G,k,output1_h74);
output_cnv_encd2=cnv_encd(G,k,output2_h74);
channel_output1=zeros(1,length(output_cnv_encd2));
channel_output2=zeros(1,length(output_cnv_encd2));
[decoder_output1,survivor_state1,cumulated_metric1]=viterbi(G,k,channel_output1);
[decoder_output2,survivor_state2,cumulated_metric2]=viterbi(G,k,channel_output2);
[h4output1,h7output1]=h47(decoder_output1);
[h4output2,h7output2]=h47(decoder_output2);
p1=0;
p2=0;
numoferr1=0;
numoferr2=0;
num_of_err_1=0;
num_of_err_2=0;
cnv_jz_74_time=0;
gold1=[0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0];
gold2=[0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1];
Lc=length(gold1); %Lc=30;
pn_seq1=2*gold1-1;
pn_seq2=2*gold2-1;
E_chip=Eb/Lc;
temp=0;
data1=0;
data2=0;
repeated_data1=zeros(1,Lc);
repeated_data2=zeros(1,Lc);
trans_sig1=zeros(1,Lc);
trans_sig2=zeros(1,Lc);
noise=zeros(1,Lc);
n=1:Lc;
interference=zeros(1,Lc);
rec_sig=zeros(1,Lc);
temp1=zeros(1,Lc);
temp2=zeros(1,Lc);
decision_variable1=0;
decision_variable2=0;
decision1=0;
decision2=0;
for h=1:loop
for i=1:N
temp=rand;
if (temp<0.5)
dsource1(i)=0;
else
dsource1(i)=1;
end
temp=rand;
if (temp<0.5)
dsource2(i)=0;
else
dsource2(i)=1;
end
end
%length(dsource) 28
output1_h74=hamming74(dsource1);
output2_h74=hamming74(dsource2);
output1_jz28=jiaozhi(output1_h74,28);
output2_jz28=jiaozhi(output2_h74,28);
output_cnv_encd1=cnv_encd(G,k,output1_jz28);
output_cnv_encd2=cnv_encd(G,k,output2_jz28);
%length(output_cnv_encd),pause
for m=1:length(output_cnv_encd1)%=length(output_cnv_encd2)
data1=2*output_cnv_encd1(m)-1;
data2=2*output_cnv_encd2(m)-1;
for j=1:Lc
repeated_data1(j)=data1;
repeated_data2(j)=data2;
end
trans_sig1=sqrt(E_chip)*repeated_data1.*pn_seq1;
trans_sig2=sqrt(E_chip)*repeated_data2.*pn_seq2;
noise=sgma*randn(1,Lc);
cnv_jz_74_time=cnv_jz_74_time+1;
n=(cnv_jz_74_time-1)*Lc+1:cnv_jz_74_time*Lc;
interference=A*sin(w*n);
rec_sig=trans_sig1+trans_sig2+noise+interference;
%
temp1=rec_sig.*pn_seq1;
decision_variable1=sum(temp1);
if (decision_variable1<0)
decision1=-1;
else
decision1=1;
end
if (decision1~=data1)
num_of_err_1=num_of_err_1+1;
end
%
temp2=rec_sig.*pn_seq2;
decision_variable2=sum(temp2);
if (decision_variable2<0)
decision2=-1;
else
decision2=1;
end
if (decision2~=data2)
num_of_err_2=num_of_err_2+1;
end
%
channel_output1(m)=(decision1+1)/2;
channel_output2(m)=(decision2+1)/2;
%
end
[decoder_output1,survivor_state1,cumulated_metric1]=viterbi(G,k,channel_output1);
[decoder_output2,survivor_state2,cumulated_metric2]=viterbi(G,k,channel_output2);
[decoder_output1_jjz28]=jiejiaozhi(decoder_output1,28);
[decoder_output2_jjz28]=jiejiaozhi(decoder_output2,28);
[h4output1,h7output1]=h47(decoder_output1_jjz28);
[h4output2,h7output2]=h47(decoder_output2_jjz28);
for i=1:N%=length(dsource1)=length(dsource2)
if(h4output1(i)~=dsource1(i))
numoferr1=numoferr1+1;
end
if(h4output2(i)~=dsource2(i))
numoferr2=numoferr2+1;
end
end
end
num_of_err_1,
numoferr1,
num_of_err_1-numoferr1,
num_of_err_2,
numoferr2,
num_of_err_2-numoferr2,
p1=numoferr1/Ns;
p2=numoferr2/Ns;
%ss_Pe94_2_cnv_jz_74.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真函数
echo on
%cd94_2_0216_jz.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真绘图
%仿真序列长度Ns=loop*N=16*10^4,运行时间约12小时
A1=3;A2=7;A3=12;A4=0;
%A1 A2 A3 A4 正弦干扰幅度
w0=1;
%w0 正弦干扰角频率
SNRindB=0:2:16;
smld_err_prb110=zeros(1,length(SNRindB));
smld_err_prb120=zeros(1,length(SNRindB));
smld_err_prb210=zeros(1,length(SNRindB));
smld_err_prb220=zeros(1,length(SNRindB));
smld_err_prb310=zeros(1,length(SNRindB));
smld_err_prb320=zeros(1,length(SNRindB));
smld_err_prb410=zeros(1,length(SNRindB));
smld_err_prb420=zeros(1,length(SNRindB));
smld_err_jz_prb11=zeros(1,length(SNRindB));
smld_err_jz_prb12=zeros(1,length(SNRindB));
smld_err_jz_prb21=zeros(1,length(SNRindB));
smld_err_jz_prb22=zeros(1,length(SNRindB));
smld_err_jz_prb31=zeros(1,length(SNRindB));
smld_err_jz_prb32=zeros(1,length(SNRindB));
smld_err_jz_prb41=zeros(1,length(SNRindB));
smld_err_jz_prb42=zeros(1,length(SNRindB));
for i=1:length(SNRindB)
i,SNRindB(i),
[smld_err_prb110(i),smld_err_prb120(i)]=ss_Pe94_2(SNRindB(i),A1,w0);
[smld_err_prb210(i),smld_err_prb220(i)]=ss_Pe94_2(SNRindB(i),A2,w0);
[smld_err_prb310(i),smld_err_prb320(i)]=ss_Pe94_2(SNRindB(i),A3,w0);
[smld_err_prb410(i),smld_err_prb420(i)]=ss_Pe94_2(SNRindB(i),A4,w0);
end;
for i=1:length(SNRindB)
i,SNRindB(i),
[smld_err_jz_prb11(i),smld_err_jz_prb12(i)]=ss_Pe94_2_cnv_jz_74(SNRindB(i),A1,w0);
[smld_err_jz_prb21(i),smld_err_jz_prb22(i)]=ss_Pe94_2_cnv_jz_74(SNRindB(i),A2,w0);
[smld_err_jz_prb31(i),smld_err_jz_prb32(i)]=ss_Pe94_2_cnv_jz_74(SNRindB(i),A3,w0);
[smld_err_jz_prb41(i),smld_err_jz_prb42(i)]=ss_Pe94_2_cnv_jz_74(SNRindB(i),A4,w0);
end;
%绘图函数
figure;
semilogy(SNRindB,smld_err_jz_prb42,'r>:');
axis([0,16,1e-5,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('双用户级联编码及未编码扩频系统仿真误比特率曲线比较');
hold on
semilogy(SNRindB,smld_err_jz_prb11,'m<:');
semilogy(SNRindB,smld_err_jz_prb12,'m>:');
semilogy(SNRindB,smld_err_jz_prb21,'g<:');
semilogy(SNRindB,smld_err_jz_prb22,'g>:');
semilogy(SNRindB,smld_err_jz_prb31,'k<:');
semilogy(SNRindB,smld_err_jz_prb32,'k>:');
semilogy(SNRindB,smld_err_jz_prb41,'r<:');
semilogy(SNRindB,smld_err_jz_prb42,'r>:');
semilogy(SNRindB,smld_err_prb110,'mx-');
semilogy(SNRindB,smld_err_prb120,'mo-');
semilogy(SNRindB,smld_err_prb210,'gx-');
semilogy(SNRindB,smld_err_prb220,'go-');
semilogy(SNRindB,smld_err_prb310,'kx-');
semilogy(SNRindB,smld_err_prb320,'ko-');
semilogy(SNRindB,smld_err_prb410,'rx-');
semilogy(SNRindB,smld_err_prb420,'ro-');
%绘图函数
SNRindB2=0:0.1:16;
theo_err_prb=zeros(1,length(SNRindB2));
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb(i)=Qfunct(sqrt(2*SNR));
%Qfunct y=(1/2)*erfc(x/sqrt(2)); 理论误码率公式
end
hold on
semilogy(SNRindB2,theo_err_prb,'b:'); %绘图函数
%cd94_2_0216_jz.m 双用户二进制双极性扩频通信系统的蒙特卡罗仿真绘图运行结果下图(cd94_2_0216_jz的运行结果)给出了不同信噪比条件(0dB-16dB)和不同幅度(A1=3、A2=7、A3=12、A4=0)正弦干扰下,发送160000比特的双用户二进制双极性扩频级联码 ( 外编码采用(7,4)HAMMING码,交织编码采用(7,4)卷积交织编码,内编码采用(2,1,3)卷积码 ) 通信系统和未编码的双用户二进制双极性扩频通信系统蒙特卡罗仿真结果以及理论值曲线。
从仿真结果来看,无正弦干扰下,级联码能够很好的降低扩频通信系统误码率性能指标;在人为正弦干扰下,级联码能够很好的提高扩频技术的抑制正弦干扰能力,但是,信噪比过低或者正弦干扰幅度太大都不利于级联码作用的发挥,甚至出现误码率性能指标稍有下降的情况。此外,如前所述,对于同样的人为正弦干扰,不同gold码的抑制干扰能力相对来说有高下之分,在本次仿真中,用户1使用的gold码抑制正弦干扰能力更强,特别是下图中正弦干扰幅度为3,信噪比为8dB时,代表级联码系统的点和未编码的双用户二进制双极性扩频通信系统理论值点重合,这意味着,此时级联码与正弦干扰完全相互抵销,对用户1来说级联码实现了屏蔽人为正弦干扰的作用。
总之,仿真结果说明,在二进制双极性扩频通信系统中采用级联码,能够实现信道复用和误码性能的双赢。

结 束 语在此,首先感谢邵志嘉老师。没有他的悉心关怀和耐心指导,完成本文对于笔者个人来说是几乎完全不可想象的。虽然本文只是对二进制双极性通信系统的信道编码进行了一些粗略的基本的仿真工作,没有什么创新可言,但是对于笔者本人来说,已经倾尽所学。本文完全可以看作是笔者对自己在过去所学得的信道编码知识的大检阅。对过去而言,这是一次总结,对于将来,则是新的迈向更高知识阶梯的又一起点。
本文的最大教训,就在于在仿真最初阶段忽视了时间复杂度的估算,以致其后的大量时间被浪费在对结果的等待和中途重新回过头来对源代码的优化,这直接导致了本文完成时间的一拖再拖,令笔者深刻反省。这惨痛的教训,或许也正是本文的最大意义和存在理由之所在。
最后,在此特别感谢北邮电信的白长青老师,他在编程调试方面的指导和大力支持使本文得以最后完成。
主要参考文献
樊昌信等《通信原理(第四版)》 国防工业出版社王立宁等《MATLAB与通信仿真》 人民邮电出版社计算机仿真课程教学笔记吴伟陵《信息处理与编码》 北京邮电大学出版社