基于matlab的扩频通信误码率仿真

发布时间 2023-03-23 13:40:18作者: 我爱C编程

1.算法描述

       扩展频谱通信,简称扩频通信,是一种信息传输方式,其信号所占有的频带宽度远大于所传信息必需的最小带宽;频带的扩展是通过一个独立的码序列(一般是伪随机码)来完成,用编码及调制的方法来实现的,与所传信息数据无关;在接收端则用同样的码进行相关同步接收、解扩及恢复所传信息数据。

 

      根据香农(C.E.Shannon)在信息论研究中总结出的信道容量公式,即香农公式:

 

C=W×Log21+S/N

 

式中:C--信息的传输速率S--有用信号功率W--频带宽度N--噪声功率

 

       为了提高信息的传输速率C,可以从两种途径实现,既加大带宽W或提高信噪比S/N。换句话说,当信号的传输速率C一定时,信号带宽W和信噪比S/N是可以互换的,即增加信号带宽可以降低对信噪比的要求,当带宽增加到一定程度,允许信噪比进一步降低,有用信号功率接近噪声功率甚至淹没在噪声之下也是可能的。扩频通信就是用宽带传输技术来换取信噪比上的好处,这就是扩频通信的基本思想和理论依据。

 

       在扩频发信机中,射频载波通常经过两次调制过程:一次同常规调制一样,被信息信号所调制;另一次由码序列进行扩频调制,相应地在收信机中先用约定的码序列做相关处理(解扩),然后再进行信息信号的解调。

        在发端输入的信息先经信息调制形成数字信号,然后由扩频码发生器产生的扩频码序列去调制数字信号以展宽信号的频谱。展宽后的信号再调制到射频发送出去。

在接收端收到的宽带射频信号,变频至中频,然后由本地产生的与发端相同的扩频码序列去相关解扩。再经信息解调、恢复成原始信息输出。

       由此可见,—般的扩频通信系统都要进行三次调制和相应的解调。一次调制为信息调制,二次调制为扩频调制,三次调制为射频调制,以及相应的信息解调、解扩和射频解调。与一般通信系统比较,扩频通信就是多了扩频调制和解扩部分。

 

扩频系统包括以下几种扩频方式:

 

1)直接序列扩频

 

简称DSDirectSequence):就是用高码率的扩频码序列在发端直接去扩展信号的频谱,在收端直接使用相同的扩频码序列对扩展的信号频谱进行解调,还原出原始的信息。直接序列扩频信号由于将信息信号扩展成很宽的频带,它的功率频谱密度比噪声还要低,使它能隐蔽在噪声之中,不容易被检测出来。对于干扰信号,收信机的码序列将对它进行非相关处理,使干扰电平显著下降而被抑制。这种方式运用最为普遍,成为行业领域研究的热点。

 

2)跳频扩频

 

简称FHFrequencyHopping):所谓跳频,比较确切的意思是:用一定码序列进行选择的多频率频移键控。也就是说,用扩频码序列去进行频移键控调制,使载波频率不断地跳变,所以称为跳频。频率跳变系统有称为"多频、码选、频移键控"系统,主要由码产生器和频率合成器两部分组成。一般选取的频率数为十几个至几百个,频率跳变的速率为10105/秒。信号在许多随机选取的频率上迅速跳频,可以避开跟踪干扰或有干扰的频率点。

 

3)跳时扩频

 

简称THTimeHopping):与跳频相似,跳时是使发射信号在时间轴上跳变。首先把时间轴分成许多时片。在一帧内哪个时片发射信号由扩频码序列去进行控制。可以把跳时理解为:用一定码序列进行选择的多时片的时移键控。跳时扩频系统主要通过扩频码控制发射机的通断,可以减少时分复用系统之间的干扰。

 

4)宽带线性调频

 

简称ChirpChirpModulation):如果发射的射频脉冲信号在一个周期内,其载频的频率作线性变化,则称为线性调频。因为其频率在较宽的领带内变化,信号的频带也被展宽了。这种扩频调制方式主要用在雷达中,但在通信中也有应用。

 

5)混合方式

 

上述几种基本扩频系统各有优缺点,单独使用一种系统有时难以满足要求,将以上集中扩频方法结合就构成了混合扩频系统,常见的有FH/DSTH/DSFH/TH等。

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

 

 

