IS95仿真源程序.docx
《IS95仿真源程序.docx》由会员分享,可在线阅读,更多相关《IS95仿真源程序.docx(23页珍藏版)》请在冰点文库上搜索。
IS95仿真源程序
本科毕业设计
IS-95前向链路通信系统的设计与仿真
(附录)
姓名李家蓬
学院信息与电气工程学院
专业电子信息工程专业
年级2008级
学号***********
指导教师王丽丽
2012年5月21日
IS-95系统仿真源程序
%main_IS95_forward.m
%此函数用于IS-95前向链路系统的仿真,包括扩
%频调制,匹配滤波,RAKE接收等相关通信模块。
%仿真环境:
加性高斯白噪声信道.
%数据速率=9600KBps
%
clearall
closeall
clc
disp('--------------start-------------------');
globalZiZqZsshowRGiGq
clearj;
show=0;
SD=0;%选择软/硬判决接收
%-------------------主要的仿真参数设置------------------
BitRate=9600;
ChipRate=1228800;
N=184;
MFType=1;%匹配滤波器类型--升余弦
R=5;
%+++++++++++++++++++Viterbi生成多项式++++++++++++++++++
G_Vit=[111101011;101110001];
K=size(G_Vit,2);
L=size(G_Vit,1);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++Walsh矩阵++++++++++++++++++++++++
WLen=64;
Walsh=reshape([1;0]*ones(1,WLen/2),WLen,1);
%Walsh=zeros(WLen,1);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++扩频调制PN码的生成多项式++++++++++++++
%Gi=[1010001110100001]';
%Gq=[1001110001111001]';
Gi_ind=[15,13,9,8,7,5,0]';
Gq_ind=[15,12,11,10,6,5,4,3,0]';
Gi=zeros(16,1);
Gi(16-Gi_ind)=ones(size(Gi_ind));
Zi=[zeros(length(Gi)-1,1);1];
%I路信道PN码生成器的初始状态
Gq=zeros(16,1);
Gq(16-Gq_ind)=ones(size(Gq_ind));
Zq=[zeros(length(Gq)-1,1);1];
%Q路信道PN码生成器的初始状态
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++扰码生成多项式++++++++++++++++++++++
Gs_ind=[42,35,33,31,27,26,25,22,21,19,18,17,16,10,7,6,5,3,2,1,0]';
Gs=zeros(43,1);
Gs(43-Gs_ind)=ones(size(Gs_ind));
Zs=[zeros(length(Gs)-1,1);1];
%长序列生成器的初始状态
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++AWGN信道++++++++++++++++++++++++
EbEc=10*log10(ChipRate/BitRate);
EbEcVit=10*log10(L);
EbNo=[-2:
0.5:
6.5];%仿真信噪比范围(dB)
%EbNo=[2:
0.5:
2.5];
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%------------------------------------------------------
%-------------------------主程序-------------------------
ErrorsB=[];ErrorsC=[];NN=[];
if(SD==1)
fprintf('\nSOFTDecisionViterbiDecoder\n\n');
else
fprintf('\nHARDDecisionViterbiDecoder\n\n');
end
fori=1:
length(EbNo)
fprintf('\nProcessing%1.1f(dB)',EbNo(i));
iter=0;ErrB=0;ErrC=0;
while(ErrB<300)&(iter<150)
drawnow;
%++++++++++++++++++++++发射机+++++++++++++++++++++++
TxData=(randn(N,1)>0);
%速率为19.2Kcps
[TxChips,Scrambler]=PacketBuilder(TxData,G_Vit,Gs);
%速率为1.2288Mcps
[xPNMF]=Modulator(TxChips,MFType,Walsh);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++信道+++++++++++++++++++++++++++
noise=1/sqrt
(2)*sqrt(R/2)*(randn(size(x))+j*randn(size(x)))*10^(-(EbNo(i)-EbEc)/20);
r=x+noise;
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++++++接收机++++++++++++++++++++++++
RxSD=Demodulator(r,PN,MF,Walsh);%软判决,速率为19.2Kcps
RxHD=(RxSD>0);%定义接收码片的硬判决
if(SD)
[RxDataMetric]=ReceiverSD(RxSD,G_Vit,Scrambler);%软判决
else
[RxDataMetric]=ReceiverHD(RxHD,G_Vit,Scrambler);%硬判决
end
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(show)
subplot(311);plot(RxSD,'-o');title('SoftDecisions');
subplot(312);plot(xor(TxChips,RxHD),'-o');title('ChipErrors');
subplot(313);plot(xor(TxData,RxData),'-o');
title(['DataBitErrors.Metric=',num2str(Metric)]);
pause;
end
if(mod(iter,50)==0)
fprintf('.');
saveTempResultsErrBErrCNiter
end
ErrB=ErrB+sum(xor(RxData,TxData));
ErrC=ErrC+sum(xor(RxHD,TxChips));
iter=iter+1;
end
ErrorsB=[ErrorsB;ErrB];
ErrorsC=[ErrorsC;ErrC];
NN=[NN;N*iter];
saveSimData*
end
%+++++++++++++++++++++++++误码率计算++++++++++++++++++++++++
PerrB=ErrorsB./NN;
%PerrB1=ErrorsB1./NN1;
PerrC=ErrorsC./NN;
Pbpsk=1/2*erfc(sqrt(10.^(EbNo/10)));
PcVit=1/2*erfc(sqrt(10.^((EbNo-EbEcVit)/10)));
Pc=1/2*erfc(sqrt(10.^((EbNo-EbEc)/10)));
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%%+++++++++++++++++++++++++性能仿真显示++++++++++++++++++++++
figure;
semilogy(EbNo(1:
length(PerrB)),PerrB,'b-*');holdon;
%%semilogy(EbNo(1:
length(PerrB1)),PerrB1,'k-o');holdon;
%semilogy(EbNo(1:
length(PerrC)),PerrC,'b-o');gridon;
%semilogy(EbNo,Pbpsk,'b-.^');
%%semilogy(EbNo,PcVit,'k-.x');ylabel('BER');
%semilogy(EbNo,Pc,'b-.x');
xlabel('信噪比/dB');
ylabel('误码率');
gridon;
%legend('PbofSystem(HD)','PbofSystem(SD)','PcbeforeViterbiofSystem',
%...'PbofBPSKwithnoViterbi(theory)','PconReceiver(theory)');
%
%
%
%legend('PbofSystem','PcbeforeViterbiofSystem',...
%'PbofBPSKwithnoViterbi(theory)',
%'PcbeforeViterbi(theory)','PconReceiver(theory)');
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
disp('--------------end-------------------');
%------------------------------------------------------
%************************beginningoffile*****************************
%PacketBuilder.m
function[ChipsOut,Scrambler]=PacketBuilder(DataBits,G,Gs);
%
%此函数用于产生IS-95前向链路系统的发送数据包
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++
%DataBits发送数据(二进制形式)
%GViterbi编码生成多项式
%Gs长序列生成多项式(扰码生成多项式)
%ChipsOut输入到调制器的码序列(二进制形式)
%Scrambler扰码
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
globalZs
K=size(G,2);
L=size(G,1);
N=64*L*(length(DataBits)+K-1);%码片数(9.6Kbps->1.288Mbps)
chips=VitEnc(G,[DataBits;zeros(K-1,1)]);%Viterbi编码
%交织编码
INTERL=reshape(chips,24,16);%IN:
列,OUT:
行
chips=reshape(INTERL',length(chips),1);%速率=19.2KBps
%产生扰码
[LongSeqZs]=PNGen(Gs,Zs,N);
Scrambler=LongSeq(1:
64:
end);
ChipsOut=xor(chips,Scrambler);
%************************endoffile***********************************
%************************beginningoffile*****************************
%VitEnc.m
functiony=VitEnc(G,x);
%此函数根据生成多项式进行Viterbi编码
%
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++
%G生成多项式的矩阵
%x输入数据(二进制形式)
%yViterbi编码输出序列
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
K=size(G,1);
L=length(x);
yy=conv2(G,x');
yy=yy(:
1:
L);
y=reshape(yy,K*L,1);
y=mod(y,2);
%************************endoffile***********************************
%************************beginningoffile*****************************
%PNGen.m
function[y,Z]=PNGen(G,Zin,N);
%
%此函数是根据生成多项式和输入状态产生长度为N的伪随机序列
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++
%G生成多项式
%Zin移位寄存器初始化
%NPN序列长度
%y生成的PN码序列
%Z移位寄存器的输出状态
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
L=length(G);
Z=Zin;%移位寄存器的初始化
y=zeros(N,1);
fori=1:
N
y(i)=Z(L);
Z=xor(G*Z(L),Z);
Z=[Z(L);Z(1:
L-1)];
end
%yy=filter(1,flipud(G),[1;zeros(N-1,1)]);
%yy=mod(yy,2);
%************************endoffile***********************************
%************************beginningoffile*****************************
%Modulator.m
function[TxOut,PN,MF]=Modulator(chips,MFType,Walsh);
%
%此函数用于实现IS-95前向链路系统的数据调制
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++
%chips发送的初始数据
%MFType成型滤波器的类型选择
%Walshwalsh码
%TxOut调制输出信号序列
%PN用于扩频调制的PN码序列
%MF匹配滤波器参数
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
globalZiZqshowRGiGq
N=length(chips)*length(Walsh);
%输入速率=19.2KBps,输出速率=1.2288Mcps
tmp=sign(Walsh-1/2)*sign(chips'-1/2);
chips=reshape(tmp,prod(size(tmp)),1);
[PNiZi]=PNGen(Gi,Zi,N);
[PNqZq]=PNGen(Gq,Zq,N);
PN=sign(PNi-1/2)+j*sign(PNq-1/2);
chips_out=chips.*PN;
chips=[chips_out,zeros(N,R-1)];
chips=reshape(chips.',N*R,1);
%成型滤波器
switch(MFType)
case1
%升余弦滤波器
L=25;
L_2=floor(L/2);
n=[-L_2:
L_2];
B=0.7;
MF=sinc(n/R).*(cos(pi*B*n/R)./(1-(2*B*n/R).^2));
MF=MF/sqrt(sum(MF.^2));
case2
%矩形滤波器
L=R;
L_2=floor(L/2);
MF=ones(L,1);
MF=MF/sqrt(sum(MF.^2));
case3
%汉明滤波器
L=R;
L_2=floor(L/2);
MF=hamming(L);
MF=MF/sqrt(sum(MF.^2));
end
MF=MF(:
);
TxOut=sqrt(R)*conv(MF,chips)/sqrt
(2);
TxOut=TxOut(L_2+1:
end-L_2);
if(show)
figure;
subplot(211);plot(MF,'-o');title('MatchedFilter');gridon;
subplot(212);psd(TxOut,1024,1e3,113);title('Spectrum');
end
%************************endoffile***********************************
%************************beginningoffile*****************************
%Demodulator.m
function[SD]=Demodulator(RxIn,PN,MF,Walsh);
%
%此函数是实现基于RAKE接收机的IS-95前向信链路系统的数据包的解调
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++
%RxIn输入信号
%PNPN码序列(用于解扩)
%MF匹配滤波器参数
%Walsh用于解调的walsh码
%SDRAKE接收机的软判决输出
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
globalR
N=length(RxIn)/R;
L=length(MF);
L_2=floor(L/2);
rr=conv(flipud(conj(MF)),RxIn);
rr=rr(L_2+1:
end-L_2);
Rx=sign(real(rr(1:
R:
end)))+j*sign(imag(rr(1:
R:
end)));
Rx=reshape(Rx,64,N/64);
Walsh=ones(N/64,1)*sign(Walsh'-1/2);
PN=reshape(PN,64,N/64)';
PN=PN.*Walsh;
%输入速率=1.2288Mpbs,输出速率=19.2KBps
SD=PN*Rx;
SD=real(diag(SD));
%***********************endoffile***********************************
%************************beginningoffile*****************************
%ReceiverSD.m
function[DataOut,Metric]=ReceiverSD(SDchips,G,Scrambler);
%
%此函数用于实现基于Viterbi译码的发送数据的恢复
%+++++++++++++++++++++++var