Advertisement
martaczaska

z parametrami Natalii

Mar 24th, 2022
976
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.39 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 = 1200
  11. mi = 0.6
  12. centre_range = 981 #mi * R_c
  13. edge_range = R_c - centre_range
  14. f = 2.3 #* 10**9 #[GHz]
  15. h_UE = 2 #[m]
  16. h_BS = 16 # [m]
  17. d = R_c ### ?
  18. R_0 = 100 #[m], nominal reference distance
  19. gamma = 5.056 #path loss exponent
  20. alfa = ...
  21. omega = 1.5
  22. C = 3*10**8 #[m/s]
  23.  
  24. #noise
  25. k = 1.38 * 10**(-23)
  26. T_0 = 293
  27. BW = 5 #[MHz] ?, w atykule BW = 5MHz i S = 25 sub-ch
  28. S = 25 #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 = -R_c * 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 = 5 #?
  41. L_R = 0# ?
  42. P_T = 23 #[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.     #R_0_prim = (4*h_t*h_r)/wavelght
  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, name):
  121.     graph = panda.DataFrame(y, x)
  122.     graph.plot(kind='line', grid=True, label='SINR [dB]')
  123.     plt.show()
  124.     plt.savefig(name)
  125.  
  126. def calculateSINRAndPlotGraphs():
  127.     #R_0_prim = calculateFresnelZoneBreakpoint(h_BS, h_UE, C, f)
  128.     R_0_prim = 1201 #centre_range
  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.  
  145.         if(r < R_0_prim):
  146.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 1)
  147.         else:
  148.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 1)
  149.         sinr_in_dB = 10*math.log10(sinr)
  150.         calculated_SINR_sch_1.append(sinr_in_dB)
  151.        
  152.         file.write(str(sinr_in_dB))
  153.         file.write(" \n")
  154.  
  155.     plt.figure(1)
  156.     # plotGraph(x, calculated_SINR_sch_1, name = 'wykres SINR (sch_1).png')
  157.     plt.plot(x, calculated_SINR_sch_1)
  158.     plt.savefig('wykres SINR (sch_1).png')
  159.     file.close()
  160.  
  161.     ### SCHEME 2 ###
  162.     calculated_SINR_sch_2 = []
  163.     P_tc_1 = calculateP_Tc(P_T, omega, scheme = 2)
  164.    
  165.     file_2 = open("calculated_SINR (sch_2).txt", "w")
  166.     file_2.write("P_tc_1: "); file_2.write(str(P_tc_1)); file_2.write(" \n")
  167.     file_2.write("R_0_prim: "); file_2.write(str(R_0_prim)); file_2.write(" \n")
  168.  
  169.     for r in range(1, R_c):
  170.         ni_result = calculateNi(r, R_0_prim)
  171.  
  172.         if(r < R_0_prim):
  173.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  174.         else:
  175.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  176.         sinr_in_dB = 10*math.log10(sinr)
  177.         calculated_SINR_sch_2.append(sinr_in_dB)
  178.        
  179.         file_2.write(str(sinr_in_dB))
  180.         file_2.write(" \n")
  181.  
  182.     plt.figure(2)
  183.     # plotGraph(x, calculated_SINR_sch_2, name = 'wykres SINR (sch_2).png')
  184.     plt.plot(x, calculated_SINR_sch_2)
  185.     plt.savefig('wykres SINR (sch_2).png')
  186.  
  187.     file_2.close()
  188.  
  189.     ## PLOT BOTH GRAPHS ON ONE ##
  190.     plt.figure(3)
  191.     plt.plot(x, calculated_SINR_sch_1, label='Schemat I')
  192.     plt.plot(x, calculated_SINR_sch_2, label='Schemat II')
  193.     plt.legend(loc='upper right')
  194.     plt.title("Wartość SINR w funkcji odległości od stacji bazowej przy użyciu FFR")
  195.     plt.xlabel('d/R')
  196.     plt.ylabel('SINR [dB]')
  197.     plt.savefig('Both schemes.png')
  198.  
  199. def calculateGainInICIC():
  200.     #R_0_prim = calculateFresnelZoneBreakpoint(h_BS, h_UE, C, f)
  201.     R_0_prim = centre_range
  202.     calculated_difference = []
  203.     fi_result = calculateFi(R_0_prim - 5, R_0_prim, C, f)
  204.     fi_2 = calculateFi(R_0_prim + 5, R_0_prim, C, f)
  205.     x_ch =[]
  206.     ni_result = 2 #calculateNi(R_0_prim, R_0_prim)
  207.     omega_ch = 1.01
  208.  
  209.     if(omega_ch < 1.9):
  210.         P_tc = calculateP_Tc(P_T, omega_ch, scheme = 2)
  211.  
  212.         sinr_c = calculateSINRinCellCenter((R_0_prim - 1), mi, omega_ch, P_tc, ni_result, fi_result, fi_2, scheme = 1)
  213.         sinr_c_in_dB = 10*math.log10(sinr_c)
  214.         sinr_e = calculateSINRinCellEdge((R_0_prim + 1), mi, omega_ch, P_tc, ni_result, fi_result, fi_2, scheme = 1)
  215.         sinr_e_in_dB = 10*math.log10(sinr_e)
  216.         gain = sinr_e_in_dB - sinr_c_in_dB
  217.  
  218.         calculated_difference.append(gain)
  219.         x_ch.append(omega_ch)
  220.         omega_ch += 0.01
  221.        
  222.     ## PLOT BOTH GRAPHS ON ONE ##
  223.     plt.figure(4)
  224.     plt.plot(x_ch, calculated_difference, label='Scheme I')
  225.     plt.legend(loc='upper right')
  226.     plt.xlabel('omega')
  227.     plt.ylabel('Gain in SINR value [dB]')
  228.     plt.title("Schemat przedstawiający wzrost w wartości SINR w zależności od wzrostu wartości omegi")
  229.     plt.savefig('SINR diff.png')
  230.  
  231. def main():
  232.     calculateSINRAndPlotGraphs()
  233.     #calculateGainInICIC()
  234.  
  235.    
  236. if __name__ == "__main__":
  237.     main()
  238.  
  239.  
  240.  
  241.  
  242.    
  243.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement