Advertisement
martaczaska

Mgr

Jan 8th, 2022
1,034
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.73 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import pandas as panda
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import math
  6.  
  7.  
  8. #constants
  9. freq_reuse_factor = 3
  10. R_c = 600
  11. mi = 0.6
  12. centre_range = mi * R_c
  13. edge_range = R_c - centre_range
  14. f = 2.1 #* 10**9 #[GHz]
  15. h_UE = 1.5 #[m]
  16. h_BS = 10 # [m]
  17. d = 1 ### ?
  18. R_0 = 100 #[m], nominal reference distance
  19. gamma = 4 #path loss exponent
  20. alfa = ...
  21. omega = 1.25
  22. C = 3*10**8 #[m/s]
  23.  
  24. #noise
  25. k = 1.38 * 10**(-23)
  26. T_0 = 297
  27. BW = 20 #[MHz] ?, w atykule BW = 5MHz i S = 25 sub-ch
  28. S = 100 #number of subchannels in the whole bandwidth
  29. N = k * T_0 * (BW * 10**6/S)
  30.  
  31. #values needed to calculate fi and ni
  32. Xf = 6 * math.log10(f/2) #correction factor for frequencies above 2 GHz
  33. Xh = -d * math.log10(h_UE/2) #correction factor for the receiver
  34. s = 5 #shadowing term, normal random variable (value from normal distribution) ???
  35. T = 16 #number of subchannels available at the edge of a cell, T=4 w artykule
  36.  
  37. #bilans
  38. G_T = 10
  39. G_R = 0
  40. L_T = 7 #?
  41. L_R = 1# ?
  42. P_T = 1 #[dBm]
  43.  
  44.  
  45. def calculateFi(R, R_0_prim, c, freq):
  46.     power_1 = (G_T + G_R - (s + Xf + Xh + L_T + L_R))/10
  47.     power_2 = (G_T + G_R - (s + L_T + L_R))/10
  48.  
  49.     wavelght = c / (freq * 10**9)
  50.  
  51.     if(R/R_c > R_0_prim/R_c):
  52.         fi = (R_0/R_c)**gamma * (wavelght/(4*math.pi*R_0_prim))**2 * 10**power_1
  53.     else:
  54.         fi = (wavelght/(4*math.pi*R_c))**2 * 10**power_2
  55.  
  56.     return fi
  57.  
  58. def changeToLinear(x):
  59.     linear = 10**(x/10)
  60.     return linear
  61.  
  62. def calculateNi(R, R_0_prim):
  63.     if(R/R_c > R_0_prim/R_c):
  64.         ni = gamma
  65.     else:
  66.         ni = 2
  67.    
  68.     return ni
  69.  
  70. def calculateP_Tc(P_T, omega, scheme = 1):
  71.     P_T_Wat = 10**(P_T/10 - 3)
  72.     if (scheme == 1):
  73.         P_Tc = P_T_Wat/(omega*T + S - freq_reuse_factor*T)
  74.     else:
  75.         P_Tc = P_T_Wat/(omega*T + S - T)
  76.  
  77.     return P_Tc
  78.  
  79. def calculateFresnelZoneBreakpoint(h_t, h_r, c, freq):
  80.     sum = h_t + h_r
  81.     diff = h_t - h_r
  82.     wavelght = c / (freq * 10**9)
  83.     R_0_prim = 1/wavelght*math.sqrt((sum**2 - diff**2)**2 -2*(sum**2 + diff**2)*(wavelght/2)**2 + (wavelght/2)**4)
  84.  
  85.     return R_0_prim
  86.  
  87. def calculateSINRinCellCenter(R, mi, omega, P_Tc, ni, fi, fi_2, scheme = 1):
  88.     if (scheme == 1):
  89.         S = (R/R_c)**(-ni)
  90.         I_c1 = 6*(fi_2/fi) * math.sqrt(3)**(-gamma)
  91.         I_c2 = 12*(fi_2/fi) * math.sqrt(3*freq_reuse_factor)**(-gamma)
  92.         Noise = N / (fi *P_Tc)
  93.  
  94.         SINR = S/(I_c1 + I_c2 + Noise)
  95.     else:
  96.         S = (R/R_c)**(-ni)
  97.         I_c = 3*(fi_2/fi) * ((1 + omega)*math.sqrt(3)**(-gamma) + (3 + omega)*math.sqrt(3*freq_reuse_factor)**(-gamma))
  98.         Noise = N / (fi *P_Tc)
  99.  
  100.         SINR = S/(I_c + Noise)
  101.  
  102.     return SINR
  103.  
  104. def calculateSINRinCellEdge(R, mi, omega, P_Tc, ni, fi, fi_2, scheme = 1):
  105.     if (scheme == 1):
  106.         S = (R/R_c)**(-ni)
  107.         I_c = 6*(fi_2/fi) * math.sqrt(3*freq_reuse_factor)**(-gamma)
  108.         Noise = N / (omega*fi *P_Tc)
  109.  
  110.         SINR = S/(I_c + Noise)
  111.     else:
  112.         S = (R/R_c)**(-ni)
  113.         I_c = 6*(fi_2/fi) * ((1/omega)*math.sqrt(3)**(-gamma) + (1 + 1/omega)*math.sqrt(3*freq_reuse_factor)**(-gamma))
  114.         Noise = N / (omega*fi *P_Tc)
  115.  
  116.         SINR = S/(I_c + Noise)
  117.  
  118.     return SINR
  119.  
  120. def plotGraph(x, y):
  121.     graph = panda.DataFrame(y, x)
  122.     graph.plot(kind='line', grid=True, label='SINR [dB]')
  123.     plt.show()
  124.     #plt.savefig('wykres SINR.png')
  125.  
  126.  
  127. def main():
  128.     R_0_prim = calculateFresnelZoneBreakpoint(h_BS, h_UE, C, f)
  129.     fi_result = calculateFi(200, R_0_prim, C, f)
  130.     fi_2 = calculateFi(500, R_0_prim, C, f)
  131.  
  132.     ### SCHEME 1 ###
  133.     calculated_SINR_sch_1 = []
  134.     x = []
  135.     P_tc_1 = calculateP_Tc(P_T, omega, scheme = 1)
  136.    
  137.     file = open("calculated_SINR.txt", "w")
  138.     file.write("P_tc_1: "); file.write(str(P_tc_1)); file.write(" \n")
  139.     file.write("R_0_prim: "); file.write(str(R_0_prim)); file.write(" \n")
  140.  
  141.     for r in range(1, R_c):
  142.         ni_result = calculateNi(r, R_0_prim)
  143.         x.append(r/R_c)
  144.         #x.append(r)
  145.  
  146.         if(r < R_0_prim):
  147.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 1)
  148.         else:
  149.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 1)
  150.         sinr_in_dB = 10*math.log10(sinr)
  151.         calculated_SINR_sch_1.append(sinr_in_dB)
  152.        
  153.         file.write(str(sinr_in_dB))
  154.         file.write(" \n")
  155.  
  156.     plotGraph(x, calculated_SINR_sch_1)
  157.     plt.savefig('wykres SINR (sch_1).png')
  158.     file.close()
  159.  
  160.     ### SCHEME 2 ###
  161.     calculated_SINR_sch_2 = []
  162.     P_tc_1 = calculateP_Tc(P_T, omega, scheme = 2)
  163.    
  164.     file_2 = open("calculated_SINR (sch_2).txt", "w")
  165.     file_2.write("P_tc_1: "); file_2.write(str(P_tc_1)); file_2.write(" \n")
  166.     file_2.write("R_0_prim: "); file_2.write(str(R_0_prim)); file_2.write(" \n")
  167.  
  168.     for r in range(1, R_c):
  169.         ni_result = calculateNi(r, R_0_prim)
  170.  
  171.         if(r < R_0_prim):
  172.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  173.         else:
  174.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  175.         sinr_in_dB = 10*math.log10(sinr)
  176.         calculated_SINR_sch_2.append(sinr_in_dB)
  177.        
  178.         file_2.write(str(sinr_in_dB))
  179.         file_2.write(" \n")
  180.  
  181.     plotGraph(x, calculated_SINR_sch_2)
  182.     plt.savefig('wykres SINR (sch_2).png')
  183.     file_2.close()
  184.  
  185.     ## PLOT BOTH GRAPHS ON ONE ##
  186.     #graph.plot(kind='line', grid=True, label='SINR [dB]')
  187.     plt.plot(x, calculated_SINR_sch_1, label='Scheme I')
  188.     plt.plot(x, calculated_SINR_sch_2, label='Scheme II')
  189.     plt.legend(loc='upper right')
  190.     plt.xlabel('d/R')
  191.     plt.ylabel('SINR [dB]')
  192.     plt.savefig('Both schemes.png')
  193.  
  194. if __name__ == "__main__":
  195.     main()
  196.  
  197.  
  198.  
  199.  
  200.    
  201.  
  202.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement