⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rake (cdma).txt

📁 CDMA中Rake接收机源码
💻 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 + -