这个思想是简化考虑问题模型,并考虑历史TPC命令,先得到当前TPC命令,与历史TPC命令比较,然后才决定功率增减的步长值:
clear;clc;
G=0.7;%路径增益
I=2.5;%总干扰功率
SIR0=7;%目标信干比
simTime=1;%模拟的仿真时间,以秒为单位
freq=1500;%功率调节的频率,1500Hz
iter=freq*simTime;%总迭代次数
userNum=5;%用户数
power=rand(userNum,iter)+25;% power(userNum,1)为初始发送功率
SIR(userNum,iter)=0;%基站处接收信干比
TPC(userNum,iter)=0;%功率控制命令
deltaP=0.5;%定步长情况的步长值
sign=1;
powerControlError(iter)=0;
tic;
for k=1
iter-1)
SIR(:,k)=G*power(:,k)/I;%基站估计接收信干比
powerControlError(k)=sqrt(1/userNum*((SIR(1,k)-SIR0)^2+(SIR(2,k)-SIR0)^2+(SIR(3,k)-SIR0)^2+(SIR(4,k)-SIR0)^2+(SIR(5,k)-SIR0)^2));
for t=1:userNum
if SIR(t,k)>=SIR0
TPC(t,k)=0;
else
TPC(t,k)=1;
end
%以下是两种状态划分和两种步长结合的变步长控制方式
if k~=1
preTPC=TPC(t,k-1);%获得历史TPC命令
else
preTPC=0;
end
if TPC(t,k)==preTPC%这种情况取为状态0,减少一个步长值
sign=-1;%这个值可调整
deltaP=0.5;%这个值可调整
else %这种情况取为状态1,增加一个步长值
sign=1;%这个值可调整
deltaP=1;%这个值可调整
end
power(t,k+1)=power(t,k)+sign*deltaP;
end
end
k=k+1;
SIR(:,k)=G.*power(:,k)./I;%估计接收信干比
powerControlError(k)=sqrt(1/userNum*((SIR(1,k)-SIR0)^2+(SIR(2,k)-SIR0)^2+(SIR(3,k)-SIR0)^2+(SIR(4,k)-SIR0)^2+(SIR(5,k)-SIR0)^2));
for t=1:userNum
if SIR(t,k)>=SIR0
TPC(t,k)=0;
else
TPC(t,k)=1;
end
end
fprintf('均方误差是%f\n',sum(powerControlError)/k);
toc;