zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【功率控制】无线光通信-CDMA中闭环链路的功率控制MATLAB仿真

控制MATLAB 仿真 无线 链路 功率 闭环
2023-09-11 14:15:33 时间

1.软件版本

matlab2017b

2.本算法理论知识

      编写无线光通信-CDMA中闭环链路的功率控制误差(Power control error)程序,其定义在文献An Analytical Approach for Closed-Loop Power Control Error Estimations in CDMA Cellular Systems中详细说明了。并且仿真出功率控制误差(Power control errorOOK 2PPM 4PPM 8PPM 16PPM的不同调制方式下;以及功率控制误差(Power control error)在1/4code rate, 1/2 code rate, 3/4 code rate不同码率下与BER的关系。信道设在AWGN环境下,初始值都以交予你们的无线光通信主程序为准。

 最后的结果图出:

一张不使用功率控制的无线光通信-CDMA系统中用户端与基站之间的距离BER的曲线图。

一张使用了功率控制之后的系统中用户端与基站之间距离与BER的曲线图

一张功率控制误差在不同的调制方式下的BER曲线图,

一张功率控制误差在不同的码率下的BER曲线图。

用不同颜色标明不同的调制方式和码率,调制方式在一张图中,码率在一张图中。

    首先,根据参考文献

关于功率控制误差估计的背景和相关理论知识,我们在设计的时候,满足如下额条件:

这里,只考虑一个基站几个用户的情况,所以仅考虑CDMA环境中的路径衰落模型。

3.核心代码

 

clc;
clear;
close all;
warning off;
addpath 'func\'

%%
%参数初始化 
global PACKET_LENGTH;
global SLOT_LENGTH ;                                                                            
global pulse_drtn;
global CHANNELS;                                                  
global PEEK_POWER;
global SYMBOL_LENGTH;                                 
global TRANS_LENGTH;

PACKET_LENGTH  = 300;  %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       =  4e8;                          % 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,TRANS_LENGTH);
    recivbit(i,:) = zeros(1,3*PACKET_LENGTH);
end


dwTransmitPower           = 7;        % 发送功率
dShadowFadingStd          = 4;        % 阴影衰落标准差BS2UE dB
dUserVelocity             = 0;        % 用户移动速度0km/h,这里假设是静止的
dwMsTransmitPower         = 0.25;     % 移动台发送功率 W
MAX_Dis                   = 7;
STEP                      = 0.2;
MIN_Dis                   = 1;

DIS                       = [MIN_Dis:STEP:MAX_Dis];%定义用户和基站之间的距离
MTKL                      = 10;%多次仿真,计算平均值
%**************************************************************************

%%
%主题函数,通过for循环,仿真不同距离下的误码率曲线
%为了对比,我们设置三组不同的SNR下的AWGN进行仿真
for jj = 1:length(DIS) 
    for mm = 1:MTKL
        jj
        mm
        %根据路径距离计算路径损耗
        PASS_LOSS = dwTransmitPower - Path_lose_compute(DIS(jj)) - dShadowFadingStd;

        %计算光三组元色对应的SNR值
        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

        %调制,OPPM 
        for i=1:CHANNELS
            signal(i,:) = func_OPPM(sentbit(i,:));
        end
        %加多径
        if multipath~=1 
           for i=1:CHANNELS
               signal(i,:) = add_multipath_dispersion1(signal(i,:),TRANS_LENGTH,sample_rate,rms_delay);
           end
        end
        %加噪声
        signal(1,:)=add_gauss_noise(signal(1,:),TRANS_LENGTH, VarR);      
        signal(2,:)=add_gauss_noise(signal(2,:),TRANS_LENGTH, VarG);
        signal(3,:)=add_gauss_noise(signal(3,:),TRANS_LENGTH, VarB); 


        %解调
        for i=1:CHANNELS
            recivbit(i,:) = func_deOPPM(signal(i,:));
        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(jj) = mean(ERR);
end
%**************************************************************************

%%
%画出波形
figure;
semilogy(MIN_Dis:STEP:MAX_Dis,ber,'b-o');
axis([DIS(1) DIS(end) 10^(-5) 1])
xlabel('distance(Km)');
ylabel('Bit Error Rate');
grid on

%保存数据,用于和加功率控制模块的对比
save Ber_with_no_power_control_error.mat MIN_Dis STEP MAX_Dis ber
%**************************************************************************

4.操作步骤与仿真结论

这里,主要对OOK2PPM4PPM8PPM16PPM五种方法进行仿真,这里我们还是考虑原始的仿真方法,即在一个固定位置,改变功率值进行仿真,即和之前的VLC-OOK一样的仿真思路。

将上面的五种调制方式放在一起对比,得到的仿真结果如下所示:

 1/4code rate, 1/2 code rate, 3/4 code rate不同码率下与BER的关系,这里,在原有的代码的基础上,进行不同码率的仿真。

5.参考文献

 

A01-57

6.完整源码获得方式

方式1:微信或者QQ联系博主

方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码