📄 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 + -