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

📄 bicm_8dpsk_clip.m

📁 在衰落信道下8DPSK的比特交织调制的维特比译码
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%   Bit interleaved 8DPSK differentially coded modulation over
%%      Ricean fading channels and impulse noise environment
%%               Ver 1.0, By Liu Wei, 2005-04-14
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%  常数定义
INFO_LEN = 3000;                                        %% 信息比特
CODE_LEN = INFO_LEN * 2;                                %% 编码比特
DELAY = 40;                                             %% Viterbi译码延时
SYMBOL = (CODE_LEN/3) + 1;                              %% 差分调制符号数目
CODE_RATE = 1.5;                                        %% 码率(比特/符号)
DOPPLER = 0.05;  K_FACTOR = 0;                          %% Rice信道参数
PROB_IMPULSE = 0.01;                                       %% 脉冲噪声发生的概率

%%  生成卷积码的网格结构
Trellis = poly2trellis(7,[171 133]);
%%  生成交织器的地址表
AddrTable = randperm(CODE_LEN);
%%  8PSK调制的Gray影射
PskStar = [1 0.707+0.707j -0.707+0.707j j 0.707-0.707j -j -1 -0.707-0.707j];

%% 计算有效的比特信噪比(Eb/N0)
EbN0 = 25;
AdjEbN0 = EbN0 + 10*log10(CODE_RATE/2);

%%  main program
for BitSir = 10 : 1 : 30,
    %% 计算有效的比特信干比
    AdjSir = BitSir + 10*log10(CODE_RATE/2) + 10*log10(PROB_IMPULSE); 
    BitSum = 0;
    BitErrSum = 0;
    while BitErrSum < 100
        InfoData = randint(1,INFO_LEN);
        CodeData = convenc(InfoData,Trellis);
        IntrlvData = intrlv(CodeData,AddrTable);
        
        %%  8PSK调制
        for i = 1 : (SYMBOL-1),
            Index = IntrlvData(i*3-2)*4 + IntrlvData(i*3-1)*2 + IntrlvData(i*3);
            PskModul(i) = PskStar(Index+1);
        end
        
        %%  差分调制
        DiffModul(1) = 1;
        for i = 1 : (SYMBOL-1),
            Temp = DiffModul(i) * PskModul(i);
            DiffModul(i+1) = Temp/abs(Temp);
        end
        
        %%  生成Gaussian-Binoulli脉冲噪声
        BinoulliRand = binornd(1,PROB_IMPULSE,1,SYMBOL);
        GaussRand =  wgn(1,SYMBOL,-AdjSir,'dbW','complex');
        ImpulseNoise = BinoulliRand .* GaussRand;
        
        %%  生成Rice衰落和白噪声
        FadeChan = ricianchan(1,DOPPLER,K_FACTOR);
        reset(FadeChan,randint(1,1,[1 1000]));
        WhiteNoise = wgn(1,SYMBOL,-AdjEbN0,'dbW','complex');
        
        %%  差分调制信号通过噪声信道
        Receive = filter(FadeChan,DiffModul) + WhiteNoise + ImpulseNoise;      
        
        %%  差分解调
        for i = 1 : (SYMBOL-1),
            DiffDetect(i) = Receive(i+1) * conj(Receive(i));
        end
       
        %%  比特度量计算
        for i = 1:(SYMBOL-1),
            %% 计算接收信号与标准星座的欧氏距离
            for nLoop = 1:8,
                Dist(nLoop) = abs(DiffDetect(i) - PskStar(nLoop))^2;
            end
            %%计算三个影射比特的度量
            BitMetric(i*3-2) = min([Dist(5) Dist(6) Dist(7) Dist(8)]) - min([Dist(1) Dist(2) Dist(3) Dist(4)]);
            BitMetric(i*3-1) = min([Dist(3) Dist(4) Dist(7) Dist(8)]) - min([Dist(1) Dist(2) Dist(5) Dist(6)]);
            BitMetric(i*3) = min([Dist(2) Dist(4) Dist(6) Dist(8)]) - min([Dist(1) Dist(3) Dist(5) Dist(7)]);
        end
        
        %% 比特解交织
        SoftInfo = deintrlv(BitMetric,AddrTable);
        
        %% 比特度量限幅
        for i=1:CODE_LEN,
            LTemp = SoftInfo(i);
            if LTemp > 1.0,
                SoftInfo(i) = 1.0;
            end
            if LTemp < -1.0,
                SoftInfo(i) = -1.0;
            end
        end
            
        %% Viterbi译码
        DecodeData = vitdec(SoftInfo,Trellis,DELAY,'cont','unquant');
        
        %% 计算误比特率
        [ErrNumb,ErrRatio] = biterr(DecodeData((DELAY+1):end),InfoData(1:end-DELAY));
	    BitErrSum = BitErrSum + ErrNumb;
        BitSum = BitSum + (INFO_LEN - DELAY);
    end
    BitErrRate = BitErrSum/BitSum;
    sprintf('Eb/N0 = %3.3f , BitSir = %3.3f, BER = %0.3e ',EbN0,BitSir,BitErrRate)
end
          

        

⌨️ 快捷键说明

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