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

📄 pwctrl.m

📁 这是一个wcdma下行功率控制仿真的源代码
💻 M
字号:
clear;
clc;
%define constant variable
StartT = 0;%simulation start time:0ms
EndT = 1000;%simulation end time:1000ms
TTI = 10;%transport time interval:10ms
L = 12200;%number of random symbols:12.2kbit/s
Z = 504;%Z:The maximum code block sizes ,Z = 504 if convolutional coding is adopted
IntlevX = 26;%interleaver matirx row size (L/(End-StartT))*3+24 = IntlevX*IntlevY
Lenplt = 14;%length of pilot(DPCCH)

tsbitlen = 0; %length of timeslot bit

delayTime=[0,260,521,781];%multi-path delay time ns(10^-9s)
averagePower=[0,-3,-6,-9];%multi-path average power dB

x=bingen(L);% generate source
% subsection of source
Inter = EndT-StartT;
[y,blk_num,bk_size]=tran_segv(x,Inter,TTI);

% generate rayleigh fading
fchip=3.84;%chip速率(Mchip/s)
Tchip=1/(fchip*10^6);%duration of one chip (s)
delayChip=round(delayTime*10^-9/Tchip);%conver delaytime to delaychip
averagePower=10.^(averagePower/10);
average = 1/(sum(sqrt(averagePower)).^2);
averagePower = averagePower*average;
%Np=length(delayTime);%delayTime与averagePower dimension must equal
BLER_Target = 0.03;%block error target 1e-3
% outer loop
SIRTarget = zeros(1,blk_num+1);
BLER = zeros(1,blk_num);
SIRTarget(1) = 7;%Eb/NO target (db)
Step_size = 0.3;%step of SIR (db)
Flag = 0;%outer control flag 
outer_mu = 1/4;%coefficient of step_size
% inter loop
SIRinit = -3;%Base send Eb/N0(db)
DeltaSIR = 0.5;%step of Delta SIR (db)
TPC = 0; %TPC if SIRest>SIRtarget TPC=-1; else if SIRest = SIRtarget TPC = 0;else TPC = 1;
Delta = 0; %Delta SIR (db)
inter_mu = 5; %coefficient of delta

