?? rake (cdma).txt
字號:
clear;clc;%close all;
timeofprog=cputime;
K=1;%用戶數
Lc=31;%擴頻碼長度
T=1;Tc=T/Lc;%信號比特和擴頻碼周期
code_type=2;%0=隨機 1=hadamard碼 2=Gold碼
code_seed=rand('state');
codes=cdma_codes(K,0,code_type,Lc,code_seed);
Q=10;%矩形碼片成型濾波器抽樣因子
Mpmax=5;%最大多徑數
Mps=Mpmax*ones(K,1);%每個用戶的多徑數
%隨機產生的時延,每條路徑可分離
while(1)
TausOri=rand(K,Mpmax)*Lc;
TausOri=sort(TausOri,2);
Tausdelta=TausOri(:,2:Mpmax)-TausOri(:,1:Mpmax-1);
TuasSTD=sum(sum(Tausdelta>ones(K,Mpmax-1),1),2);
if TuasSTD==K*(Mpmax-1)
break
end
end
Taus=floor(TausOri*Q)/Q;
TausSam=Taus*Q;%將時延轉換為相應的抽樣數
%仿真數據存儲
filename='CDMARakedatapp.m';
fid=fopen(filename,'a+');
fprintf(fid,'%s','???SimuPara:');
SimuPara=[Lc,Taus];
for dataID=1:length(SimuPara)
fprintf(fid,'%f',SimuPara(dataID));
end
fprintf(fid,'\n');
fclose(fid);
%設置信噪比SNRdBs
SNRdBs=-10:0;
nSNRdBs=length(SNRdBs);
for SNRID=1:nSNRdBs
SNRdB=SNRdBs(SNRID);
%AWGN方差的產生
N=10;%N????????????????????????????????
N0=1/(10^(SNRdB/10))-(K*Mps(K)-1)*1/(3*N);
%AWGN的單邊功率譜密度
Bandwidth=Tc/2;%匹配濾波器等效帶寬
sigma2=N0*Bandwidth/2;%經過匹配濾波器后AWGN的方差
sigma=sqrt(sigma2);
nbitsAll=0;%發送總比特數
nerrorbits=zeros(Mps(1),1);%錯誤比特數
times=0;%循環次數
while(1)
N=1000;%一次發送的比特數
bits=2*rem(unidrnd(2,K,N),2)-1;%BPSK信號
Signal=zeros(1,(N+1)*Lc*Q);%不包括AWGN
for k=1:K
bitsChip=kron(bits(k,:),codes(k,:));%bits-->chips
ChipsSam=kron(bitsChip,ones(1,Q));%chips-->samples
for pathID=1:Mps(k)
Fadings(pathID,:)=kron(raylrnd(1/sqrt(2),1,N),ones(1,Lc*Q));%產生瑞利衰落振幅
TauSam=round(TausSam(k,pathID));
Signal(TauSam+1:TauSam+N*Lc*Q)=Signal(TauSam+1:TauSam+N*Lc*Q)+Fadings(pathID,:).*ChipsSam;
end
end
%第一個用戶的rake接收
%假設時延已經準確估計
TausSamEst=TausSam;
Rakebranch=zeros(Mps(1),N);
for pathID=1:Mps(1)
TauSam=round(TausSamEst(1,pathID));
RakeChipMF=1/2*sum(reshape(Signal(TauSam+1:TauSam+N*Lc*Q),Q,N*Lc),1)*(Tc/Q);%解調后的信號(振幅為解調前的1/2)再經過匹配濾波器
Noise=sigma*randn(1,N*Lc);
RakeChipMF=RakeChipMF+Noise;%加上噪聲
Rakebranch(pathID,:)=codes(1,:)*reshape(RakeChipMF,Lc,N)*Tc;%解擴
end
%最大比值合并
Rakebranchpower=Rakebranch.^2;
for pathID=1:Mps(K)
power=sum(Rakebranchpower(1:pathID,:),1);
for temp=1:pathID
MRCPara(temp,:)=Rakebranchpower(temp,:)./power;%每條路徑的最大比值合并系數
end
orderID=pathID;
RakeMRC(orderID,:)=sum(MRCPara(1:pathID,:).*Rakebranch(1:pathID,:),1);
end
%誤碼率計算
RakeRcvSign=sign(RakeMRC);
nbitsAll=nbitsAll+N;
nerrorbits=nerrorbits+sum(abs(sign(RakeRcvSign-kron(bits(1,:),ones(Mps(K),1)))),2);
BER=nerrorbits/nbitsAll;
[SNRdB,nbitsAll,nerrorbits']
%輸出數據存儲
fid=fopen(filename,'a+');
outdata=[SNRdB,nbitsAll,nerrorbits',BER'];
for dataID=1:length(outdata)
fprintf(fid,'%f',outdata(dataID));
end
fprintf(fid,'\n');
fclose(fid);
times=times+1;
%跳出WHILE循環的條件
if nerrorbits(Mps(1))>=100|times>=10
break
end
end
end
timeofprog=cputime-timeofprog
display('Program exit!!!');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -