课程作业记录10:63位PN码序列扩频通信Matlab仿真

该过程中的扩频与解扩均采用63位PN码序列。
给出源码如下:

clear all;
close all;

SNR = -30:1:-20;
Eb_No = SNR-10*log10(4);

T=100;
Fs=12600;
bit=20;

%生成随机码元,设前两个码元为1、0
%并进行BPSK调制
rs=randint(1,bit*T);
rs(1)=1;
rs(2)=0;
rs=rs-0.5;
rs=-2*rs;

%扩频
%生成用于扩频的伪随机序列
d=round(rand(1,Fs*T/6));
pn_seq=[];
carrier=[];
%生成的级数为6
t=[0:2*pi/5:2*pi];
for k=1:Fs*T/6
    if d(1,k)==0
        sig=-ones(1,6);
    else
        sig=ones(1,6);
    end
    c=cos(t);   
    carrier=[carrier c];
    pn_seq=[pn_seq sig];
end
r_sp=pn_seq.*r;

%采样
for i=1:1:Fs*T;
    r(i)=rs(ceil(i/630));
end

%开始流程图
%设定抽样时间
t=1/Fs:1/Fs:T;

for aa=1:1:length(SNR)
    
        %BPSK载波
        gi=r.*sin(2*pi*1000.*t)*sqrt(2);
        
        %加性高斯白噪声    
        N0 = 1/10^(SNR(aa)/10);
        gii=gi+sqrt(2/N0)*(randn(1,length(gi)));
        
        %生成基本干扰信号
        J1=20*randn(1,Fs*T);
        
        %低通滤波后成为窄带干扰
        cutoff_freq=5;
        nyquist_freq = Fs/2;
        Wn=cutoff_freq/nyquist_freq;
        [filtb,filta]=butter(2,Wn,'low'); 
        J=filtfilt(filtb,filta,J1); 
        
        %加上干扰信号后的信号
        giii=gii+(sqrt(10)*sin(2*pi*1010.*t+pi/2).*J);
        
        %经过第二次1000Hz正弦载波
        giv=giii.*sin(2*pi*1000.*t)*sqrt(2);
        gr2=gii.*sin(2*pi*1000.*t)*sqrt(2);
        
        %解扩
        rxsig=givv.*carrier;
        demod_sig=[];
        for i=1:1:Fs*T
            if rxsig(i)>=0
                giv(i)=1;
            else
                giv(i)=-1;
            end
            %giv=[demod_sig rxs];
            end

        %低通滤波
        cutoff_freq=40;
        nyquist_freq=Fs/2;
        Wn=cutoff_freq/nyquist_freq;
        [filtb,filta]=butter(2,Wn,'low');
        gv=filtfilt(filtb,filta,giv);
        gr3=filtfilt(filtb,filta,gr2);
        
        %匹配滤波器
        
        b=flipud(gv(:));
        br=flipud(gr3(:));

        x=gv(:);
        xr=gr3(:);
        
        gvi=filter(b,1,x);
        gr4=filter(br,1,xr);
        

        %抽样判决
        %用无干扰信号找第一个峰值点
        gr5=abs(gr4);
        [pks,locs] = findpeaks(gr5); 
        point=locs(1);
        
        for d=0:1:bit*T-1
            if (point+d*630<=Fs*T)
            if gvi(point+d*630)>=0
                gett(d+1)=1;
            else
                gett(d+1)=-1;
            end
            if gr4(point+d*630)>=0
                getr(d+1)=1;
            else
                getr(d+1)=-1;
            end
            end
        end

        error=sum(gett~=rs);
        errorr=sum(getr~=rs);
        ber(aa)=error/(bit*T);
        berr(aa)=errorr/(bit*T);
     
end

semilogy(SNR,ber)
hold on
semilogy(SNR,berr)
title('扩频情况下的SNRvsvBER')
xlabel('SNR')
ylabel('BER')

你可能感兴趣的:(课程作业记录10:63位PN码序列扩频通信Matlab仿真)