wcdma in matlab
I hope this program is helpful!
%function wcdma_script()
clear all
clear
clc
fprintf('Start! Please wait ...\n');
Max_Err_Num=100;
r=3;
Mem_Len=8; %memory length of Viterbi Decoder.
Sur_Len=40; %survial length of .....
V=100; %km/h
SF_Bit=6;
SF=2^SF_Bit; %Spread factor
SF_DB=10*log10(SF);
Win_Len=15; %Window length for searching
Push = 3;
Max_Num=3; %Strong paths
Plt_Num=2; %Symbol:The integrated length for pilot estimation
Tc=1/3.84e6; %Chip duration according to digital bandwidth
Data_Rate=1/(SF*Tc); %bits/s
Chi_Num=1;
Chq_Num=1;
Ch_Num=Chi_Num+Chq_Num; %Channel Number for I&Q except Pilot channel
Idx_Perm=randperm(SF-1)+1;
Index=Idx_Perm(1:Ch_Num)';
Del_Idx=[1 2 4 5 8 11]; %Unit by chip
Del_Gain=[0.7766 0.6169 0.0978 0.0777 0.0246 0.0078];
C=3e8;
Fc=2.11e9;
phi=2*pi*rand(1,2);
N0=40;
%Fram_Len=192; %Signal length without tail bits.
Fram_Len=1/(100*SF*r*Tc)-Mem_Len; %Signal length without tail bits.
Intlv_Len=1/(100*SF*Tc);
%Intlv_Vec=randperm(Intlv_Len));
Intlv_Idx=[96 100;64 75;48 50;30 40;24 25;15 20;10 15]; %SF between 2 and 8
Intlv_Vec=reshape(1:Intlv_Len,Intlv_Idx(SF_Bit-1,1),Intlv_Idx(SF_Bit-1,2))';
Intlv_Vec=Intlv_Vec
);
Max_Del=max(Del_Idx); %Max time delay
Path_Num=length(Del_Idx); %Time invariant multipath
Wal_Mat=ones(length(Index),1);
for k=1:SF_Bit
Wal_Mat=[Wal_Mat Wal_Mat.*((1-2*bitget(Index,k))*ones(1,size(Wal_Mat,2)))];
end
N=4*N0;
M=Path_Num;
Ank=2*pi/(N*M)*((0:N0-1)'*ones(1,M)*M+ones(N0,1)*(0:M-1)+1/4);
Wm=2*pi*V*Fc/C*1000/3600;
Win_Zero=zeros(1,Win_Len); %initialize
Sig_Rec=Win_Zero; %Buffer for received signal
Sig_Est=Win_Zero; %Buffer for estimation
fp=fopen('ber.dat','a+');
fprintf(fp,'%%SNR Ber');
fprintf(fp,'\n');
fclose(fp);
%------------------------------------
for SNR=1:9
fprintf('*** SNR = %5.3f dB\n',SNR);
Err_Num=zeros(1,Ch_Num);
Init1=[ ones(1,25) -1]; %For Gold sequence, 0-->1; 1-->-1
Init2=[-ones(1,25) -1];
Sig_Org=zeros(1,Max_Del); %Buffer for source signal
Tx=zeros(2*Fram_Len,Ch_Num);
Gold_Buf=zeros(1,Win_Len-Push+1);
kk=0;
pp=0;
%--Programm
while(min(Err_Num)<Max_Err_Num) %Max_Err_Num=100;
kk=kk+1;
Gold=(Init1(1)*Init2(1)+j*prod(Init1([5 8 19]))*prod(Init2([5 7 17])));%Gold sequence
Init1=[Init1(2:end) Init1(1)*Init1(4)]; %Shift
Init2=[Init2(2:end) prod(Init2(1:4))];
Gold_Buf=[Gold Gold_Buf(1:end-1)];
Flag_Fram=mod(kk-1,SF*r*(Fram_Len+Mem_Len))+1;
if(Flag_Fram==1)
Tx_Tmp=randint(Fram_Len,Ch_Num); %Encode for every coder channel.
Rnd_Sour=cnv_enc(Tx_Tmp,Mem_Len,r)'; %cnv_enc: hidden file
Rnd_Sour=Rnd_Sour
,Intlv_Vec); %Intleaver
Tx=[Tx(Fram_Len+1:end,
;Tx_Tmp];
end
Sig_Sp=Rnd_Sour
,ceil(Flag_Fram/SF)).*Wal_Mat
,mod(kk-1,SF)+1); %Walsh spreading
Sig_Sp=((sum(Sig_Sp(1:Chi_Num))+j*(sum(Sig_Sp(Chi_Num+1:end))+1))*Gold);%/sqrt(Ch_Num+1);%I+j*Q
Sig_Org=[Sig_Sp Sig_Org(1:end-1)]; %Shift register for source code
Dop=sqrt(1/N0)*sum(cos(Wm*cos(Ank)*(kk+1e10)*Tc+phi(1))+j*sin(Wm*sin(Ank)*(kk+1e10)*Tc+phi(2))); %Jakes channel
Ch_Data=(Sig_Org(Del_Idx).*Dop)*Del_Gain';
Ch_Data=[1 j]*randn(2,1)*10^((-SNR+SF_DB)/20)+Ch_Data;
%Receiver
Sig_Rec=[Ch_Data Sig_Rec(1:end-1)];
kpw=kk-Win_Len+Push;
if(kpw>0)
Sig_Rec_Tmp=Sig_Rec*Gold_Buf(end)';
Sig_Buf(mod(kpw-1,Plt_Num*SF)+1,
=Sig_Rec_Tmp;
Sig_Est=Sig_Est+Sig_Rec_Tmp; %Estimation
end
if(mod(kpw,Plt_Num*SF)==0)&(kpw~=0)
[Tmp Max_Idx]=sort(Sig_Est);
Str_Idx=Max_Idx(end-Max_Num+1:end);
Ch_Est =-j*Sig_Est(Str_Idx)/(Plt_Num*SF);
Sig_Est=Win_Zero;
for uu=1
lt_Num %Despread--Wsh:Chi_Num x SF
Res_I
,uu)=real((Wal_Mat(1:Chi_Num,
*Sig_Buf((uu-1)*SF+1:uu*SF,Str_Idx))*Ch_Est')/SF;
Res_Q
,uu)=imag((Wal_Mat(Chi_Num+1:end,
*Sig_Buf((uu-1)*SF+1:uu*SF,Str_Idx))*Ch_Est')/SF;
end
pp=pp+1;
qq = mod(pp-1,fix(r*(Fram_Len+Mem_Len)/Plt_Num))*Plt_Num+1;
Rec(qq:qq+Plt_Num-1,
=[Res_I;Res_Q]';
%Err_Num=Err_Num+sum(Tx(1
lt_Num,
~=sign([Res_I;Res_Q])');
end
if(mod(kpw,SF*r*(Fram_Len+Mem_Len))==0)&(kpw~=0)
Rec(Intlv_Vec,
=Rec; %Deinterleaver
Rx=viterbi(Rec,Mem_Len,Sur_Len,r); %viterbi: hidden file
Err_Num=Err_Num+sum((Rx~=Tx(1:Fram_Len,
)) %%
end
end
Ber=Err_Num/(kk/SF);
fp=fopen('ber.dat','a+');
fprintf(fp,'%5.2f\t',SNR);
fprintf(fp,'%10.8f\t',Ber);
fprintf(fp,'\n');
fclose(fp);
end