clear all;
SINRO=0.1,T=10^21,k=1.38*10^(-23),refer=0.4,B=10^6,noise=10^(-6),N=50,Pp=10,rr=1.5*10^6;%基本元素的設定,此處的refer值得是第二時隙次使用者發送自身信号和主使用者信号的功率比,如ps1=(1-refer)ps,ps2=refer*ps
%設定各種信道的信道衰落
K=1,M=15;%規定信道矩陣的大小
V1=10^(-1)/sqrt(3.14/2);%瑞利信道的參數,注意這裡不是平均值
V2=10^(-2)/sqrt(3.14/2);
H=15;%Hb表示整個系統程式循環的次數
W=ones(H,N);%每一橫排表示一次循環的速率值,不同的縱坐标表示不同的信噪比下系統的速率值
W1=ones(H,N);%case 3 r df模式
W2=ones(H,N);%af模式
Pout=ones(H,N);%case 2 pout
Pout1=ones(H,N);%case 3 pout df模式
Pout2=ones(H,N);%af模式
Gss=random('rayleigh',10^(-1)/sqrt(3.14/2),K,M);%次使用者發送端到次使用者接收端的信道增益
Gpss=random('rayleigh',10^(-1)/sqrt(3.14/2),K,M);%主使用者發送端到次使用者發送端的信道增益
Gpp=random('rayleigh',10^(-2)/sqrt(3.14/2),K,M);%主使用者發送端到主使用者接收端的信道增益
Gsp=random('rayleigh',10^(-1)/sqrt(3.14/2),K,M);%次使用者發送端到主使用者接收端的信道增益
Gpssd=random('rayleigh',10^(-2)/sqrt(3.14/2),K,M);%主使用者發送端到次使用者接收端的信道增益
for j=1:1:H
%設定橫坐标的範圍
SNR=linspace(-10,30,N); %橫坐标為信噪比[-10,30]db,SNR=Gss*ps2/(B*noise)
snr=ones(size(SNR)); %snr為信噪比的瓦特表示
for i=1:1:N %SNR到snr的轉換
snr(i)=10^(SNR(i)/10);
end%橫坐标是次使用者接收端的信噪比
%帶入公式仿真
%第二種情形的系統速率和中斷機率
a=snr.*B*noise;%a=Gss*ps2
ps2=a./Gss(j);
for i=1:1:N
if Gsp(j)*ps2(i)<=T*k*B
ps1(i)=ps2(i)/refer*(1-refer);
rs(i)=B*log2(1+a(i)/(B*noise+Gss(j)*ps1(i)));%rs=B*log2(1+a/b),a=Gss*ps2,b=B*noise+Gss*ps1
temp(i)=ps2(i)/(2^(rr/B)-1);
temp1(i)=-((B^2)*(noise^2))/(2*((temp(i)-ps1(i))^2)*(V1^2));
pout(i)=1-exp(temp1(i));
else
p2o(i)=T*k*B/Gsp(j);%次使用者發送自身信号的邊界功率
p1o(i)=p2o(i)/refer*(1-refer);
rs(i)=B*log2(1+Gss(j)*p2o(i)/(B*noise+Gss(j)*p1o(i)));
temp(i)=p2o(i)/(2^(rr/B)-1);
temp1(i)=-((B^2)*(noise^2))/(2*((temp(i)-p1o(i))^2)*(V1^2));
pout(i)=1-exp(temp1(i));
end
end
for i=1:1:N
W(j,i)=rs(i);
Pout(j,i)=pout(i);
end
%rs2=ones(size(rs));
%rs2=rs;%把情形二下的速率值付給rs2
%第三種情形的系統速率
a=snr.*B*noise;%a=Gss*ps2
ps2=a./Gss(j);
for i=1:1:N
if Gsp(j)*ps2(i)<=T*k*B %滿足對主使用者的影響小于特定值
ps1(i)=ps2(i)/refer*(1-refer);
if a(i)/(Pp*Gpssd(j)+B*noise+Gss(j)*ps1(i))>=SINRO%滿足次使用者的最小通信要求
rs3(i)=B*log2(1+a(i)/(Pp*Gpssd(j)+B*noise+Gss(j)*ps1(i)));%隻有同時滿足兩個條件才能用這個表達式表達。
c=B*log2(1+Gpss(j)*Pp/(B*noise));
d1=1+Gpp(j)*Pp/(B*noise);
d2(i)=Gsp(j)*ps1(i)/(B*noise+Gsp(j)*ps2(i));
e= ps1(i)*Pp*Gpss(j)*Gsp(j)/(B*noise+Pp*Gpss(j));
e1=B*noise*(1+ps1(i)*Gsp(j)/(B*noise+Pp*Gpss(j)))+ps2(i)*Gsp(j);
d3(i)=e/e1;
d(i)=B*log2(d1+d2(i));%df模式
rp(i)=min(c,d(i));
r(i)=rs3(i)+rp(i);
da(i)=B*log2(d1+d3(i));%af模式
rpa(i)=min(c,da(i));
ra(i)=rs3(i)+rpa(i);
% 首先得是df模式主使用者的中斷機率
if c<d(i)%如果較小的是前者,則主使用者的中斷機率是一個常數如下
temp4=1;
temp2=(2^(rr/B)-temp4)^2;
temp3=-(temp2*(B^2)*(noise^2))/(2*(Pp^2)*(V1^2));
else
temp4=1+Gsp(j)*ps1(i)/(B*noise+Gsp(j)*ps2(i));
temp2=(2^(rr/B)-temp4)^2;
temp3=-(temp2*(B^2)*(noise^2))/(2*(Pp^2)*(V2^2));
end
%df主使用者的中斷機率
poutp(i)=1-exp(temp3);
%然後是af模式主使用者的中斷機率
if c<da(i)%如果較小的是前者,則主使用者的中斷機率是一個常數如下
temp41=1;
temp21=(2^(rr/B)-temp41)^2;
temp31=-(temp21*(B^2)*(noise^2))/(2*(Pp^2)*(V1^2));
else
temp41=1+d3(i);
temp21=(2^(rr/B)-temp41)^2;
temp31=-(temp21*(B^2)*(noise^2))/(2*(Pp^2)*(V2^2));
end
%af主使用者的中斷機率
poutpa(i)=1-exp(temp31);
%接下來是次使用者的中斷機率
temp(i)=ps2(i)/(2^(rr/B)-1);
temp1(i)=-((Pp*Gpssd(j)+B*noise)^2)/(2*((temp(i)-ps1(i))^2)*(V1^2));
pout(i)=1-exp(temp1(i));
%系統的中斷機率
poutsys(i)=pout(i)*poutp(i);
poutsysa(i)=pout(i)*poutpa(i);
else%不滿足次使用者的最小通信要求,即ps2(i)的值太小了
rs3(i)=B*log2(1+SINRO);
refer1=1/refer-1;
ps22=B*noise*SINRO/(Gss(j)*(1-refer1*SINRO));%邊界功率值
ps11=ps22/refer*(1-refer);
c=B*log2(1+Gpss(j)*Pp/(B*noise));
d1=1+Gpp(j)*Pp/(B*noise);
d2=Gsp(j)*ps11/(B*noise+Gsp(j)*ps22);
e= ps11*Pp*Gpss(j)*Gsp(j)/(B*noise+Pp*Gpss(j));
e1=B*noise*(1+ps11*Gsp(j)/(B*noise+Pp*Gpss(j)))+ps22*Gsp(j);
d3(i)=e/e1;
%df模式
d=B*log2(d1+d2);
rp(i)=min(c,d);
r(i)=rs3(i)+rp(i);
%af模式
da(i)=B*log2(d1+d3(i));
rpa(i)=min(c,da(i));
ra(i)=rs3(i)+rpa(i);
%df模式主使用者的中斷機率
if c<d%如果較小的是前者,則主使用者的中斷機率是一個常數如下
temp4=1;
temp2=(2^(rr/B)-temp4)^2;
temp3=-(temp2*(B^2)*(noise^2))/(2*(Pp^2)*(V1^2));
else
temp4=1+Gsp(j)*ps11/(B*noise+Gsp(j)*ps22);
temp2=(2^(rr/B)-temp4)^2;
temp3=-(temp2*(B^2)*(noise^2))/(2*(Pp^2)*(V2^2));
end
%主使用者的中斷機率
poutp(i)=1-exp(temp3);
%然後是af模式主使用者的中斷機率
if c<da(i)%如果較小的是前者,則主使用者的中斷機率是一個常數如下
temp41=1;
temp21=(2^(rr/B)-temp41)^2;
temp31=-(temp21*(B^2)*(noise^2))/(2*(Pp^2)*(V1^2));
else
temp41=1+d3(i);
temp21=(2^(rr/B)-temp41)^2;
temp31=-(temp21*(B^2)*(noise^2))/(2*(Pp^2)*(V2^2));
end
%af主使用者的中斷機率
poutpa(i)=1-exp(temp31);
%接下來是次使用者的中斷機率
temp(i)=ps22/(2^(rr/B)-1);
temp1(i)=-((Pp*Gpssd(j)+B*noise)^2)/(2*((temp(i)-ps11)^2)*(V1^2));
pout(i)=1-exp(temp1(i));
%系統的中斷機率
poutsys(i)=pout(i)*poutp(i);
poutsysa(i)=pout(i)*poutpa(i);
end
else%不滿足對主使用者的影響小于特定值,即ps2(i)的值太大了
p2oo(i)=T*k*B/Gsp(j);%次使用者發送自身信号的邊界功率
p1oo(i)=p2oo(i)/refer*(1-refer);
rs3(i)=B*log2(1+Gss(j)*p2oo(i)/(Pp*Gpssd(j)+B*noise+Gss(j)*p1oo(i)));
c=B*log2(1+Gpss(j)*Pp/(B*noise));
d1=1+Gpp(j)*Pp/(B*noise);
d2(i)=Gsp(j)*p1oo(i)/(B*noise+Gsp(j)*p2oo(i));
e= p1oo(i)*Pp*Gpss(j)*Gsp(j)/(B*noise+Pp*Gpss(j));
e1=B*noise*(1+p1oo(i)*Gsp(j)/(B*noise+Pp*Gpss(j)))+p2oo(i)*Gsp(j);
d3(i)=e/e1;
%df模式
d(i)=B*log2(d1+d2(i));
rp(i)=min(c,d(i));
r(i)=rs3(i)+rp(i);
%af模式
da(i)=B*log2(d1+d3(i));
rpa(i)=min(c,da(i));
ra(i)=rs3(i)+rpa(i);
%df模式主使用者中斷機率
if c<d(i)%如果較小的是前者,則主使用者的中斷機率是一個常數如下
temp4=1;
temp2=(2^(rr/B)-temp4)^2;
temp3=-(temp2*(B^2)*(noise^2))/(2*(Pp^2)*(V1^2));
else
temp4=1+Gsp(j)*p1oo(i)/(B*noise+Gsp(j)*p2oo(i));
temp2=(2^(rr/B)-temp4)^2;
temp3=-(temp2*(B^2)*(noise^2))/(2*(Pp^2)*(V2^2));
end
%主使用者的中斷機率
poutp(i)=1-exp(temp3);
%af模式主使用者中斷機率
if c<da(i)%如果較小的是前者,則主使用者的中斷機率是一個常數如下
temp41=1;
temp21=(2^(rr/B)-temp41)^2;
temp31=-(temp21*(B^2)*(noise^2))/(2*(Pp^2)*(V1^2));
else
temp41=1+d3(i);
temp21=(2^(rr/B)-temp41)^2;
temp31=-(temp21*(B^2)*(noise^2))/(2*(Pp^2)*(V2^2));
end
%主使用者的中斷機率
poutpa(i)=1-exp(temp31);
%接下來是次使用者的中斷機率
temp(i)=p2oo(i)/(2^(rr/B)-1);
temp1(i)=-((Pp*Gpssd(j)+B*noise)^2)/(2*((temp(i)-p1oo(i))^2)*(V1^2));
pout(i)=1-exp(temp1(i));
%系統的中斷機率
poutsys(i)=pout(i)*poutp(i);
poutsysa(i)=pout(i)*poutpa(i);
end
end
for i=1:1:N
W1(j,i)=r(i);%df模式下系統的容量
W2(j,i)=ra(i);%af模式下系統的容量
Pout1(j,i)=poutsys(i);%df模式下系統的中斷機率
Pout2(j,i)=poutsysa(i);%af模式下系統的中斷機率
end
end%大循環的結束
for i=1:1:N
r2(i)=mean(W(1:1:H,i));%H次循環的平均值
r3(i)=mean(W1(1:1:H,i));
r3a(i)=mean(W2(1:1:H,i));
Pou(i)=mean(Pout(1:1:H,i));
Pou1(i)=mean(Pout1(1:1:H,i));
Pou1a(i)=mean(Pout2(1:1:H,i));
end
plot(SNR,r2,'o',SNR,r3,'.',SNR,r3a,':');