3.MATLAB核心程序

 

 %成型滤波
        %内插,使数据在调制之前与调制信号采样率相同
        %如果有成型滤波,则内插零;如成型滤波器为矩形,内插相当于采样
        % disp('成型滤波')
        % define filter-related parameters
        rolloff=0.5; % rolloff factor of filter
        rate=nsamp; % rate is the number of points in each input symbol period of length T
        N_T=[-2 2]; % a length-two vector that indicates the number of symbol periods before and after the peak response
        FirCoefNum=4*nsamp;
        % create a square root raised cosine filter
        [rrcfilter,sample_time] = rcosfir(rolloff, N_T, rate, 1,'sqrt');
        % % plot impulse response
        % figure; impz(rrcfilter,1);
        % figure; freqz(rrcfilter,1);
        % upsample and apply square root raised cosine filter
        BW_rrcfilter=10;
        rrcfilter_FixPoint=HSSSim_FixPointFunc(rrcfilter,max(abs(rrcfilter)),BW_rrcfilter);
        
        ShapedDataI= (rcosflt(FrameDataI,1,nsamp,'filter',rrcfilter))';
        ShapedDataQ= (rcosflt(FrameDataQ,1,nsamp,'filter',rrcfilter))';
        
        SendData=ShapedDataI+1i*ShapedDataQ;
        %%
        %通过信道
        %choice1:不加噪声和相偏
%                 ReceivedData=SendData;
        %choice2:通过高斯加性白噪声信道
        ReceivedData=awgn(SendData,EcN0(tt),'measured','db');
%         % %加随机相偏
        ReceivedData=ReceivedData*exp(1i*2*pi*0.33);
%         %         %         % % % %         %加频偏
        fd=53; %频偏为60k
        Rc=3840;%码片速率
        afa=fd/Rc/nsamp;%频偏
        ReceivedData=ReceivedData.*exp(1i*2*pi*afa*[1:length(ReceivedData)]);
        %%
        %AD:满量程为16V 量化为13个比特
        BW_AD=13;
        ReceivedDataI=real(ReceivedData);
        ReceivedDataQ=imag(ReceivedData);
        ReceivedDataI_FixPoint=HSSSim_FixPointFunc(ReceivedDataI,16,BW_AD);
        ReceivedDataQ_FixPoint=HSSSim_FixPointFunc(ReceivedDataQ,16,BW_AD);
        
        %%
        %匹配滤波
        
        MatchedDataI=filter(rrcfilter_FixPoint,1,ReceivedDataI_FixPoint);
        MatchedDataQ=filter(rrcfilter_FixPoint,1,ReceivedDataQ_FixPoint);
        
        Es_BW_MatchedData=ceil(log2(max([abs(MatchedDataI) abs(MatchedDataQ)])))+1; %匹配滤波后数据的有效位长
        
        BW_MatchedDataTrunc=10; %截尾7比特
        MatchedDataI=HSSSim_TruncateFunc(MatchedDataI,BW_MatchedDataTrunc);
        MatchedDataQ=HSSSim_TruncateFunc(MatchedDataQ,BW_MatchedDataTrunc);
        %%
        %码同步
        X=16;
        P=256;
        M=P*X;
        %做码相关
        i=0; %采样点序号
        k=0; %部分相关后的序号
        ChipSynFlag=0;
        FirstSampleChipSyn=0;
        SynLoc=0;
        ChipSynFailNum=0;
        UniqueCodeCorrFailNum=0;
        while ChipSynFlag==0
            i=i+1;
            k=0;
            for ii=1:X*P %一次PMF运算需要的点数
                PMFInputI(ii)=MatchedDataI(i+(ii-1)*nsamp)*SynCodeIni_polar(rem(ii-1,SynCodeLength)+1);
                PMFInputQ(ii)=MatchedDataQ(i+(ii-1)*nsamp)*SynCodeIni_polar(rem(ii-1,SynCodeLength)+1);
                
                if rem(ii,X)==0  %部分相加
                    k=k+1;
                    PMFDataI(k)=sum(PMFInputI(ii-X+1:ii));
                    PMFDataQ(k)=sum(PMFInputQ(ii-X+1:ii));
                end;
            end;
            Es_BW_PMFData=ceil(log2(max([abs(PMFDataI) abs(PMFDataQ)])))+1; %PMF数据的有效位长
            
            PMFData=PMFDataI+1i*PMFDataQ;
            PMF_FFT=floor(fft(PMFData,P));
            
            %对FFT后的数据加窗
            PMF_FFT_W=PMF_FFT(2:end-1)-floor(0.5*PMF_FFT(1:end-2))-floor(0.5*PMF_FFT(3:end));
            
            Es_BW_PMF_FFT_W=ceil(log2(max([abs(real(PMF_FFT_W)) abs(real(PMF_FFT_W))])))+1; %PMF做FFT运算后数据的有效位长
            
            %             Abs_PMF_FFT=abs(PMF_FFT)/M;%归一化FFT
            Abs_Max_PMF_FFT_W=floor(abs(PMF_FFT_W)/M);%归一化FFT
            %             [Max_PMF_FFT Max_loc]=max(Abs_PMF_FFT);
            [Max_PMF_FFT_W(i) Max_loc_W]=max(Abs_Max_PMF_FFT_W);%频偏为afa=Max_loc_W/X/P/nsamp
            
            TH_Max_PMF_FFT_W=2*mean(Max_PMF_FFT_W); %自适应捕获门限
            
            if FirstSampleChipSyn==0
                if Max_PMF_FFT_W(i)>TH_Max_PMF_FFT_W
                    FirstSampleChipSyn=1; %用来寻找最佳采样点
                    SynLoc=i;
                    FreqOffsetLoc=Max_loc_W;
                    Max_PMF_FFT_In3=Max_PMF_FFT_W(i);
                else
                    FirstSampleChipSyn=0;
                end;
            elseif FirstSampleChipSyn==1 %状态判断 %只要超出门限,就继续计算该样点后面两个点的Max_PMF_FFT_W,取3个中的最大点作为同步点。
                FirstSampleChipSyn=2; %状态判断
                if Max_PMF_FFT_W(i)>Max_PMF_FFT_In3
                    Max_PMF_FFT_In3=Max_PMF_FFT_W(i);
                    SynLoc=i;
                    FreqOffsetLoc=Max_loc_W;
                end;
            elseif FirstSampleChipSyn==2
                ChipSynFlag=1;
                FirstSampleChipSyn=0;
                if Max_PMF_FFT_W(i)>Max_PMF_FFT_In3
                    Max_PMF_FFT_In3=Max_PMF_FFT_W(i);
                    SynLoc=i;
                    FreqOffsetLoc=Max_loc_W;
                end;
            end;
        end;
        %%
