📄 pwctrl.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 + -