📄 ds-cdma.asv
字号:
% Program 5-6
%
% Simulation program to realize DS-CDMA system
%
% dscdma.m
%
% Programmed by yixiongshu,2006.8.9
clear all;
clc;
%----------------------preparation part -----------------------------
sr=256000.0; % symboll rate
ml=2; % number of modulation levels
br=sr*ml; % bit rate
nd=100; % number of symbol
ebno=8; % Ebno
%-----------------------------------------------Filter initialization-----------------
irfn=21;
IPOINT=8;
alfs=0.5;
[xh]=hrollfcoef(irfn,IPOINT,sr,alfs,1); % Transmitting Filter
[xh2]=hrollfcoef(irfn,IPOINT,sr,alfs,0); % Received Filter
%------------------------------ Spreading code initialization--------------------
user=1; % number of users
seq=1; % 1:m-sequence 2:Gold 3:orthogonal Gold
stage=3;
ptap1=[1 3];
ptap2=[2 3];
regi1=[1 1 1];
regi2=[1 1 1];
% ----------------------------- Generation of the spreading code --------
switch seq
case 1
code=mseq(stage,ptap1,regi1,user);
case 2
m1=mseq(stage,ptap1,regi1);
m2=mseq(stage,ptap2,regi2);
code=goldseq(m1,m2,user);
case 3
m1=mseq(stage,ptap1,regi1);
m2=mseq(stage,ptap2,regi2);
code=[goldseq(m1,m2,user),zeros(user,1)];
end
code=code*2-1;
clen=length(code);
% ---------------------------------- Fading initialization ---------------
rfade=0; % Rayleigh fading 0:nothing 1:consider
itau=[0,8]; % delay time
dlvl1=[0.0,40.0]; % attenuation level
n0=[6,7];
th1=[0.0,0.0];
itnd1=[3001,4004];
now1=2;
tstp=1/sr/IPOINT/clen; % time resolution
fd=160;
flat=1;
itnde1=nd*IPOINT*clen*30;
% ----------------------------- Start calculation -------------
nloop=1000;
noe=0;
nod=0;
for ii=1:nloop
% -------------------------- Transmitter ---------------------
data=rand(user,nd*ml)>0.5;
[ich,qch]=qpskmod(data,user,nd,ml);
[ich1,qch1]=spread(ich,qch,code);
[ich2,qch2]=compoversamp2(ich1,qch1,IPOINT);
[ich3,qch3]=compconv2(ich2,qch2,xh);
if user==1
ich4=ich3;
qch4=qch3;
else
ich4=sum(ich3);
qch4=sum(qch3);
end
% -------------------------- Fading channel -------------------
if rfade==0
ich5=ich4;
qch5=qch4;
else
[ich5,qch5]=sefade(ich4,qch4,itau,dlvl1,th1,n0,itnd1,...
now1,length(ich4),tstp,fd,flat);
itnd1=itnd1+itnde1;
end
% ---------------------------------- Receiver -----------------------------
spow=sum(rot90(ich3.^2+qch3.^2))/nd;
attn=sqrt(0.5*spow*sr/br*10^(-ebno/10));
[ich6,qch6]=comb2(ich5,qch5,attn);
[ich7,qch7]=compconv2(ich6,qch6,xh2); % filter
samp1=irfn*IPOINT+1;
ich8=ich7(:,samp1:IPOINT:IPOINT*nd*clen+samp1-1);
qch8=qch7(:,samp1:IPOINT:IPOINT*nd*clen+samp1-1);
[ich9 qch9]=despread(ich8,qch8,code);
demodata=qpskdemod(ich9,qch9,user,nd,ml); % QPSK demodulation
%--------------------- BER -----------------------------
noe2=sum(sum(abs(data-demodata)));
nod2=user*nd*ml;
noe=noe+noe2;
nod=nod+nod2;
% fprintf('%d\t%e\n',ii,noe2/nod2);
end
% ------------------------------Data file --------------------------
ber=noe/nod;
fprintf('%d\t%d\t%d\t%e\n',ebno,noe,nod,ber);
fid=fopen('BER.mat','a');
fprintf(fid,'%d\t%d\t%d\t%e\n',ebno,noe,nod,ber);
fclose(fid);
% --------------------------- end of file ----------------------
% qpskdemod.m
function [demodata]=qpskdemod(idata,qdata,para,nd,ml)
demodata=zeros(para,ml*nd);
demodata((1:para),(1:ml:ml*nd-1))=idata((1:para),(1:nd))>=0;
demodata((1:para),(2:ml:ml*nd))=qdata((1:para),(1:nd))>=0;
% qpskmod.m
function [iout,qout]=qpskmod(paradata,para,nd,ml)
m2=ml./2;
paradata2=paradata.*2-1;
count2=0;
for jj=1:nd
isi=zeros(para,1);
isq=zeros(para,1);
for ii=1:m2
isi=isi+2.^(m2-ii).*paradata2((1:para),ii+count2);
isq=isq+2.^(m2-ii).*paradata2((1:para),m2+ii+count2);
end
iout((1:para),jj)=isi;
qout((1:para),jj)=isq;
count2=count2+ml;
end
% sefade.m
%
% This function generates frequency selecting fading
%
function [iout,qout,ramp,rcos,rsin]=sefade(idata,qdata,itau,...
dlvl,th,n0,itn,n1,nsamp,tstp,fd,flat)
%************************ variables *****************************
% idata input Ich data
% qdata input Qch data
% iout output Ich data
% qout output Qch data
% ramp : Amplitude contaminated by fading
% rcos : Cosine value contaminated by fading
% rsin : Sine value contaminated by fading
% itau : Delay time for each multipath fading
% dlvl : Attenuation level for each multipath fading
% th : Initialized phase for each multipath fading
% n0 : Number of waves in order to generate each multipath fading
% itn : Fading counter for each multipath fading
% n1 : Number of summation for direct and delayed waves
% nsamp: Total number of symbols
% tstp : Minimum time resolution
% fd : Maximum doppler frequency
% flat : flat fading or not
iout=zeros(1,nsamp);
qout=zeros(1,nsamp);
total_attn=sum(10.^(-1.0.*dlvl./10.0));
for k=1:n1
atts=10.^(-0.05.*dlvl(k));
if dlvl(k)==40.0
atts=0.0;
end
theta=th(k).*pi./180.0;
[itmp,qtmp]=delay(idata,qdata,nsamp,itau(k));
[itmp3,qtmp3,ramp,rcos,rsin]=fade(itmp,qtmp,...
nsamp,tstp,fd,n0(k),itn(k),flat);
iout=iout+atts.*itmp3./sqrt(total_attn);
qout=qout+atts.*qtmp3./sqrt(total_attn);
end
% Program 5-3
% shift.m
%
% Shift the contents of the register
%
% Programmed by yixiongshu,2006.8.9
function [outregi]=shift(inregi,shiftr,shiftu)
%
% inregi : Vector or matrix
% shiftr : The amount of shift to the right.
% shiftu : The amount of shift to the top.
% outregi: Register output
% ----------------------------------------------------
[h,v]=size(inregi);
outregi=inregi;
shiftr=rem(shiftr,v);
shiftu=rem(shiftu,h);
if shiftr>0
outregi(:,1:shiftr)=inregi(:,v-shiftr+1:v);
outregi(:,1+shiftr:v)=inregi(:,1:v-shiftr);
elseif shiftr<0
outregi(:,1:v+shiftr)=inregi(:,1-shiftr:v);
outregi(:,v+shiftr+1:v)=inregi(:,1:-shiftr);
end
inregi=outregi;
if shiftu>0
outregi(1:h-shiftu,:)=inregi(1+shiftu:h,:);
outregi(h-shiftu+1:h,:)=inregi(1:shiftu,:);
elseif shiftu<0
outregi(1:-shiftu,:)=inregi(h+shiftu+1:h,:);
outregi(1-shiftu:h,:)=inregi(1:h+shiftu,:);
end
% end of file.
% Program 5-7
% spread.m
%
% Data spread function
%
% programmed by yixongshu,2006.8.9
function [iout,qout]=spread(idata,qdata,code1);
%
% code1: spread code sequence
%
switch nargin
case{0,1}
error('lack of input argument');
case 2
code1=qdata;
qdata=idata;
end
[hn,vn]=size(idata);
[hc,vc]=size(code1);
if hn>hc
error('lack of spread code sequences');
end
iout=zeros(hn,vn*vc);
qout=zeros(hn,vn*vc);
for ii=1:hn % spread the information correctly.
iout(ii,:)=reshape(rot90(code1(ii,:),3)...
*idata(ii,:),1,vn*vc);
qout(ii,:)=reshape(rot90(code1(ii,:),3)...
*qdata(ii,:),1,vn*vc);
end
% end of file.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -