欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

m 基于 Matlab 的无线光通信 CDMA 闭环链路功率控制算法仿真,比较 OOK、2PPM、4PPM、8PPM 和 16PPM

最编程 2024-03-21 08:54:52
...
【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

1.算法描述

   加入功率控制PCE模块,其基本结构如下所示:

 

 对OOK,2PPM,4PPM,8PPM,16PPM五种方法进行仿真。

 

 

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

3.MATLAB部分代码预览

PACKET_LENGTH  = 1000;  %Packet size 
PEEK_POWER     = 1;
SYMBOL_LENGTH  = 36;   %here symbol length= packet length 
SLOT_LENGTH    = 4;  
TRANS_LENGTH   = 9*SLOT_LENGTH*PACKET_LENGTH;
pulse_drtn     = 4;
CHANNELS       = 3;
ELECTRON       = 1.6e-19;
INTERFERENCE   = 1e-3;
RECEIVER_RES   = 0.53;
COEF_RED       = 0.1550;
COEF_GREEN     = 1.7309;
COEF_BLUE      = 1.1142;
RES_RED        = 0.5200;
RES_GREEN      = 0.4800;
RES_BLUE       = 0.4000;
%Derived parameters 
bit_rate       =  16e8;                          % bit rate [100Mbps]  
rms_delay      =  2e-9;                         % delay spread (1 ns)                                                      
multipath      =  3;                            % multi-path dispersion
sample_rate    =  bit_rate / 3.0 * SLOT_LENGTH;
%struct built
for i=1:CHANNELS
    sentbit(i,:)  = zeros(1,3*PACKET_LENGTH);
    signal(i,:)   = zeros(1,12*PACKET_LENGTH);
    recivbit(i,:) = zeros(1,3*PACKET_LENGTH);
end
 
dwTransmitPower           = 7;        
dShadowFadingStd          = 4;        
dUserVelocity             = 0;        
 
MAX_Dis                   = 7;
STEP                      = 0.2;
MIN_Dis                   = 1;
 
DIS                       = [MIN_Dis:STEP:MAX_Dis];
MTKL                      = 20;
Avgtime                   = 200;
Delay                     = 5;
 
startpow                  = -70;    
endpow                    = -40;  
powstep                   =  5;     
%**************************************************************************

 
E1 = zeros(PACKET_LENGTH,1);
E2 = zeros(PACKET_LENGTH,1);
E3 = zeros(PACKET_LENGTH,1);
cnt = 0;
for jj = 0.1:0.05:0.5   
    cnt = cnt + 1;
    for mm = 1:MTKL
        jj
        mm
        
        PASS_LOSS = -25;
       
        snr_red   = 10*log10(power((power(10,PASS_LOSS/10)*1e-3)*(COEF_RED  /(COEF_RED+COEF_GREEN+COEF_BLUE)),2)/((ELECTRON*INTERFERENCE/RES_RED)  *(bit_rate*(SLOT_LENGTH/pulse_drtn)/3.0)));
        snr_green = 10*log10(power((power(10,PASS_LOSS/10)*1e-3)*(COEF_GREEN/(COEF_RED+COEF_GREEN+COEF_BLUE)),2)/((ELECTRON*INTERFERENCE/RES_GREEN)*(bit_rate*(SLOT_LENGTH/pulse_drtn)/3.0)));
        snr_blue  = 10*log10(power((power(10,PASS_LOSS/10)*1e-3)*(COEF_BLUE /(COEF_RED+COEF_GREEN+COEF_BLUE)),2)/((ELECTRON*INTERFERENCE/RES_BLUE) *(bit_rate*(SLOT_LENGTH/pulse_drtn)/3.0)));
        VarR      = calc_snr(snr_red);
        VarG      = calc_snr(snr_green);
        VarB      = calc_snr(snr_blue);
 
 
        %产生随机数作为发送数据
        for i=1:CHANNELS
            sentbit(i,:) = round(rand(1,3*PACKET_LENGTH)); 
        end
 
 
        for times = 1:3*PACKET_LENGTH%每一时刻,发送一个数据包
            S1 = 1*(times-1) + 1;
            F1 = 1*times;
            S2 = 4*(times-1) + 1;
            F2 = 4*(times);
            

            %对应公式Pt(t) = Pt(t-D)/E(t-D) = 1/r(t-D)
            Coff(1,times) = 1/jj;
            Coff(2,times) = 1/jj;
            Coff(3,times) = 1/jj;  
            
            %调制,OOK 
            for i=1:CHANNELS
                signal(i,S2:F2) = func_1in4(sentbit(i,S1:F1),Coff(i,times));
            end
 
            %加多径
            if multipath~=1 
               for i=1:CHANNELS
                   signa2(i,S2:F2) = add_multipath_dispersion1(signal(i,S2:F2),4,sample_rate,rms_delay);
               end
            end
 
            
            %加噪声
            signal(1,S2:F2)=add_gauss_noise(signal(1,S2:F2),length(S2:F2), VarR);      
            signal(2,S2:F2)=add_gauss_noise(signal(2,S2:F2),length(S2:F2), VarG);
            signal(3,S2:F2)=add_gauss_noise(signal(3,S2:F2),length(S2:F2), VarB); 
        
 
            %解调
            for i=1:CHANNELS
                recivbit(i,S1:F1) = func_de1in4(signal(i,S2:F2),Coff(i,times));
            end
        end
 
        for i=1:CHANNELS
            error(i,:) = size(find(recivbit(i,:)~=sentbit(i,:)),2);
        end
        ERR(mm) = (error(1,:)+error(2,:)+error(3,:))/(CHANNELS*3*PACKET_LENGTH);
    end
    ber(cnt) = mean(ERR);
end
01_057_m