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

📄 cdma_ray_pe.m

📁 这是个扩频系统中的PN码仿真程序
💻 M
字号:
%通信信号处理作业
%
%
%
%
% clear;clc;close all;
function pe_ray=cdma_ray_pe(SNR)
% SNR=0;
err_num=0;
Np=2;
data_bit_length=0;
while err_num<20
    N=200;
    Lc=15;
    fd=3.6;
    rate=2400;
    if_frequency=1800;
    fs=14400;
    j=sqrt(-1);
    d=1;
    rand('state',sum(100*clock));
    data_bit=round(rand(1,N));
    modula_data=QPSK_Modulate(data_bit);
    modua_data_I=real(modula_data);
    modua_data_Q=imag(modula_data);
    code_type=2;  %0 = random 1 = hadamard 2 = gold生成扩品吗
    code_seed=rand('state'); 
    codes=(cdma_codes(1,0,code_type,Lc,code_seed))'; %cdma_codes(K_in,K_out,code_type,L,code_seed) 
    % codes=[1 1 0 0 0 0 1 0 1 1 0 1 1 1 0];
    I_spread=kron(modua_data_I,codes);
    Q_spread=kron(modua_data_Q,codes);
    over_sample=[1 0 0 0 0 0];%过抽样,消除isi
    I_spread_samp=kron(I_spread,over_sample);
    Q_spread_samp=kron(Q_spread,over_sample);
    % num=rcosine(2400,14400,'sqrt',0.2);
    num=rcosfir(0.2,6,6,1/rate,'sqrt');%成型滤波
    I_rcosed_delay=conv(I_spread_samp,num);
    Q_rcosed_delay=conv(Q_spread_samp,num);
    
%     for i=1:length(I_spread_samp)
%         I_rcosed(i)=I_rcosed_delay(i+36);
%         Q_rcosed(i)=Q_rcosed_delay(i+36);
%     end
    % % plot(I_rcosed(1:10));
    i=1:length(I_rcosed_delay);
    IF_fre_I=cos(2*pi*if_frequency*(i-1)*(1/fs));%上变频 data_f=14.4/522,所以1.8*522/14.4=65.25就是中心载波所在的位置
    IF_fre_Q=sin(2*pi*if_frequency*(i-1)*(1/fs));
    I_if=I_rcosed_delay.*IF_fre_I;
    Q_if=Q_rcosed_delay.*IF_fre_Q;
    S_I_Q=I_if+Q_if;
    % 
    % % channel=rayleigh2(fd,fs,ns);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %信道
    %加入噪声
%     SNR=0;
    N_path=1;
    while (1)
        TausOri=rand(1,N_path)*Lc;
        TausOri=sort(TausOri,2);%sort by row
        Tausdelta=TausOri(:,2:N_path)-TausOri(:,1:N_path-1);
        TuasSTD=sum(sum(Tausdelta>ones(1,N_path-1),1),2);
        if TuasSTD==(N_path-1)
            break
        end
    end
%     $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    Taus=0;%ceil(TausOri*6); %for convenience of programming, modify the time delays
%     TausSam=Taus*10;%converting time delays into corresponding sample numbers
%     $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    ns=length(S_I_Q);
    
    Re_sig=zeros(1,ns+Taus(N_path));
    for path=1:N_path
        temp2=Rayleigh_Clarke(fd,floor(ns/10),(rate/Lc));
        channel(path,:)=temp2(1:ns);
        S_I_Q_temp=S_I_Q;%.*abs(channel(path,:));                  %衰落
        Taus_sample=Taus(path);                           %时延
        Re_sig(Taus_sample+1:ns+Taus_sample)=Re_sig(Taus_sample+1:ns+Taus_sample)+S_I_Q_temp;  %多径信号合并
    end
    
    for path=1:N_path
        Taus_sam=Taus(path);
        path_rec_sig=Re_sig(Taus_sam+1:Taus_sam+ns);
        I_down=path_rec_sig.*IF_fre_I;