%         %频偏校正
        if ChipSynFlag==1 %如果完成码同步和频偏估计,则进行频偏校验及独特码同步
            afa_est=Max_loc_W/X/P/nsamp;
            MatchedData=MatchedDataI+1i*MatchedDataQ;
            MatchedData_FdRevised=MatchedData.*exp(-1i*2*pi*afa_est*[1:length(ReceivedData)]);
            MatchedDataI=real(MatchedData_FdRevised);
            MatchedDataQ=imag(MatchedData_FdRevised);
            %%
            %独特码同步
            %直扩码解扩
            
            SynLoc2=SynLoc+X*P*nsamp; %同步后第一个码片的采样位置
            CorrValueI=0; %相关值
            CorrValueQ=0; %相关值
            UniqueCodeCorrFlag=0; %独特码相关标志
            FirstCorr=0;
            while ~UniqueCodeCorrFlag
                CorrValueI=0; %相关值
                CorrValueQ=0; %相关值
                for i=1:SynCodeLength
                    CorrValueI=CorrValueI+MatchedDataI(SynLoc2+(i-1)*nsamp)*SynCodeIni_polar(i); %解扩后的值
                    CorrValueQ=CorrValueQ+MatchedDataQ(SynLoc2+(i-1)*nsamp)*SynCodeIni_polar(i);
                end;
                if FirstCorr==0
                    FirstCorr=1;
                    CorrValueCnt=1;
                    PreCorrValueI=CorrValueI;
                    PreCorrValueQ=CorrValueQ;
                    SynLoc2=SynLoc2+nsamp*SynCodeLength;
                else
                    DiffValue=-sign(CorrValueI*PreCorrValueI+CorrValueQ*PreCorrValueQ); %对QPSK解调
                    if CorrValueCnt<13
                        DiffValueArray(CorrValueCnt)=DiffValue;
                        CorrValueCnt=CorrValueCnt+1;
                    else
                        DiffValueArray(CorrValueCnt)=DiffValue;
                        UniqueCorrValue=DiffValueArray*UniqueCode_polar';
                        if UniqueCorrValue>10
                            UniqueCodeCorrFlag=1;
                        end;
                        DiffValueArray(1:end-1)=DiffValueArray(2:end); %寄存器移位
                    end;
                    PreCorrValueI=CorrValueI;
                    PreCorrValueQ=CorrValueQ;
                    SynLoc2=SynLoc2+nsamp*SynCodeLength;
                end;
            end;
%             SynLoc2
            %%
            if UniqueCodeCorrFlag==1 %如果完成独特码同步,则进行多进制解扩
                %多进制解扩
                %先解扩
                EndofArray=0; %运算结束标记
                CulCnt=0;
                while ~EndofArray
                    CulCnt=CulCnt+1;
                    for i=1:BranchI
                        OrthCorrValueI(i)=0;
                        OrthCorrValueQ(i)=0;
                        for j=1:OrthCodeLength
                            OrthCorrValueI(i)=OrthCorrValueI(i)+(MatchedDataI(SynLoc2+(j-1)*nsamp)+1i*MatchedDataQ(SynLoc2+(j-1)*nsamp))*OrthCodeI_polar(i,j);
                            OrthCorrValueQ(i)=OrthCorrValueQ(i)+(MatchedDataQ(SynLoc2+(j-1)*nsamp)-1i*MatchedDataI(SynLoc2+(j-1)*nsamp))*OrthCodeQ_polar(i,j);