%---------test------------
%numSamplesPerSymlbol = 8;
%hTransmitFilter = ones(1,numSamplesPerSymlbol);
%hReceiveFilter = hTransmitFilter;
%-------------------------
% every frame
pre_Interfere = zeros(4,1);
SIRest = zeros(4,1);
for count = 1:1:blk_num   
    z = blk_seg(y(count,:),Z);%Code block segmentation
    u = cnv_encd(z);%Convolutional coding
    [v,col] = frm_intleav(u,IntlevX);%interleaving
    TPC = 0;%initial TPC
    % every time slot
    for count1 = 1:1:col  
        w =[ones(1,Lenplt),v(:,count1)'];%dpdcp & dpccp time division multiple
        tsbitlen = length(w);
        sf = 512*10/tsbitlen;%sf = 512/2^k
        %Base Send signal    
        [BitStreamOne,BitStreamTwo] = SerailToParallel(w);
        [I_SymbolsTx,Q_SymbolsTx] = QPSKEncoder(BitStreamOne,BitStreamTwo);
        %Symbols = complex(I_SymbolsTx,Q_SymbolsTx)
        %Symbols_power = mean(abs(Symbols).^2)
        [Complex_WaveformTx,sprd_code] = OVSFSpread(I_SymbolsTx,Q_SymbolsTx,log2(sf),log2(sf));%spread spectrum
        %Complex_WTx_power = mean(abs(Complex_WaveformTx).^2)
        
        %Through the channel
        startTime = (count-1)*0.01+(count1-1)*2560*(1/(fchip*10^6));
        %modify the N0
        SIRinit = SIRinit + Delta;
        SIRinitreg(count,count1) = SIRinit;
        N0 = 10^(-SIRinit/10);
        
        % The Ray #1 (Rayleigh Faded)
        [FadedWaveform1] = RayleighFader(startTime,Complex_WaveformTx,averagePower(1),1);
        % AWGN Channel
        Complex_WaveformRx1 = complex_awgn(FadedWaveform1,N0);
        
        % The Ray #2 (Rayleigh Faded)
        [FadedWaveform2] = RayleighFader(startTime,Complex_WaveformTx,averagePower(2),2);
        % AWGN Channel
        Complex_WaveformRx2 = complex_awgn(FadedWaveform2,N0);
        
        % The Ray #3 (Rayleigh Faded)
        [FadedWaveform3] = RayleighFader(startTime,Complex_WaveformTx,averagePower(3),3);
        % AWGN Channel
        Complex_WaveformRx3 = complex_awgn(FadedWaveform3,N0);
        
        % The Ray #4 (Rayleigh Faded)
        [FadedWaveform4] = RayleighFader(startTime,Complex_WaveformTx,averagePower(4),4);
        % AWGN Channel
        Complex_WaveformRx4 = complex_awgn(FadedWaveform4,N0);
        
        %mutipath accumlate
        Complex_WaveformRx =  [Complex_WaveformRx1 zeros(1,delayChip(4))]+[zeros(1,delayChip(2)) Complex_WaveformRx2 zeros(1,delayChip(3))] + [zeros(1,delayChip(3)) Complex_WaveformRx3 zeros(1,delayChip(2))] + [zeros(1,delayChip(4)) Complex_WaveformRx4];     
        %FadedWaveformRx =  [FadedWaveform1 zeros(1,delayChip(4))]+[zeros(1,delayChip(2)) FadedWaveform2 zeros(1,delayChip(3))] + [zeros(1,delayChip(3)) FadedWaveform3 zeros(1,delayChip(2))] + [zeros(1,delayChip(4)) FadedWaveform4];     
        %-----------test------------
        %FadedWaveformRx =  [Complex_WaveformTx zeros(1,delayChip(4))] + [zeros(1,delayChip(2)) Complex_WaveformTx zeros(1,delayChip(3))] + [zeros(1,delayChip(3)) Complex_WaveformTx zeros(1,delayChip(2))] + [zeros(1,delayChip(4)) Complex_WaveformTx];
        %[FadedWaveform1] = RayleighFader(startTime,Complex_WaveformTx,1);        
        %FadedWaveformRx = [FadedWaveform1 zeros(1,delayChip(4))];
        %---------------------------
        
        % AWGN Channel
        %SIRinit = SIRinit + Delta;
        %SIRinit = SIRinit + 0.5;
        %N0 = 10^(-SIRinit/10);
        %Complex_WaveformRx = complex_awgn(FadedWaveformRx,N0);
        %---------------test----------------
        %Complex_WaveformRx = FadedWaveformRx;
        %-----------------------------------
        
        %Rake reciever
        %-----------------------------test---------------------------------
        %C_WaveformRx = Complex_WaveformRx((1+delayChip(1)):(end-delayChip(4)));
        %[BitStreamOneRx1,BitStreamTwoRx1,pre_Interfere(1),SIRest(1)] = RakeFinger(C_WaveformRx,sprd_code,count,count1,pre_Interfere(1));        
        %------------------------------------------------------------------
        %seperate  #1 Rayleigh Faded
        C_WaveformRx1 = Complex_WaveformRx((1+delayChip(1)):(end-delayChip(4)));
        %C_WaveformRx1 = Complex_WaveformRx1;
        [BitStreamOneRx1,BitStreamTwoRx1,pre_Interfere(1),SIRest(1)] = RakeFinger(C_WaveformRx1,sprd_code,count,count1,pre_Interfere(1));
        %--------------------------------test------------------------------
        %[BitStreamOneRx1,BitStreamTwoRx1] = FakeRakeFinger(C_WaveformRx1,sprd_code);   
        %------------------------------------------------------------------
        % seperate  #2 Rayleigh Faded
        C_WaveformRx2 = Complex_WaveformRx((1+delayChip(2)):(end-delayChip(3)));
        %C_WaveformRx2 = Complex_WaveformRx2;
        [BitStreamOneRx2,BitStreamTwoRx2,pre_Interfere(2),SIRest(2)] = RakeFinger(C_WaveformRx2,sprd_code,count,count1,pre_Interfere(2));
        %--------------------------------test------------------------------        
        %[BitStreamOneRx2,BitStreamTwoRx2] = FakeRakeFinger(C_WaveformRx2,sprd_code);
        %------------------------------------------------------------------
        % seperate  #3 Rayleigh Faded
        C_WaveformRx3 = Complex_WaveformRx((1+delayChip(3)):(end-delayChip(2)));
        %C_WaveformRx3 = Complex_WaveformRx3;
        [BitStreamOneRx3,BitStreamTwoRx3,pre_Interfere(3),SIRest(3)] = RakeFinger(C_WaveformRx3,sprd_code,count,count1,pre_Interfere(3));
        %--------------------------------test------------------------------
        %[BitStreamOneRx3,BitStreamTwoRx3] = FakeRakeFinger(C_WaveformRx3,sprd_code);
        %------------------------------------------------------------------
        % seperate  #4 Rayleigh Faded
        C_WaveformRx4 = Complex_WaveformRx((1+delayChip(4)):(end-delayChip(1)));
        %C_WaveformRx4 = Complex_WaveformRx4;
        [BitStreamOneRx4,BitStreamTwoRx4,pre_Interfere(4),SIRest(4)] = RakeFinger(C_WaveformRx4,sprd_code,count,count1,pre_Interfere(4));
        %--------------------------------test------------------------------        
        %[BitStreamOneRx4,BitStreamTwoRx4] = FakeRakeFinger(C_WaveformRx4,sprd_code);
        %------------------------------------------------------------------
        % caclulate SIR
        Sum_SIRest(count,count1) = 10*log10(1/N0);
        %set TPC
        if Sum_SIRest(count,count1) < SIRTarget(count)
           if TPC == 1
              Delta = DeltaSIR;  
           else
              Delta = DeltaSIR/inter_mu;
           end
           TPC = 1;
        elseif Sum_SIRest(count,count1) > SIRTarget(count)
           if TPC == -1
              Delta = -DeltaSIR; 
           else
              Delta = -DeltaSIR/inter_mu;  
           end
           TPC = -1;
        else
           Delta = 0;
           TPC = 0;
        end       
        % caculate invv
        BitStreamOneRx = BitStreamOneRx1 + BitStreamOneRx2 + BitStreamOneRx3 + BitStreamOneRx4;
        BitStreamTwoRx = BitStreamTwoRx1 + BitStreamTwoRx2 + BitStreamTwoRx3 + BitStreamTwoRx4;
        %-------------------------test------------------------------------
        %BitStreamOneRx = BitStreamOneRx1;
        %BitStreamTwoRx = BitStreamTwoRx1;        
        %-----------------------------------------------------------------
        invw = ParallelToSerial(BitStreamOneRx,BitStreamTwoRx);
        %Errors = sum(invw~=w);
        %BER(count1) = Errors/tsbitlen;
        invv(:,count1) = invw(1:end)';
        %-----------------test-----------------
        %invv(:,count1) = invw((Lenplt+1):end)';
        %--------------------------------------
    end
    invu = ifrm_inteav(invv,IntlevX);
    invz = cnv_decd(invu);
    %Caculate bit error
    BLER(count) = sum(invz~=z)/length(z);
    if BLER(count) < BLER_Target
        if Flag == -1
           Step_down = 0.3 * Step_size;   
        else
           Step_down = 0.3 * outer_mu * Step_size;
        end
        Flag = -1;
        SIRTarget(count+1) = SIRTarget(count) - Step_down;
    elseif BLER(count) > BLER_Target
        if Flag == 1
           Step_up = 0.3 * Step_size;
        else
           Step_up = 0.3 * outer_mu * Step_size;
        end
        Flag = 1;
        SIRTarget(count+1) = SIRTarget(count) + Step_up;
    else 
        Flag = 0;
        SIRTarget(count+1) = SIRTarget(count);
    end
end

⌨️ 快捷键说明

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