%function [Ber] = DSCDMA_NOCODEINTLVR();
clear
clc
fprintf('Start! Please waiting ...\n');
%%%%%%%%%%%%%% 需要调整的参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% V 表示车速 10km每小时 100km/h 300km/h
%%%%%%%%%%%SNR 表示信噪比,一般去0:5:20
%%%%%%%%%% SF_Bit 表示扩频比特 可以取 2 4 6 8
%%%%%%%%%% Plt_Num 表示 信道估计平均的长度,可以取 8到256
%%%%%%%%%% channel parameters 信道参数 %%%%%%%%%%%%%%%
C = 3e8;
Fc = 2.11e9;
V = 10; %km/h
Tc = 1/1.2288e6; %Chip duration according to digital bandwidth
%%%%%%% 扩频增益 信道估计用的导频数目 %%%%%%%%%%%%%
SF_Bit= 2;
Plt_Num = 256; %Symbol:The integrated length for pilot estimation
SF=2^SF_Bit; %Spread factor
SF_DB=10*log10(SF);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Generating the Walsh code matrix. The sequence number is from 0 to SF - 1 %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Index = 1;
Wal_Mat = 1;
for k = 1 : SF_Bit
Wal_Mat = [ Wal_Mat Wal_Mat.*((1-2*bitget(Index,k))*ones(1,size(Wal_Mat,2)))];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%% Preparing parameters for encoding and interleaver %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Fram_Len = ceil( 2/(100*SF*Tc) - 0.5); %Signal length.
Half_FLen = Fram_Len/2;
Calculate_Num = 30*Fram_Len;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Parameters for simulation the multipath channel with modified Jakes model %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Del_Idx=[1 2 3 4 6]; %Model B with rate = 1
Del_Gain=[0.8084 0.462 0.253 0.259 0.0447]; % The energe of the fore two paths are combined as one path.
Sample_Rate = 1;
Max_Del=max(Del_Idx); %Max time delay
Path_Num=length(Del_Idx); %Time invariant multipath
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%% Parameters for receiver %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Win_Len = 12; %Window length for searching
Max_Num = 3; %Stong paths
fpname = strcat(mfilename, '.dat');
fp=fopen(fpname,'a+');
fprintf(fp,strcat('\n%%Created at from \n'));
fprintf(fp,'%%SF = %3d\t\tPlt_Num = %4d\t\tSpeed = %3dkm/h\t\tHalf_FLen=%5d\t\tCalculate_Num=%7d\n',SF,Plt_Num,V,Half_FLen,Calculate_Num);
fprintf(fp,'%%SNR BER\n');
fclose(fp);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%% Start %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for SNR = 20
fprintf('*****SNR = %5.3f*****\n',SNR);
PN_RegStateI = [zeros(1,14) 1];
PN_RegStateQ = [zeros(1,14) 1];
PN_PolynI = [0 1 0 0 0 1 1 1 0 1 0 0 0 0 1];
PN_PolynQ = [0 0 1 1 1 0 0 0 1 1 1 1 0 0 1];
Time_BeginCH = 0;
Data_Length = 0;
Err_Num = 0;
while ( Data_Length < Calculate_Num )
% the source signal
TxSymbols = 1 - 2*randint(1,Fram_Len,2);
% QPSK modulation
TempTxSymbols = reshape(TxSymbols,2,length(TxSymbols)/2);
TxSignal = TempTxSymbols(1,:) + j*TempTxSymbols(2,:);
% Signal Repeat
TxSig_Repeat=kron(TxSignal,ones(1,SF));
% produce the walsh sequence with the same rate as PN code
Walsh_Sequence = repmat(Wal_Mat,1,length(TxSignal));
%produce the PN code sequence
PN_SequenceI = zeros(1,length(TxSig_Repeat));
PN_SequenceQ = zeros(1,length(TxSig_Repeat));
[PN_SequenceI,PN_RegStateI] = PnGen(PN_PolynI,PN_RegStateI,length(TxSig_Repeat));
[PN_SequenceQ,PN_RegStateQ] = PnGen(PN_PolynQ,PN_RegStateQ,length(TxSig_Repeat));
PN_Complex = PN_SequenceI + j*PN_SequenceQ;
%combine the PN code and Walsh code
WalPN_Complex = PN_Complex.*Walsh_Sequence;
% spreading the singal and pilot symbols added
TxSig_WalPN = TxSig_Repeat.*WalPN_Complex + PN_Complex;
% passing the channel
TxSig_WalPNM = kron(TxSig_WalPN,ones(1,Sample_Rate));
CH_Data = MultiCHannel(Del_Gain,Fc,V,Tc,length(TxSig_WalPNM),Time_BeginCH,[0.8 0.28]);
Time_BeginCH = Time_BeginCH + length(TxSig_WalPNM);
for i = 1 : length(Del_Idx)
if Del_Idx(1,i) > 1
Temp_Sig(i,:) = [ zeros(1,Del_Idx(1,i)-1) TxSig_WalPNM(1,[1:end-Del_Idx(1,i)+1])];
else
Temp_Sig(i,:) = TxSig_WalPNM(1,[1:end]);
end
end
TxSig_WalPNCh = sum(Temp_Sig.*CH_Data,1);
%%%%%%%%% add AWGN noise %%%%%%%%%%%%%%%%%%%%%%%%%%%
TxSig_WalPNChN = TxSig_WalPNCh +[1 j]*randn(2,length(TxSig_WalPNCh))*10^((-SNR+SF_DB)/20);
Down_WalPNChN = TxSig_WalPNChN(1:Sample_Rate:end); %derepeat the signal
% Estimation and RAKE receiver
%%%%%%% de spreading %%%%%%%%%%%%%%%
for i = 1 : 12
if i > 1
Temp_RecSig(i,:) = Down_WalPNChN(1,[i:end 1:i-1]).*conj(PN_Complex);
else
Temp_RecSig(i,:) = Down_WalPNChN(1,[i:end]).*conj(PN_Complex);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% channel estimation and channel choose channel combination %%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:Half_FLen/Plt_Num
Temp_EstCH = sum( Temp_RecSig( :,(i-1)*Plt_Num*SF+1:i*Plt_Num*SF ),2);
[Tmp Max_Idx] = sort(Temp_EstCH);
Str_Idx = Max_Idx( end - Max_Num + 1:end );
EstCH = Temp_EstCH(Str_Idx)/(2*Plt_Num*SF);
for uu = 1 : Plt_Num
RecSig((i-1)*Plt_Num+uu)=Wal_Mat(1,:)*Temp_RecSig(Str_Idx,(i-1)*Plt_Num*SF+(uu-1)*SF+1:(i-1)*Plt_Num*SF+uu*SF).'*conj(EstCH)/SF;
end
end
% Adjust and Comparison
Rec_Adjust = reshape([real(RecSig);imag(RecSig)],1,length(RecSig)*2);
Err_Num = Err_Num + sum( sign(Rec_Adjust) ~= TxSymbols )
Data_Length = Data_Length + length(TxSymbols);
end
Ber = Err_Num/Data_Length
fp=fopen(fpname, 'a+');
fprintf(fp,'%5.2f\t',SNR);
fprintf(fp,'%10.8f\n',Ber);
fclose(fp);
end
人打赏
0人 点赞
主帖获得的天涯分:0
举报 |
楼主
|
楼主发言:3次 发图:0张 | 添加到话题 |