function [AVG_SINRdd,AVG_SINRcell,AVG_Thdd,AVG_Thcell,AVG_Th]=PC_my6(SINRdd_high,SINRdd_low,SINRcell_high,SINRcell_low)
%常数定义
R=500; %蜂窝小区半径为250m
Ndd=10; %D2D用户数为10对
Ncell=50; %蜂窝用户数为50个
Lmin=25; %用户距基站的最小距离为25米
Lmax=50; %D2D用户对之间的最大距离为50米
Pmax=24; %最大发射功率为24dBm
P0=-78; %P0=-78dBm
a=0.8;
N=116; %热噪声功率N=116dBm
N_UE=9; %用户的噪声指数为9dB
N_eNB=5; %基站的噪声指数为5dB
B=180; %带宽为180kHz
nSum=100;
Ddd_cell=zeros(Ndd, 1);
Ddd_eNB=zeros(Ndd ,1);
Dcell_eNB=zeros(Ndd,1);
PLdd=zeros(Ndd,1);
PLcell=zeros(Ndd,1);
PLcell_dd=zeros(Ndd,1);
PLdd_eNB=zeros(Ndd,1);
G_SINRdd=zeros(nSum,Ndd);
G_SINRcell=zeros(nSum,Ndd);
G_Thdd=zeros(nSum,Ndd);
G_Thcell=zeros(nSum,Ndd);
for j=1:nSum
%确定蜂窝用户位置
xcell=rand(Ncell,1)*R*3/2-R;
ycell=sqrt(3)*rand(Ncell,1)*R-sqrt(3)*R/2;
i=1;
while i<=Ncell
if xcell(i)<=-R/2 && ycell(i)>=sqrt(3)*(xcell(i)+R);
xcell(i)=xcell(i)+3/2*R;
ycell(i)=ycell(i)-sqrt(3)*R/2;
end;
if xcell(i)<=-R/2 && ycell(i)<=-sqrt(3)*(xcell(i)+R)
xcell(i)=xcell(i)+3/2*R;
ycell(i)=ycell(i)+sqrt(3)*R/2;
end
if xcell(i)^2+ycell(i)^2<Lmin^2
xcell(i)=rand*3/2*R-R;
ycell(i)=sqrt(3)*rand*R-sqrt(3)*R/2;
i=i-1;
end
i=i+1;
end;
Hcell=[xcell,ycell];
%确定D2D用户位置
xddt=rand(Ndd,1)*3/2*R-R;
yddt=sqrt(3)*rand(Ndd,1)*R-sqrt(3)*R/2;
i=1;
while i<=Ndd
if xddt(i)<-R/2 && yddt(i)>=sqrt(3)*(xddt(i)+R);
xddt(i)=xddt(i)+3/2*R;
yddt(i)=yddt(i)-sqrt(3)*R/2;
end;
if xddt(i)<-R/2 && yddt(i)<-sqrt(3)*(xddt(i)+R)
xddt(i)=xddt(i)+3/2*R;
yddt(i)=yddt(i)+sqrt(3)*R/2;
end
if xddt(i)^2+yddt(i)^2<Lmin^2
xddt(i)=rand*3/2*R-R;
yddt(i)=sqrt(3)*rand*R-sqrt(3)*R/2;
i=i-1;
end
i=i+1;
end;
Hddt=[xddt,yddt];
Ddd_dd=rand(Ndd,1)*Lmax;
z=rand(Ndd,1)*2*pi;
xddr=zeros(Ndd,1);
yddr=zeros(Ndd,1);
for i=1:Ndd
xddr(i)=xddt(i)+Ddd_dd(i)*cos(z(i));
yddr(i)=yddt(i)+Ddd_dd(i)*sin(z(i));
end
Hddr=[xddr,yddr];
%二 资源复用模块
%D2D用户随机复用蜂窝用户资源
Hdd_cell=zeros(Ndd,2);
n=randperm(Ncell);
for i=1:Ndd
Hdd_cell(i,:)=Hcell(n(i),[1,2]);
end
%三 计算模块
H=Hddr-Hdd_cell; %D2D接收端到蜂窝用户的距离矢量
for i=1:Ndd
Ddd_cell(i)=sqrt(H(i)^2+H(i+Ndd)^2); %D2D接收端到蜂窝用户的距离,单位m
Ddd_eNB(i)=sqrt(Hddt(i)^2+Hddt(i+Ndd)^2); %D2D发送端到基站的距离,单位m
%(1)路径损耗
%D2D用户的路径损耗
if Ddd_dd(i)<44.2
PLdd(i)=38.47+20*log10(Ddd_dd(i));
else
PLdd(i)=40.3+40*log10(Ddd_dd(i));
end
%蜂窝到D2D接收端的的路径损耗
if Ddd_cell(i)<44.2
PLcell_dd(i)=38.47+20*log10(Ddd_cell(i));
else
PLcell_dd(i)=40.3+40*log10(Ddd_cell(i));
end
%蜂窝用户的路径损耗
Dcell_eNB(i)=sqrt(Hdd_cell(i)^2+Hdd_cell(i+Ndd)^2); %蜂窝用户到基站的距离,单位m
if Dcell_eNB(i)<35
PLcell(i)=89.3;
else PLcell(i)=35.24+35*log10(Dcell_eNB(i));
end
%D2D发送端eNB的路径损耗
if Ddd_eNB(i)<35
PLdd_eNB(i)=89.3;
else PLdd_eNB(i)=35.24+35*log10(Ddd_eNB(i));
end
end
for k=1:nSum
if k==1
%开环功率控制
TPdd=min(Pmax,P0+a*PLdd);
TPcell=min(Pmax,P0+a*PLcell);
%(2)接收功率
RPdd=TPdd-PLdd-normrnd(0,8,Ndd,1);
RPcell=TPcell-PLcell-normrnd(0,8,Ndd,1);
%(3)干扰计算
Idd =TPdd-PLdd_eNB;
Icell=TPcell-PLcell_dd;
%(4)用户的SINR
SINRdd=zeros(1,Ndd);
SINRcell=zeros(1,Ndd);
for i=1:Ndd
SINRdd(i)=10*log10(10^(RPdd(i)/10)/(10^(Icell(i)/10)+N));
SINRcell(i)=10*log10(10^(RPcell(i)/10)/(10^(Idd(i)/10)+N));
end;
%(5)用户的吞吐量
Thdd=zeros(1,Ndd);
Thcell=zeros(1,Ndd);
for i=1:Ndd
Thdd(i)=B*log2(1+10^(SINRdd(i)/10));
Thcell(i)=B*log2(1+10^(SINRcell(i)/10));
end
else
for i=1:Ndd
if SINRdd(i)>SINRdd_high
TPdd(i)=min(Pmax,TPdd(i)-1);
end
if SINRdd(i)<SINRdd_low
TPdd(i)=min(Pmax,TPdd(i)+1);
end
end
for i=1:Ndd
if SINRcell(i)>SINRcell_high
TPcell(i)=min(Pmax,TPcell(i)-1);
end
if SINRcell(i)<SINRcell_low
TPcell(i)=min(Pmax,TPcell(i)+1);
end
end
RPdd=TPdd-PLdd-normrnd(0,8,Ndd,1)-N_UE;
RPcell=TPcell-PLcell-normrnd(0,8,Ndd,1)-N_eNB;
%(3)干扰计算
Idd =TPdd-PLdd_eNB;
Icell=TPcell-PLcell_dd;
%(4)用户的SINR
SINRdd=zeros(1,Ndd);
SINRcell=zeros(1,Ndd);
for i=1:Ndd
SINRdd(i)=10*log10(10^(RPdd(i)/10)/(10^(Icell(i)/10)+10^(-N/10)));
SINRcell(i)=10*log10(10^(RPcell(i)/10)/(10^(Idd(i)/10)+10^(-N/10)));
end;
%(5)用户的吞吐量
Thdd=zeros(1,Ndd);
Thcell=zeros(1,Ndd);
for i=1:Ndd
Thdd(i)=B*log2(1+10^(SINRdd(i)/10));
Thcell(i)=B*log2(1+10^(SINRcell(i)/10));
end
end
end
G_SINRdd(j,:)=SINRdd;
G_SINRcell(j,:)=SINRcell;
G_Thdd(j,:)=Thdd;
G_Thcell(j,:)=Thcell;
end
G_Th=[G_Thdd;G_Thcell];
%图4 开环功率控制、闭环功率控制、联合功率控制D2D用户SINR对比图--联合功控部分
figure(4)
range=-20:1:35;
M=hist(G_SINRdd,range);
cdf1= cumsum(M)/sum(M);
plot(range,cdf1,'bx-');
hold on
legend('开环功率控制','闭环功控控制','联合功率控制','Location','SouthEast')
hold on
%图5 开环功率控制、闭环功率控制、联合功率控制 蜂窝用户SINR对比图--联合功控部分
figure(5)
range=-20:1:35;
M=hist(G_SINRcell,range);
cdf1= cumsum(M)/sum(M);
plot(range,cdf1,'rx-');
grid on
hold on
legend('开环功率控制','闭环功控控制','联合功率控制','Location','SouthEast')
%图6 开环功率控制、闭环功率控制、联合功率控制 D2D用户吞吐量对比图--联合功控部分
figure(6)
range=0:50:2100;
M=hist(G_Thdd,range);
cdf1= cumsum(M)/sum(M);
plot(range,cdf1,'bx-');
grid on
hold on
legend('开环功率控制','闭环功控控制','联合功率控制','Location','SouthEast')
%图7 开环功率控制、闭环功率控制、联合功率控制 蜂窝用户吞吐量对比图--联合功控部分
figure(7)
range=0:50:2100;
M=hist(G_Thcell,range);
cdf1= cumsum(M)/sum(M);
plot(range,cdf1,'rx-');
grid on
hold on
legend('开环功率控制','闭环功控控制','联合功率控制','Location','SouthEast')
%图8 开环功率控制、闭环功率控制、联合功率控制 小区所有用户吞吐量对比图--开环功控部分
figure(8)
range=0:50:2100;
M=hist(G_Th,range);
cdf1= cumsum(M)/sum(M);
plot(range,cdf1,'kx-');
grid on
hold on
legend('开环功率控制','闭环功控控制','联合功率控制','Location','SouthEast')
AVG_SINRdd=abs(mean(mean(G_SINRdd)));
AVG_SINRcell=abs(mean(mean(G_SINRcell)));
AVG_Thdd=abs(mean(mean(G_Thdd)));
AVG_Thcell=abs(mean(mean(G_Thcell)));
% AVG_Th=(AVG_Thdd*Ndd+AVG_Thcell*Ncell)/(Ndd+Ncell);
AVG_Th=(AVG_Thdd*Ndd+AVG_Thcell*Ndd)/(Ndd+Ndd);
end