├── DOS_DF_asym.m ├── DOS_DF_exact_approx.m ├── DOS_DF_simulation.m ├── DOS_FGAF_asym.m ├── DOS_FGAF_exact.m ├── DOS_FGAF_simulation.m ├── DOS_VGAF_asym.m ├── DOS_VGAF_exact_approx.m ├── DOS_VGAF_simulation.m ├── DPS_DF_asym.m ├── DPS_DF_exact_approx.m ├── DPS_DF_simulation.m ├── DPS_FGAF_asym.m ├── DPS_FGAF_exact.m ├── DPS_FGAF_simulation.m ├── DPS_VGAF_asym.m ├── DPS_VGAF_exact_approx.m ├── DPS_VGAF_simulation.m ├── README.md ├── SOSforApproxDPSDF.m ├── SOSforApproxDPSVGAF.m ├── SOSforAsymptoticDPSDF.m ├── SOSforAsymptoticDPSFGAF.m ├── SOSforAsymptoticDPSVGAF.m ├── SOSforExactDPSDF.m ├── SOSforExactDPSFGAF.m ├── SOSforExactDPSVGAF.m ├── SOSforOmega.m ├── SOSforThetaXi.m ├── fig3_PLOT_ALL.m └── lambda.m /DOS_DF_asym.m: -------------------------------------------------------------------------------- 1 | % DOS DF, ASYMPTOTIC 2 | function DOS_DF_asym_out = DOS_DF_asym... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | %% CALCULATIONS 9 | prod_omega = 1; 10 | for pp = 1:M 11 | prod_omega = prod_omega*snrth*lSDm(pp); 12 | end 13 | % 14 | Omega_asym = ((1/snravg)^(M+K))*prod_omega; 15 | % 16 | temp1_asym = 0; 17 | Theta = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | prod_asym = 1; 22 | for kk = 1:K 23 | prod_asym = prod_asym*(snrth*lSRk(kk)/(1-rho) -... 24 | snrth*lSRk(kk)*lRkDm(kk,mm)/eta/rho*... 25 | (0.577215+log(snrth*lSRk(kk)/(1-rho)/snravg))); 26 | end 27 | temp1_asym = temp1_asym + Theta*prod_asym; 28 | end 29 | DOS_DF_asym_out = Omega_asym*temp1_asym; 30 | end 31 | -------------------------------------------------------------------------------- /DOS_DF_exact_approx.m: -------------------------------------------------------------------------------- 1 | % DOS DF, EXACT AND APPROXIMATE 2 | function [DOS_DF_exact,DOS_DF_approx] = DOS_DF_exact_approx... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | alpha = (1-rho)*snravg; 10 | beta = eta*rho*snravg; 11 | mu = snrth/alpha; 12 | % 13 | Omega = 1 + SOSforOmega(lSDm,snrth,snravg,set_dest_full); 14 | % 15 | temp1 = 0; 16 | temp1_approx = 0; 17 | Theta = 0; 18 | %% CALCULATIONS 19 | for mm = 1:M 20 | set_dest_minus = setdiff(set_dest_full,mm); 21 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 22 | prod = 1; 23 | prod_approx = 1; 24 | for kk = 1:K 25 | Y = @(y) exp(- y*lSRk(kk) - snrth./beta./y.*lRkDm(kk,mm)); 26 | temp2 = integral(Y,mu,inf); 27 | prod = prod*(1 - lSRk(kk)*temp2); 28 | % 29 | % New approx. (2016-08-20) 30 | nu = lSRk(kk); 31 | xi = snrth*lRkDm(kk,mm)/beta; 32 | % 33 | a = mu; 34 | b = xi; 35 | c = nu; 36 | % 37 | A1 = exp(-a*c)/c; 38 | A2 = -b*igamma(0,a*c); 39 | A3 = 0; 40 | for nn=2:6 41 | B1 = ((-1)^nn)*(b^nn)/(factorial(nn)); 42 | B21 = exp(-(a*c)); 43 | B22 = 0; 44 | for vv = 1:(nn-1) 45 | temp = (factorial(vv-1))*((-c)^(nn-vv-1))/... 46 | ((factorial(nn-1))*(a^vv)); 47 | B22 = B22 + temp; 48 | end 49 | B23 = ((-c)^(nn-1))/(factorial(nn-1))*(ei(-a*c)); 50 | B2 = B21*B22-B23; 51 | A3 = A3 + B1*B2; 52 | end 53 | NewApprox = A1+A2+A3; 54 | % 55 | prod_approx = prod_approx*(1 - lSRk(kk)*NewApprox); 56 | end 57 | temp1 = temp1 + Theta*prod; 58 | temp1_approx = temp1_approx + Theta*prod_approx; 59 | end 60 | DOS_DF_exact = Omega*temp1; 61 | DOS_DF_approx = Omega*temp1_approx; 62 | end 63 | -------------------------------------------------------------------------------- /DOS_DF_simulation.m: -------------------------------------------------------------------------------- 1 | % DOS DF, SIMULATION 2 | function DOS_DF_sim = DOS_DF_simulation... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMTERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | count = 0; 10 | %% CHANNELS 11 | for mm = 1:M 12 | hSDm(:,mm) = random('Rayleigh',sqrt(1/lSDm(mm)/2),[1,Sim_times]); 13 | end 14 | for kk = 1:K 15 | hSRk(:,kk) = random('Rayleigh',sqrt(1/lSRk(kk)/2),[1,Sim_times]); 16 | for mm = 1:M 17 | hRkDm(:,kk,mm) = random('Rayleigh',sqrt(1/lRkDm(kk,mm)/2),[1,Sim_times]); 18 | end 19 | end 20 | %% SNRs 21 | snrSDm = snravg*(abs(hSDm).^2); 22 | % Received SNR at destinations 23 | [snrSDb(:,1),D] = max(snrSDm,[],2); 24 | % Find the best destination 25 | snrSRk = (1-rho)*snravg*(abs(hSRk).^2); 26 | % received SNR at relays 27 | for yy = 1:Sim_times 28 | hRkDb(yy,:,1) = hRkDm(yy,:,D(yy)); 29 | end 30 | snrRkDb = eta*rho*snravg*(abs(hSRk).^2).*(abs(hRkDb).^2); 31 | % SNR of the second hops with the given best destination 32 | snr_relay_path = min(snrSRk,snrRkDb); 33 | % e2e SNR of relaying channel 34 | [snr_relay_path_best(:,1),R] = max(snr_relay_path,[],2); 35 | % Find the best relay 36 | snr_e2e = max(snrSDb,snr_relay_path_best); 37 | % e2e SNR of the system 38 | %% Count outage event 39 | for zz = 1:Sim_times 40 | if (snr_e2e(zz) < snrth) 41 | count = count + 1; 42 | end 43 | end 44 | DOS_DF_sim = count/Sim_times; 45 | end 46 | 47 | -------------------------------------------------------------------------------- /DOS_FGAF_asym.m: -------------------------------------------------------------------------------- 1 | % DOS FG-AF, ASYMPTOTIC 2 | function DOS_FGAF_asym_out = DOS_FGAF_asym... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | %% CALCULATIONS 9 | prod_omega = 1; 10 | for pp = 1:M 11 | prod_omega = prod_omega*snrth*lSDm(pp); 12 | end 13 | % 14 | Omega_asym = ((1/snravg)^(M+K))*prod_omega; 15 | % 16 | temp1_asym = 0; 17 | Theta = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | prod_asym = 1; 22 | for kk = 1:K 23 | prod_asym = prod_asym*(snrth*lSRk(kk)/(1-rho) - ... 24 | (1 - snrth*lSRk(kk)/(1-rho)/snravg)*... 25 | (2*snrth*lSRk(kk)*lRkDm(kk,mm)/eta/rho/(1-rho) + ... 26 | 2*snrth*lSRk(kk)*lSRk(kk)*lRkDm(kk,mm)/eta/rho/(1-rho)/snravg)*... 27 | log(sqrt((snravg+lSRk(kk))*snrth*lSRk(kk)*... 28 | lRkDm(kk,mm)/eta/rho/(1-rho)/(snravg^2)))); 29 | end 30 | temp1_asym = temp1_asym + Theta*prod_asym; 31 | end 32 | DOS_FGAF_asym_out = Omega_asym*temp1_asym; 33 | end -------------------------------------------------------------------------------- /DOS_FGAF_exact.m: -------------------------------------------------------------------------------- 1 | % DOS FG-AF, EXACT 2 | function DOS_FGAF_exact_out = DOS_FGAF_exact... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | alpha = (1-rho)*snravg; 10 | beta = eta*rho*snravg; 11 | mu = snrth/alpha; 12 | %% CALCULATIONS 13 | Omega = 1 + SOSforOmega(lSDm,snrth,snravg,set_dest_full); 14 | % 15 | temp1 = 0; 16 | temp1_approx = 0; 17 | Theta = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | prod = 1; 22 | for kk = 1:K 23 | kappak = snravg+lSRk(kk); 24 | prod = prod*(1 - ... 25 | exp(-mu*lSRk(kk))* ... 26 | sqrt(4*kappak*snrth*lSRk(kk)*lRkDm(kk,mm)/alpha/beta)*... 27 | besselk(1,sqrt(4*kappak*snrth*lSRk(kk)*lRkDm(kk,mm)/alpha/beta))); 28 | end 29 | temp1 = temp1 + Theta*prod; 30 | end 31 | DOS_FGAF_exact_out = Omega*temp1; 32 | end -------------------------------------------------------------------------------- /DOS_FGAF_simulation.m: -------------------------------------------------------------------------------- 1 | % DOS FG-AF, SIMULATION 2 | function DOS_FGAF_sim = DOS_FGAF_simulation... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | count = 0; 10 | %% CHANNELS 11 | for mm = 1:M 12 | hSDm(:,mm) = random('Rayleigh',sqrt(1/lSDm(mm)/2),[1,Sim_times]); 13 | end 14 | for kk = 1:K 15 | hSRk(:,kk) = random('Rayleigh',sqrt(1/lSRk(kk)/2),[1,Sim_times]); 16 | for mm = 1:M 17 | hRkDm(:,kk,mm) = random('Rayleigh',sqrt(1/lRkDm(kk,mm)/2),[1,Sim_times]); 18 | end 19 | % 20 | kappak(kk) = snravg+lSRk(kk); 21 | end 22 | %% SNRs 23 | snrSDm = snravg*(abs(hSDm).^2); 24 | % Received SNR at destinations 25 | [snrSDb(:,1),D] = max(snrSDm,[],2); 26 | % Find the best destination 27 | snrSRk = (1-rho)*snravg*(abs(hSRk).^2); 28 | % Received SNR at relays 29 | for yy = 1:Sim_times 30 | hRkDb(yy,:,1) = hRkDm(yy,:,D(yy)); 31 | end 32 | snrRkDb = eta*rho*snravg*(abs(hSRk).^2).*(abs(hRkDb).^2); 33 | % SNR of the second hop with the given best destination 34 | % end-to-end SNR 35 | for jj = 1:Sim_times 36 | snr_relay_path(jj,:) = snrSRk(jj,:).*snrRkDb(jj,:)./... 37 | (kappak.*(abs(hSRk(jj,:)).^2) + snrRkDb(jj,:)); 38 | % e2e SNR of the relaying channel 39 | end 40 | [snr_relay_path_best(:,1),R] = max(snr_relay_path,[],2); 41 | % Find the best relay 42 | snr_e2e = max(snrSDb,snr_relay_path_best); 43 | % e2e SNR of the system 44 | %% COUNT EVENTS 45 | for zz = 1:Sim_times 46 | if (snr_e2e(zz) < snrth) 47 | count = count + 1; 48 | end 49 | end 50 | DOS_FGAF_sim = count/Sim_times; 51 | end 52 | -------------------------------------------------------------------------------- /DOS_VGAF_asym.m: -------------------------------------------------------------------------------- 1 | % DOS VG-AF, ASYMPTOTIC 2 | function DOS_VGAF_asym_out = DOS_VGAF_asym... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | %% CALCULATIONS 9 | prod_omega = 1; 10 | for pp = 1:M 11 | prod_omega = prod_omega*snrth*lSDm(pp); 12 | end 13 | % 14 | Omega_asym = ((1/snravg)^(M+K))*prod_omega; 15 | % 16 | temp1_asym = 0; 17 | Theta = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | prod_asym = 1; 22 | for kk = 1:K 23 | % 24 | prod_asym = prod_asym*(snrth*lSRk(kk)/(1-rho) - ... 25 | 2*snrth*lSRk(kk)*lRkDm(kk,mm)/eta/rho*... 26 | (1-snrth*lSRk(kk)/(1-rho)/snravg)*... 27 | log(sqrt(snrth*lSRk(kk)*lRkDm(kk,mm)/eta/rho/snravg))); 28 | end 29 | temp1_asym = temp1_asym + Theta*prod_asym; 30 | end 31 | DOS_VGAF_asym_out = Omega_asym*temp1_asym; 32 | end -------------------------------------------------------------------------------- /DOS_VGAF_exact_approx.m: -------------------------------------------------------------------------------- 1 | % DOS VG-AF, EXACT and APPROXIMATE 2 | function [DOS_VGAF_exact,DOS_VGAF_approx] = DOS_VGAF_exact_approx... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | alpha = (1-rho)*snravg; 10 | beta = eta*rho*snravg; 11 | mu = snrth/alpha; 12 | %% CALCULATIONS 13 | Omega = 1 + SOSforOmega(lSDm,snrth,snravg,set_dest_full); 14 | % 15 | temp1 = 0; 16 | temp1_approx = 0; 17 | Theta = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | prod = 1; 22 | prod_approx = 1; 23 | for kk = 1:K 24 | Y = @(y) exp(- y*lSRk(kk) - ... 25 | (alpha.*snrth.*y+snrth).*lRkDm(kk,mm)./... 26 | ((alpha.*y-snrth).*beta.*y)); 27 | temp2 = integral(Y,mu,inf); 28 | prod = prod*(1 - lSRk(kk)*temp2); 29 | % 30 | prod_approx = prod_approx*(1 - exp(-mu*lSRk(kk))* ... 31 | sqrt(4*snrth*lSRk(kk)*lRkDm(kk,mm)/beta)*... 32 | besselk(1,sqrt(4*snrth*lSRk(kk)*lRkDm(kk,mm)/beta))); 33 | end 34 | temp1 = temp1 + Theta*prod; 35 | temp1_approx = temp1_approx + Theta*prod_approx; 36 | end 37 | DOS_VGAF_exact = Omega*temp1; 38 | DOS_VGAF_approx = Omega*temp1_approx; 39 | end -------------------------------------------------------------------------------- /DOS_VGAF_simulation.m: -------------------------------------------------------------------------------- 1 | % DOS VG-AF, SIMULATION 2 | function DOS_VGAF_sim = DOS_VGAF_simulation... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | count = 0; 9 | %% CHANNELS 10 | for mm = 1:M 11 | hSDm(:,mm) = random('Rayleigh',sqrt(1/lSDm(mm)/2),[1,Sim_times]); 12 | end 13 | for kk = 1:K 14 | hSRk(:,kk) = random('Rayleigh',sqrt(1/lSRk(kk)/2),[1,Sim_times]); 15 | for mm = 1:M 16 | hRkDm(:,kk,mm) = random('Rayleigh',sqrt(1/lRkDm(kk,mm)/2),[1,Sim_times]); 17 | end 18 | end 19 | %% SNRs 20 | snrSDm = snravg*(abs(hSDm).^2); % received SNR at Dm 21 | [snrSDb(:,1),D] = max(snrSDm,[],2); % find the best destination 22 | % 23 | snrSRk = (1-rho)*snravg*(abs(hSRk).^2); % received SNR at Rk 24 | % 25 | for yy = 1:Sim_times 26 | hRkDb(yy,:,1) = hRkDm(yy,:,D(yy)); 27 | end 28 | snrRkDb = eta*rho*snravg*(abs(hSRk).^2).*(abs(hRkDb).^2); 29 | % end-to-end SNR 30 | snr_relay_path = snrSRk.*snrRkDb./(snrSRk+snrRkDb+1); 31 | [snr_relay_path_best(:,1),R] = max(snr_relay_path,[],2); 32 | snr_e2e = max(snrSDb,snr_relay_path_best); 33 | %% COUNT OUTAGE EVENTS 34 | for zz = 1:Sim_times 35 | if (snr_e2e(zz) < snrth) 36 | count = count + 1; 37 | end 38 | end 39 | DOS_VGAF_sim = count/Sim_times; 40 | end 41 | -------------------------------------------------------------------------------- /DPS_DF_asym.m: -------------------------------------------------------------------------------- 1 | % DPS DF, ASYMPTOTIC 2 | function DPS_DF_asym_out = DPS_DF_asym... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | %% CALCULATIONS 9 | prod_omega = 1; 10 | for pp = 1:M 11 | prod_omega = prod_omega*snrth*lSDm(pp); 12 | end 13 | % 14 | Omega_asym = ((1/snravg)^(M+1))*prod_omega; 15 | % 16 | Theta = 0; 17 | temp1_asym = 0; 18 | temp3_asym = 0; 19 | for mm = 1:M 20 | set_dest_minus = setdiff(set_dest_full,mm); 21 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 22 | Xi = 0; 23 | temp2_asym = 0; 24 | for kk = 1:K 25 | set_relay_minus = setdiff(set_relay_full,kk); 26 | Xi = (1 + SOSforThetaXi(lSRk(kk),lSRk,set_relay_minus)); 27 | % 28 | temp3_asym= ... 29 | SOSforAsymptoticDPSDF(lSRk,lRkDm(kk,mm),snravg,snrth,eta,rho,set_relay_full); 30 | temp2_asym = temp2_asym + Xi*temp3_asym; 31 | % 32 | end 33 | % 34 | temp1_asym = temp1_asym + Theta*temp2_asym; 35 | end 36 | % 37 | DPS_DF_asym_out = Omega_asym*temp1_asym; 38 | end -------------------------------------------------------------------------------- /DPS_DF_exact_approx.m: -------------------------------------------------------------------------------- 1 | % DPS DF, EXACT and APPROXIMATE 2 | function [DPS_DF_exact,DPS_DF_approx] = DPS_DF_exact_approx... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | alpha = (1-rho)*snravg; 10 | beta = eta*rho*snravg; 11 | %% CALCULATIONS 12 | Omega = 1 + SOSforOmega(lSDm,snrth,snravg,set_dest_full); 13 | % 14 | Theta = 0; 15 | temp1 = 0; 16 | temp3 = 0; 17 | temp1_approx = 0; 18 | temp3_approx = 0; 19 | for mm = 1:M 20 | set_dest_minus = setdiff(set_dest_full,mm); 21 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 22 | Xi = 0; 23 | temp2 = 0; 24 | temp2_approx = 0; 25 | for kk = 1:K 26 | set_relay_minus = setdiff(set_relay_full,kk); 27 | Xi = (1 + SOSforThetaXi(lSRk(kk),lSRk,set_relay_minus)); 28 | temp3= SOSforExactDPSDF(lSRk,lRkDm(kk,mm),snrth,alpha,beta,set_relay_full); 29 | temp2 = temp2 + Xi*temp3; 30 | % 31 | temp3_approx= SOSforApproxDPSDF(lSRk,lRkDm(kk,mm),... 32 | snrth,alpha,beta,set_relay_full); 33 | temp2_approx = temp2_approx + Xi*temp3_approx; 34 | % 35 | end 36 | temp1 = temp1 + Theta*temp2; 37 | % 38 | temp1_approx = temp1_approx + Theta*temp2_approx; 39 | end 40 | % 41 | DPS_DF_exact = Omega*(1-temp1); 42 | DPS_DF_approx = Omega*(1-temp1_approx); 43 | end -------------------------------------------------------------------------------- /DPS_DF_simulation.m: -------------------------------------------------------------------------------- 1 | % DPS DF, SIMULATION 2 | function DPS_DF_sim = DPS_DF_simulation... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | count = 0; 9 | %% CHANNELS 10 | for mm = 1:M 11 | hSDm(:,mm) = random('Rayleigh',sqrt(1/lSDm(mm)/2),[1,Sim_times]); 12 | end 13 | for kk = 1:K 14 | hSRk(:,kk) = random('Rayleigh',sqrt(1/lSRk(kk)/2),[1,Sim_times]); 15 | for mm = 1:M 16 | hRkDm(:,kk,mm) = random('Rayleigh',sqrt(1/lRkDm(kk,mm)/2),[1,Sim_times]); 17 | end 18 | end 19 | %% SNRs 20 | snrSDm = snravg*(abs(hSDm).^2); 21 | % Received SNR at destinations 22 | [snrSDb(:,1),D] = max(snrSDm,[],2); 23 | % Find the best destination 24 | snrSRk = (1-rho)*snravg*(abs(hSRk).^2); 25 | % Received SNR at relays 26 | [snrSRb(:,1),R] = max(snrSRk,[],2); 27 | % Find the best relay (NOTE: partial relay selection) 28 | % 29 | for yy = 1:Sim_times 30 | hSRb(yy,1) = hSRk(yy,R(yy)); 31 | hRbDb(yy,1,1) = hRkDm(yy,R(yy),D(yy)); 32 | end 33 | snrRbDb = eta*rho*snravg*(abs(hSRb).^2).*(abs(hRbDb).^2); 34 | % SNR of the second hop with the best relay and destination. 35 | snr_relay_path = min(snrSRb,snrRbDb); 36 | % e2e SNR of the best relaying channel 37 | snr_e2e = max(snrSDb,snr_relay_path); 38 | % e2e SNR of the system 39 | %% COUNT EVENTS 40 | for zz = 1:Sim_times 41 | if (snr_e2e(zz) < snrth) 42 | count = count + 1; 43 | end 44 | end 45 | DPS_DF_sim = count/Sim_times; 46 | -------------------------------------------------------------------------------- /DPS_FGAF_asym.m: -------------------------------------------------------------------------------- 1 | % DPS FG-AF, ASYMPTOTIC 2 | function DPS_FGAF_asym_out = DPS_FGAF_asym... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | %% CALCULATIONS 9 | % Omega 10 | prod_omega = 1; 11 | for pp = 1:M 12 | prod_omega = prod_omega*snrth*lSDm(pp); 13 | end 14 | % 15 | Omega_asym = ((1/snravg)^(M+1))*prod_omega;% 16 | % 17 | temp3_asym = 0; 18 | temp1_asym = 0; 19 | Theta = 0; 20 | for mm = 1:M 21 | set_dest_minus = setdiff(set_dest_full,mm); 22 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 23 | Xi = 0; 24 | temp2_asym = 0; 25 | for kk = 1:K 26 | lSRk_kappa = lSRk(kk); 27 | set_relay_minus = setdiff(set_relay_full,kk); 28 | Xi = (1 + SOSforThetaXi(lSRk(kk),lSRk,set_relay_minus)); 29 | temp1_asym = SOSforAsymptoticDPSFGAF(lSRk,lSRk_kappa,lRkDm(kk,mm),snravg,snrth,eta,rho,set_relay_full); 30 | temp2_asym = temp2_asym + Xi*temp1_asym; 31 | % 32 | end 33 | temp3_asym = temp3_asym + Theta*temp2_asym; 34 | end 35 | % 36 | DPS_FGAF_asym_out = Omega_asym*temp3_asym; 37 | end 38 | -------------------------------------------------------------------------------- /DPS_FGAF_exact.m: -------------------------------------------------------------------------------- 1 | % DPS VG-AF, EXACT 2 | function DPS_FGAF_exact_out = DPS_FGAF_exact... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | alpha = (1-rho)*snravg; 10 | beta = eta*rho*snravg; 11 | %% CALCULATIONS 12 | Omega = 1 + SOSforOmega(lSDm,snrth,snravg,set_dest_full); 13 | % 14 | temp3 = 0; 15 | Theta_m = 0; 16 | temp1 = 0; 17 | A2approx = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | Xi = 0; 22 | temp2 = 0; 23 | for kk = 1:K 24 | kappak = snravg+lSRk(kk); 25 | set_relay_minus = setdiff(set_relay_full,kk); 26 | Xi = (1 + SOSforThetaXi(lSRk(kk),lSRk,set_relay_minus)); 27 | temp1 = 1 - ... 28 | SOSforExactDPSFGAF(lSRk,lRkDm(kk,mm),snrth,... 29 | alpha,beta,kappak,set_relay_full); 30 | temp2 = temp2 + Xi*temp1; 31 | % 32 | end 33 | temp3 = temp3 + Theta*temp2; 34 | end 35 | % 36 | DPS_FGAF_exact_out = Omega*temp3; 37 | end 38 | -------------------------------------------------------------------------------- /DPS_FGAF_simulation.m: -------------------------------------------------------------------------------- 1 | % DPS FG-AF, SIMULATION 2 | function DPS_FGAF_sim = DPS_FGAF_simulation... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | count = 0; 9 | %% CHANNELS 10 | for mm = 1:M 11 | hSDm(:,mm) = random('Rayleigh',sqrt(1/lSDm(mm)/2),[1,Sim_times]); 12 | end 13 | for kk = 1:K 14 | hSRk(:,kk) = random('Rayleigh',sqrt(1/lSRk(kk)/2),[1,Sim_times]); 15 | for mm = 1:M 16 | hRkDm(:,kk,mm) = random('Rayleigh',sqrt(1/lRkDm(kk,mm)/2),[1,Sim_times]); 17 | end 18 | % 19 | kappak(kk) = snravg+lSRk(kk); 20 | end 21 | %% SNRs 22 | snrSDm = snravg*(abs(hSDm).^2); 23 | % Received SNR at destinations 24 | [snrSDb(:,1),D] = max(snrSDm,[],2); 25 | % Find the best destination 26 | % 27 | snrSRk = (1-rho)*snravg*(abs(hSRk).^2); 28 | % Received SNR at relays 29 | [snrSRb(:,1),R] = max(snrSRk,[],2); 30 | % Find the best relay (NOTE: partial relay selection) 31 | for yy = 1:Sim_times 32 | hSRb(yy,1) = hSRk(yy,R(yy)); 33 | hRbDb(yy,1,1) = hRkDm(yy,R(yy),D(yy)); 34 | kappab(yy,1) = kappak(R(yy)); 35 | end 36 | snrRbDb = eta*rho*snravg*(abs(hSRb).^2).*(abs(hRbDb).^2); 37 | % SNR of the second hop with best relay and destination 38 | for jj = 1:Sim_times 39 | snr_relay_path(jj,:) = snrSRb(jj,:).*snrRbDb(jj,:)./... 40 | (kappab(jj).*(abs(hSRb(jj,:)).^2)+snrRbDb(jj,:)); 41 | % e2e SNR of relaying channel 42 | end 43 | snr_e2e = max(snrSDb,snr_relay_path); 44 | % e2e SNR of the system (selection combining) 45 | %% COUNT EVENTS 46 | for zz = 1:Sim_times 47 | if (snr_e2e(zz) < snrth) 48 | count = count + 1; 49 | end 50 | end 51 | DPS_FGAF_sim = count/Sim_times; 52 | end -------------------------------------------------------------------------------- /DPS_VGAF_asym.m: -------------------------------------------------------------------------------- 1 | % DPS VG-AF, ASYMPTOTIC 2 | function DPS_VGAF_asym_out = DPS_VGAF_asym... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | %% CALCULATIONS 9 | % Omega 10 | prod_omega = 1; 11 | for pp = 1:M 12 | prod_omega = prod_omega*snrth*lSDm(pp); 13 | end 14 | % 15 | Omega_asym = ((1/snravg)^(M+1))*prod_omega; 16 | % 17 | temp_asym_3 = 0; 18 | Theta = 0; 19 | for mm = 1:M 20 | set_dest_minus = setdiff(set_dest_full,mm); 21 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 22 | Xi = 0; 23 | temp_asym_2 = 0; 24 | for kk = 1:K 25 | set_relay_minus = setdiff(set_relay_full,kk); 26 | Xi = (1 + SOSforThetaXi(lSRk(kk),lSRk,set_relay_minus)); 27 | temp_asym_1 = SOSforAsymptoticDPSVGAF(lSRk,lRkDm(kk,mm),snravg,snrth,eta,rho,set_relay_full); 28 | temp_asym_2 = temp_asym_2 + Xi*temp_asym_1; 29 | end 30 | temp_asym_3 = temp_asym_3 + Theta*temp_asym_2; 31 | end 32 | % 33 | DPS_VGAF_asym_out = Omega_asym*temp_asym_3; 34 | end 35 | -------------------------------------------------------------------------------- /DPS_VGAF_exact_approx.m: -------------------------------------------------------------------------------- 1 | % DPS VG-AF, EXACT and SIMULATION 2 | function [DPS_VGAF_exact,DPS_VGAF_approx] = DPS_VGAF_exact_approx... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | % 9 | alpha = (1-rho)*snravg; 10 | beta = eta*rho*snravg; 11 | %% CALCULATIONS 12 | Omega = 1 + SOSforOmega(lSDm,snrth,snravg,set_dest_full); 13 | % 14 | temp3 = 0; 15 | temp_approx_3 = 0; 16 | Theta = 0; 17 | temp1 = 0; 18 | for mm = 1:M 19 | set_dest_minus = setdiff(set_dest_full,mm); 20 | Theta = (1 + SOSforThetaXi(lSDm(mm),lSDm,set_dest_minus)); 21 | Xi = 0; 22 | temp2 = 0; 23 | temp_approx_2 = 0; 24 | for kk = 1:K 25 | set_relay_minus = setdiff(set_relay_full,kk); 26 | Xi = (1 + SOSforThetaXi(lSRk(kk),lSRk,set_relay_minus)); 27 | temp1 = 1 - SOSforExactDPSVGAF(lSRk,lRkDm(kk,mm),snrth,... 28 | alpha,beta,set_relay_full); 29 | temp2 = temp2 + Xi*temp1; 30 | % 31 | temp_approx_1 = 1 - SOSforApproxDPSVGAF... 32 | (lSRk,lRkDm(kk,mm),snrth,alpha,beta,set_relay_full); 33 | temp_approx_2 = temp_approx_2 + Xi*temp_approx_1; 34 | end 35 | temp3 = temp3 + Theta*temp2; 36 | temp_approx_3 = temp_approx_3 + Theta*temp_approx_2; 37 | end 38 | % 39 | DPS_VGAF_exact = Omega*temp3; 40 | DPS_VGAF_approx = Omega*temp_approx_3; 41 | end 42 | -------------------------------------------------------------------------------- /DPS_VGAF_simulation.m: -------------------------------------------------------------------------------- 1 | % DPS VG-AF, SIMULATION 2 | function DPS_VGAF_sim = DPS_VGAF_simulation... 3 | (K,M,rho,snrth,snravg,espsilon,eta,Sim_times) 4 | %% PARAMETERS 5 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); 6 | set_dest_full = 1:M; 7 | set_relay_full = 1:K; 8 | count = 0; 9 | %% CHANNELS 10 | for mm = 1:M 11 | hSDm(:,mm) = random('Rayleigh',sqrt(1/lSDm(mm)/2),[1,Sim_times]); 12 | end 13 | for kk = 1:K 14 | hSRk(:,kk) = random('Rayleigh',sqrt(1/lSRk(kk)/2),[1,Sim_times]); 15 | for mm = 1:M 16 | hRkDm(:,kk,mm) = random('Rayleigh',sqrt(1/lRkDm(kk,mm)/2),[1,Sim_times]); 17 | end 18 | end 19 | %% SNRs 20 | snrSDm = snravg*(abs(hSDm).^2); 21 | % Received SNR at destinations 22 | [snrSDb(:,1),D] = max(snrSDm,[],2); 23 | % Find the best destination 24 | snrSRk = (1-rho)*snravg*(abs(hSRk).^2); 25 | % Received SNR at relays 26 | [snrSRb(:,1),R] = max(snrSRk,[],2); 27 | % Find the best relay (NOTE: partial relay selection) 28 | for yy = 1:Sim_times 29 | hSRb(yy,1) = hSRk(yy,R(yy)); 30 | hRbDb(yy,1,1) = hRkDm(yy,R(yy),D(yy)); 31 | end 32 | snrRbDb = eta*rho*snravg*(abs(hSRb).^2).*(abs(hRbDb).^2); 33 | % SNR of the second hop with the best relay and destination 34 | snr_relay_path = snrSRb.*snrRbDb./(snrSRb+snrRbDb+1); 35 | % e2e SNR of the best relaying channel 36 | snr_e2e = max(snrSDb,snr_relay_path); 37 | % e2e SNR of the system (with selection combining) 38 | %% COUNT EVENTS 39 | for zz = 1:Sim_times 40 | if (snr_e2e(zz) < snrth) 41 | count = count + 1; 42 | end 43 | end 44 | DPS_VGAF_sim = count/Sim_times; 45 | end -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Paper 2 | N. T. Do, D. B. da Costa, T. Q. Duong, V. N. Q. Bao, and B. An, “[Exploiting direct links in multiuser multirelay SWIPT cooperative networks with opportunistic scheduling](https://ieeexplore.ieee.org/document/7945528),” _IEEE Transactions on Wireless Communications_, vol. 16, no. 8, pp. 5410–5427, Aug. 2017. 3 | -------------------------------------------------------------------------------- /SOSforApproxDPSDF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS DF, APPROXIMATION 2 | function out = SOSforApproxDPSDF(lSRk,lRkDm,snrth,alpha,beta,SETfull) 3 | out = 0; 4 | mu = snrth/alpha; 5 | for ii = 1:length(SETfull) 6 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 7 | [row,column] = size(elements); 8 | for rr = 1:row 9 | subsum = 0; 10 | for cc = 1:column 11 | subsum = subsum + lSRk(elements(rr,cc)); 12 | end 13 | % New approx. (2016-08-20) 14 | nu = subsum; 15 | xi = snrth*lRkDm/beta; 16 | % 17 | a = mu; 18 | b = xi; 19 | c = nu; 20 | % 21 | A1 = exp(-a*c)/c; 22 | A2 = -b*igamma(0,a*c); 23 | A3 = 0; 24 | for nn=2:9 25 | B1 = ((-1)^nn)*(b^nn)/(factorial(nn)); 26 | B21 = exp(-(a*c)); 27 | B22 = 0; 28 | for vv = 1:(nn-1) 29 | temp = (factorial(vv-1))*((-c)^(nn-vv-1))/... 30 | ((factorial(nn-1))*(a^vv)); 31 | B22 = B22 + temp; 32 | end 33 | B23 = ((-c)^(nn-1))/(factorial(nn-1))*(ei(-a*c)); 34 | B2 = B21*B22-B23; 35 | A3 = A3 + B1*B2; 36 | end 37 | NewApprox = A1+A2+A3; 38 | % 39 | out = out + ((-1)^(ii+1)) * subsum * NewApprox; 40 | % out = out + ((-1)^(ii+1)) * subsum * ... 41 | % ((exp(-mu*subsum))/subsum -... 42 | % snrth/beta*lRkDm*igamma(0,mu*subsum)); 43 | end 44 | end 45 | 46 | -------------------------------------------------------------------------------- /SOSforApproxDPSVGAF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS VG-AF, APPROXIMATION 2 | function out = SOSforApproxDPSVGAF(lSRk,lRkDm,snrth,alpha,beta,SETfull) 3 | out = 0; 4 | for ii = 1:length(SETfull) 5 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 6 | [row,column] = size(elements); 7 | for rr = 1:row 8 | subsum = 0; 9 | for cc = 1:column 10 | subsum = subsum + lSRk(elements(rr,cc)); 11 | end 12 | out = out + ((-1)^(ii+1)) * exp(-snrth*subsum/alpha)*... 13 | sqrt(4*snrth*lRkDm*subsum/beta)*... 14 | besselk(1,sqrt(4*snrth*lRkDm*subsum/beta)); 15 | end 16 | end -------------------------------------------------------------------------------- /SOSforAsymptoticDPSDF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS DF, ASYMPTOTIC 2 | function out = SOSforAsymptoticDPSDF(lSRk,lRkDm,snravg,snrth,eta,rho,SETfull) 3 | out = 0; 4 | for ii = 1:length(SETfull) 5 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 6 | [row,column] = size(elements); 7 | for rr = 1:row 8 | subsum = 0; 9 | for cc = 1:column 10 | subsum = subsum + lSRk(elements(rr,cc)); 11 | end 12 | % 13 | A = snrth*subsum/(1-rho) -... 14 | snrth*lRkDm*subsum/eta/rho*... 15 | (0.577215 + log(snrth*subsum/(1-rho)/snravg)); 16 | % 17 | out = out + ((-1)^(ii+1))*A; 18 | end 19 | end 20 | 21 | -------------------------------------------------------------------------------- /SOSforAsymptoticDPSFGAF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS FG-AF, ASYMPTOTIC 2 | function out = SOSforAsymptoticDPSFGAF(lSRk,lSRk_kappa,lRkDm,snravg,snrth,eta,rho,SETfull) 3 | out = 0; 4 | for ii = 1:length(SETfull) 5 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 6 | [row,column] = size(elements); 7 | for rr = 1:row 8 | subsum = 0; 9 | for cc = 1:column 10 | subsum = subsum + lSRk(elements(rr,cc)); 11 | end 12 | % 13 | A = snrth*subsum/(1-rho) - ... 14 | (1-snrth*subsum/(1-rho)/snravg)*... 15 | (2*snrth*lRkDm*subsum/eta/rho/(1-rho)+... 16 | 2*snrth*lSRk_kappa*lRkDm*subsum/eta/rho/(1-rho)/snravg)*... 17 | log(sqrt(snrth*(snravg+lSRk_kappa)*lRkDm*subsum/eta/rho/(1-rho)/(snravg^2))); 18 | % 19 | out = out + ((-1)^(ii+1))*A; 20 | end 21 | end 22 | 23 | -------------------------------------------------------------------------------- /SOSforAsymptoticDPSVGAF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS VG-AF, ASYMPTOTIC 2 | function out = SOSforAsymptoticDPSVGAF(lSRk,lRkDm,snravg,snrth,eta,rho,SETfull) 3 | out = 0; 4 | for ii = 1:length(SETfull) 5 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 6 | [row,column] = size(elements); 7 | for rr = 1:row 8 | subsum = 0; 9 | for cc = 1:column 10 | subsum = subsum + lSRk(elements(rr,cc)); 11 | end 12 | % 13 | A = snrth*subsum/(1-rho) - ... 14 | 2*snrth*subsum*lRkDm/eta/rho*... 15 | (1-snrth*subsum/(1-rho)/snravg)*... 16 | log(sqrt(snrth*lRkDm*subsum/eta/rho/snravg)); 17 | out = out + ((-1)^(ii+1))*A; 18 | end 19 | end 20 | 21 | -------------------------------------------------------------------------------- /SOSforExactDPSDF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS DF, EXACT 2 | function out = SOSforExactDPSDF(lSRk,lRkDm,snrth,alpha,beta,SETfull) 3 | out = 0; 4 | mu = snrth/alpha; 5 | for ii = 1:length(SETfull) 6 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 7 | [row,column] = size(elements); 8 | for rr = 1:row 9 | subsum = 0; 10 | for cc = 1:column 11 | subsum = subsum + lSRk(elements(rr,cc)); 12 | end 13 | X = @(x) exp(- x.*subsum - snrth./beta./x.*lRkDm ); 14 | temp = integral(X,mu,inf); 15 | out = out + ((-1)^(ii+1)) * subsum * temp; 16 | end 17 | end -------------------------------------------------------------------------------- /SOSforExactDPSFGAF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS FG-AF, EXACT 2 | function out = SOSforExactDPSFGAF(lSRk,lRkDm,snrth,alpha,beta,kappa,SETfull) 3 | out = 0; 4 | for ii = 1:length(SETfull) 5 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 6 | [row,column] = size(elements); 7 | for rr = 1:row 8 | subsum = 0; 9 | for cc = 1:column 10 | subsum = subsum + lSRk(elements(rr,cc)); 11 | end 12 | out = out + ((-1)^(ii+1)) * exp(-snrth*subsum/alpha)*... 13 | sqrt(4*kappa*snrth*lRkDm*subsum/alpha/beta)*... 14 | besselk(1,sqrt(4*kappa*snrth*lRkDm*subsum/alpha/beta)); 15 | end 16 | end -------------------------------------------------------------------------------- /SOSforExactDPSVGAF.m: -------------------------------------------------------------------------------- 1 | % SUM OF SUM, DPS VG-AF, EXACT 2 | function out = SOSforExactDPSVGAF(lSRk,lRkDm,snrth,alpha,beta,SETfull) 3 | out = 0; 4 | mu = snrth/alpha; 5 | for ii = 1:length(SETfull) 6 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 7 | [row,column] = size(elements); 8 | for rr = 1:row 9 | subsum = 0; 10 | for cc = 1:column 11 | subsum = subsum + lSRk(elements(rr,cc)); 12 | end 13 | X = @(x) exp(- x.*subsum - ... 14 | (alpha.*snrth.*x + snrth).*lRkDm./... 15 | (alpha.*beta.*(x.^2) - beta.*snrth.*x)); 16 | temp = integral(X,mu,inf); 17 | out = out + ((-1)^(ii+1)) * subsum * temp; 18 | end 19 | end -------------------------------------------------------------------------------- /SOSforOmega.m: -------------------------------------------------------------------------------- 1 | % OMEGA 2 | % sum-of-sum function for m = 1 to M (full case) 3 | % K = 5; % number of relays 4 | % M = 5; % number of destinations 5 | % beta = 2.7; % path-loss exponent 6 | % % lambda (average channel gains) 7 | % lSD = lambda(K,M,beta); 8 | % Rth = 2; % bits/s/Hz 9 | % snrth = 2.^(2.*Rth) - 1; 10 | % snravg_dB = 10; % P/N0 in dB 11 | % snravg = 10.^(snravg_dB./10); 12 | % num_dest = M; 13 | % SET = 1:num_dest; 14 | % 15 | function out = SOSforOmega(lSD,snrth,snravg,SETfull) 16 | out = 0; 17 | for ii = 1:length(SETfull) 18 | elements = nchoosek(SETfull,ii); % n_1 < ... < n_t 19 | [row,column] = size(elements); 20 | for rr = 1:row 21 | subsum = 0; 22 | for cc = 1:column 23 | subsum = subsum + lSD(elements(rr,cc)); 24 | end 25 | out = out + ((-1)^(ii)) * exp(-snrth/snravg*subsum); 26 | end 27 | end -------------------------------------------------------------------------------- /SOSforThetaXi.m: -------------------------------------------------------------------------------- 1 | % THETA or XI 2 | % sum-of-sum function for m = 1 to M (full case) 3 | % K = 5; % number of relays 4 | % M = 5; % number of destinations 5 | % beta = 2.7; % path-loss exponent 6 | % % lambda (average channel gains) 7 | % lSD = lambda(K,M,beta); 8 | % Rth = 2; % bits/s/Hz 9 | % snrth = 2.^(2.*Rth) - 1; 10 | % snravg_dB = 10; % P/N0 in dB 11 | % snravg = 10.^(snravg_dB./10); 12 | % num_dest = M; 13 | % SET = 1:num_dest; 14 | % 15 | function out = SOSforThetaXi(lambda_m,lambda_l,SETminus) 16 | out = 0; 17 | for ii = 1:length(SETminus) 18 | elements = nchoosek(SETminus,ii); % n_1 < ... < n_t 19 | [row,column] = size(elements); 20 | for rr = 1:row 21 | subsum = 0; 22 | for cc = 1:column 23 | subsum = subsum + lambda_l(elements(rr,cc)); 24 | end 25 | out = out + ((-1)^(ii)) .* (lambda_m/(lambda_m + subsum)); 26 | end 27 | end -------------------------------------------------------------------------------- /fig3_PLOT_ALL.m: -------------------------------------------------------------------------------- 1 | % DOS and DPS, 3 SCHEMES, EXACT and ASYMPTOTIC 2 | close all 3 | clear all 4 | %% PARAMETERS 5 | K = 3; % number of relays 6 | M = 3; % number of destinations 7 | rho = 0.5; % power splitting ratio 8 | snravg_dB = -10:1:20; % in dB 9 | snravg = 10.^(snravg_dB./10); 10 | Rth = 1; % bits/s/Hz 11 | snrth = 2.^(2.*Rth) - 1; 12 | espsilon = 2.7; % path loss exponent 13 | eta = 0.7; % energy conversion efficiency 14 | % 15 | [lSDm,lSRk,lRkDm] = lambda(K,M,espsilon); % lambda 16 | set_dest_full = 1:M; 17 | set_relay_full = 1:K; 18 | % 19 | Sim_times = 10^0; % for Monte-Carlo 20 | %% SIMULATIONS 21 | for ss = 1:length(snravg_dB) 22 | disp(['SNR=' num2str(snravg_dB(ss)) 'dB']); 23 | % DOS DF 24 | [DOS_DF_exact_out(ss),DOS_DF_approx_out(ss)] = DOS_DF_exact_approx... 25 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 26 | DOS_DF_asym_out(ss) = DOS_DF_asym... 27 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 28 | % DOS VG-AF 29 | [DOS_VGAF_exact_out(ss),DOS_VGAF_approx_out(ss)] = DOS_VGAF_exact_approx... 30 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 31 | DOS_VGAF_asym_out(ss) = DOS_VGAF_asym... 32 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 33 | % DOS FG-AF 34 | DOS_FGAF_exact_out(ss) = DOS_FGAF_exact... 35 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 36 | DOS_FGAF_asym_out(ss) = DOS_FGAF_asym... 37 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 38 | %% 39 | % DPS DF 40 | [DPS_DF_exact_out(ss),DPS_DF_approx(ss)] = ... 41 | DPS_DF_exact_approx... 42 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 43 | DPS_DF_asym_out(ss) = DPS_DF_asym... 44 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 45 | % DPS VG-AF 46 | [DPS_VGAF_exact_out(ss),DPS_VGAF_approx(ss)] = DPS_VGAF_exact_approx... 47 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 48 | DPS_VGAF_asym_out(ss) = DPS_VGAF_asym... 49 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 50 | % DPS FG-AF 51 | DPS_FGAF_exact_out(ss) = DPS_FGAF_exact... 52 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 53 | DPS_FGAF_asym_out(ss) = DPS_FGAF_asym... 54 | (K,M,rho,snrth,snravg(ss),espsilon,eta,Sim_times); 55 | end 56 | 57 | %% PLOT 58 | semilogy(snravg_dB,DOS_DF_exact_out,'bs-',... 59 | 'MarkerFaceColor','b') 60 | hold on 61 | semilogy(snravg_dB,DOS_VGAF_exact_out,'b^-',... 62 | 'MarkerFaceColor','b') 63 | hold on 64 | semilogy(snravg_dB,DOS_FGAF_exact_out,'bo-',... 65 | 'MarkerFaceColor','b') 66 | hold on 67 | semilogy(snravg_dB,DPS_DF_exact_out,'rs-') 68 | hold on 69 | semilogy(snravg_dB,DPS_VGAF_exact_out,'r^-') 70 | hold on 71 | semilogy(snravg_dB,DPS_FGAF_exact_out,'ro-') 72 | hold on 73 | % 74 | semilogy(snravg_dB,DOS_DF_asym_out,'b:') 75 | hold on 76 | semilogy(snravg_dB,DOS_VGAF_asym_out,'b:') 77 | hold on 78 | semilogy(snravg_dB,DOS_FGAF_asym_out,'b:') 79 | hold on 80 | semilogy(snravg_dB,DPS_DF_asym_out,'r:') 81 | hold on 82 | semilogy(snravg_dB,DPS_VGAF_asym_out,'r:') 83 | hold on 84 | semilogy(snravg_dB,DPS_FGAF_asym_out,'r:') 85 | %% 86 | xlabel('Transmit SNR (dBm)') 87 | ylabel('Outage Probability') 88 | legend('DOS DF','DOS VG-AF','DOS FG-AF',... 89 | 'DPS DF','DPS VG-AF','DPS FG-AF',... 90 | 'Location','SouthWest') 91 | % 92 | set(gca,'XTick',-10:10:20) 93 | set(gca,'XTickLabel',[20 30 40 50] ); 94 | axis([-10 20 10^-8 1]) -------------------------------------------------------------------------------- /lambda.m: -------------------------------------------------------------------------------- 1 | % calculating lambda based on distance and path-loss 2 | function [lSDm,lSRk,lRkDm] = lambda(K,M,beta) 3 | dSD = 10; 4 | dSR = 3; 5 | dRD = 7; 6 | 7 | lSDm = (1e-3)*(dSD^beta)*ones(1,M); 8 | lSRk = (1e-3)*(dSR^beta)*ones(1,K); 9 | lRkDm = (1e-3)*(dRD^beta)*ones(K,M); 10 | 11 | % % clear all 12 | % % close all 13 | % % K = 5; 14 | % % M = 5; 15 | % % beta = 2.7; 16 | % S = [0, .5]; 17 | % % Asymmetric topology 18 | % D1 = [1,.45]; 19 | % D2 = [1,.5]; 20 | % D3 = [1,.55]; 21 | % D4 = [1,.4]; 22 | % D5 = [1,.6]; 23 | % R1 = [.4,.45]; 24 | % R2 = [.4,.5]; 25 | % R3 = [.4,.55]; 26 | % R4 = [.4,.4]; 27 | % R5 = [.4,.6]; 28 | % % 29 | % dest = [D1;D2;D3;D4;D5]; 30 | % relay = [R1;R2;R3;R4;R5]; 31 | % % Calculate average channel gain \lambda 32 | % lSDm = zeros(1,M); 33 | % lSRk = zeros(1,K); 34 | % lRkDm = zeros(K,M); 35 | % for mm = 1:M 36 | % lSDm(mm) = (sqrt(abs(S(1) - dest(mm,1))^2 + ... 37 | % abs(S(2)-dest(mm,2))^2))^beta; 38 | % end 39 | % for kk = 1:K 40 | % lSRk(kk) = (sqrt(abs(S(1) - relay(kk,1))^2 + ... 41 | % abs(S(2)-dest(kk,2))^2))^beta; 42 | % for mm = 1:M 43 | % lRkDm(kk,mm) = (sqrt(abs(relay(kk,1) - dest(mm,1))^2 + ... 44 | % abs(relay(kk,2) - dest(mm,2))^2))^beta; 45 | % end 46 | % end 47 | % % %% Plot 48 | % % figure(1) 49 | % % % Topology 50 | % % plot(S(1),S(2),'ks','MarkerSize',10,'MarkerFaceColor','b'); 51 | % % hold on 52 | % % for mm = 1:M 53 | % % plot(dest(mm,1),dest(mm,2),'ks','MarkerSize',10,'MarkerFaceColor','r'); 54 | % % hold on 55 | % % end 56 | % % for kk = 1:K 57 | % % plot(relay(kk,1),relay(kk,2),'ko','MarkerSize',10,'MarkerFaceColor','k'); 58 | % % hold on 59 | % % plot([S(1),relay(kk,1)],[S(2),relay(kk,2)],'b-'); 60 | % % plot([S(1),dest(kk,1)],[S(2),dest(kk,2)],'r-'); 61 | % % hold on 62 | % % for mm = 1:M 63 | % % plot([relay(kk,1),dest(mm,1)],[relay(kk,2),dest(mm,2)],'--'); 64 | % % hold on 65 | % % end 66 | % % end 67 | % % % 68 | % % axis([0 1 0 1]) 69 | % % pbaspect([1 1 1]) --------------------------------------------------------------------------------