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

📄 cdma_ray_pe_back.m

📁 这是个扩频仿真的有关程序
💻 M
字号:
%通信信号处理作业
%
%
%
%
% clear;clc;%close all;
function pe_ray=cdma_ray_pe_back(SNR)
% SNR=0;
err_num=0;
data_bit_length=0;
while err_num<20
    N=300;
    Lc=15;
    fd=5.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);
    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.*IF_fre_I;
    Q_if=Q_rcosed.*IF_fre_Q;
    S_I_Q=I_if+Q_if;
    % 
    % % channel=rayleigh2(fd,fs,ns);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %信道
    %加入噪声
%     SNR=0;
    N_path=3;
    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=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
% %     SNR=10;
%     E=1;%归一化符号号能量,加高斯白噪声,chip信噪比
%     E_chip=1;
%     E_bit=E/2;
%     snr=10^(SNR/10);
%     sigma=sqrt(E_chip/(2*snr*4/15));%noise variance  (snr_in bit=E_bit/(N0))
%     randn('state',sum(100*clock)+50);
%     Noise=sigma*randn(size(Re_sig));
%     Re_sig=Re_sig+Noise;
    
    % %数字下变频
%     i=1:length(Re_sig);
%     IF_fre_I=cos(2*pi*if_frequency*(i-1)*(1/fs));
%     IF_fre_Q=sin(2*pi*if_frequency*(i-1)*(1/fs));
%     I_down=Re_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+16);
%     end
    % I_down_fft=fft(after_low);%比较滤波前后的频谱
    % figure(1);
    % plot(abs(I_down_fft));
    % figure(2);
    %plot(abs(fft(I_down)));
%     Q_down=Re_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+16);
%     end
%     % Q_down_fft=fft(Q_down);
%     
%     I_gr=conv((after_low_I),num);
%     Q_gr=conv((after_low_Q),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
    for path=1:N_path
        Taus_sam=Taus(path);
        path_rec_sig=Re_sig(Taus_sam+1:Taus_sam+ns);
%         path_rec_sig_Q=Q_after_gr(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((after_low_I),num);
        Q_gr=conv((after_low_Q),num);
        for i=1:length(I_spread_samp)
            I_after_gr(i)=I_gr(i+36);
            Q_after_gr(i)=Q_gr(i+36);
        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)+50);
		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
    
    sum_power=sum(re_symbol.*conj(re_symbol),1);
    for i=1:N_path
        factor(i,:)=(re_symbol(i,:).*conj(re_symbol(i,:)))./sum_power;
    end
    symbol=sum((re_symbol.*factor),1);
    
%     symbol=(sum(re_symbol,1))/N_path;
    
%     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
%     if err_num~=0
%         i=2;
%     end
    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 + -