%         f1=2*rate/fs;
%         low_filter=fir1(34,f1);
%         after_low_tem=conv(I_down,low_filter);
%         for i=1:length(I_down)
%             after_low_I(i)=after_low_tem(i+17);
%         end
         Q_down=path_rec_sig.*IF_fre_Q;
%         after_low_tem=conv(Q_down,low_filter);
%         for i=1:length(Q_down)
%             after_low_Q(i)=after_low_tem(i+17);
%         end
        I_gr=conv((I_down),num);
        Q_gr=conv((Q_down),num);
        for i=1:length(I_spread_samp)
            I_after_gr(i)=I_gr(i+72);
            Q_after_gr(i)=Q_gr(i+72);
        end
        I_down_samp=downsample(I_after_gr,6);
        Q_down_samp=downsample(Q_after_gr,6);
        
        %下抽之后chip信噪比,转换成比特是为了比较方便
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		E=1;%(sum(I_down_samp.^2))/length(I_down_samp);认为能量没有衰减
		snr=10^(SNR/10);
		sigma=sqrt(E/(2*snr));%用的是比特信噪比
		sigma_I=sigma;%正交支路方差为总的一半
		sigma_Q=sigma;
		%     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		randn('state',sum(100*clock)+20);
		Noise_I=sigma_I*randn(size(I_down_samp));
		Noise_Q=sigma_Q*randn(size(Q_down_samp));
		I_down_samp=I_down_samp+Noise_I;
		Q_down_samp=Q_down_samp+Noise_Q;
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        data_length=length(I_down_samp);
        length_symbol=round(data_length/Lc);
        for i=1:length_symbol
            tem=I_down_samp((i-1)*(Lc)+1:(i-1)*(Lc)+15);
            tem_sum=sum(tem.*codes);
            symbol_I(i)=tem_sum*2/Lc;
            tem=Q_down_samp((i-1)*(Lc)+1:(i-1)*(Lc)+15);
            tem_sum=sum(tem.*codes);
            symbol_Q(i)=tem_sum*2/Lc;
        end
        re_symbol(path,:)=symbol_I+j*symbol_Q;
    end
    Zn=re_symbol;
    pliot=modula_data(1:Np);
    
%     save b1 pliot;
%     save b2 Zn;
    symbol=rake_ray(pliot,Zn,Np);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %相关解调,考虑了频偏估计,结果证明,加估计比不加性能要hao,
    
    symbol_demoulate=qpsk_bit_mapping(symbol,d);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%     symbol_demoulate=QPSK_Demodulate(symbol,d);%%%%不加估计时候使用
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    
    
%     i=1;%和上两句完成的功能一样
%     while (i*6)<=length(I_spread_samp)
%         I_down_samp(i)=I_after_gr((i-1)*6+1);
%         Q_down_samp(i)=Q_after_gr((i-1)*6+1);
%         i=i+1;
%     end
    
    % %验证
    % aa=fft(I_rcosed);
    % dd=fft(Q_rcosed);
    % bb=fft(I_down);
    % cc=fft(Q_down);
    % figure(1);
    % plot(abs(aa));
    % figure(2);
    % plot(abs(bb));
    % figure(3);
    % plot(abs(cc));
    % figure(4);
    % plot((abs(dd)));
%     data_length=length(I_down_samp);
%     length_symbol=round(data_length/Lc);
%     for i=1:length_symbol
%         tem=I_down_samp((i-1)*(Lc)+1:(i-1)*(Lc)+15);
%         tem_sum=sum(tem.*codes);
%         symbol_I(i)=tem_sum*2/Lc;
%         tem=Q_down_samp((i-1)*(Lc)+1:(i-1)*(Lc)+15);
%         tem_sum=sum(tem.*codes);
%         symbol_Q(i)=tem_sum*2/Lc;
%     end
%     symbol=symbol_I+j*symbol_Q;
%     symbol_demoulate=QPSK_Demodulate(symbol,d);
    err_num1=pe_bit(data_bit,symbol_demoulate);
    err_num=err_num+err_num1
    data_bit_length=data_bit_length+length(data_bit);
end
pe_ray=err_num/data_bit_length;
% pe_awgn=pe_bit(data_bit,symbol_demoulate);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -