Advertisement
martaczaska

MGR - 19.04

Apr 19th, 2022
995
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.56 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 = 200
  11. mi = 0.7
  12. centre_range = mi * R_c
  13. edge_range = R_c - centre_range
  14. f = 2.5 #2.5 # 2.1 * 10**9 #[GHz]
  15. h_UE = 1.5 #[m]
  16. h_BS = 12 # [m]
  17. d = R_c ### ?
  18. R_0 = 100 #[m], nominal reference distance
  19. gamma = 4 #path loss exponent                          # !!!!!!!!!!
  20. alfa = ...
  21. omega = 1.4
  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) * (10**3)                           # funkcja zależna od schematu 1 i 2 !!!!!!!
  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 = 15
  39. G_R = 0
  40. L_T = 5 #7 #?
  41. L_R = 0 #1# ?
  42. P_T = 10 #[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.     print("potega :",str(power_1))
  49.  
  50.     wavelght = c / (freq * (10**9))
  51.  
  52.     if(R/R_c > R_0_prim/R_c):
  53.         fi = (R_0/R_c)**gamma * (wavelght/(4*math.pi*R_0_prim))**2 * (10**power_1)
  54.     else:
  55.         fi = (wavelght/(4*math.pi*R_c))**2 * (10**power_2)
  56.  
  57.     return fi
  58.  
  59. def changeToLinear(x): #do wywalenia
  60.     linear = 10**(x/10)
  61.     return linear
  62.  
  63. def calculateNi(R, R_0_prim):
  64.     if(R/R_c > R_0_prim/R_c):
  65.         ni = gamma
  66.     else:
  67.         ni = 2
  68.    
  69.     return ni
  70.  
  71. def calculateP_Tc(P_T, omega, scheme = 1):
  72.     P_T_Wat = 10**(P_T/10 - 3)
  73.     if (scheme == 1):
  74.         P_Tc = P_T_Wat/(omega*T + S - freq_reuse_factor*T)
  75.     else:
  76.         P_Tc = P_T_Wat/(omega*T + S - T)
  77.  
  78.     return P_Tc
  79.  
  80. def calculateFresnelZoneBreakpoint(h_t, h_r, c, freq):
  81.     sum = h_t + h_r
  82.     diff = h_t - h_r
  83.     wavelght = c / (freq * 10**9)
  84.     R_0_prim = 1/wavelght*math.sqrt((sum**2 - diff**2)**2 -2*(sum**2 + diff**2)*(wavelght/2)**2 + (wavelght/2)**4)
  85.     #R_0_prim = (4*h_t*h_r)/wavelght
  86.     return R_0_prim
  87.  
  88. def calculateSINRinCellCenter(R, mi, omega, P_Tc, ni, fi, fi_2, scheme = 1):
  89.     if (scheme == 1):
  90.         S = (R/R_c)**(-ni)
  91.         I_c1 = 6*(fi_2/fi) * (math.sqrt(3)**(-gamma))
  92.         I_c2 = 12*(fi_2/fi) * (math.sqrt(3*freq_reuse_factor)**(-gamma))
  93.         Noise = N / (fi *P_Tc)
  94.  
  95.         SINR = S/(I_c1 + I_c2 + Noise)
  96.     else:
  97.         S = (R/R_c)**(-ni)
  98.         I_c = 3*(fi_2/fi) * ((1 + omega)*math.sqrt(3)**(-gamma) + (3 + omega)*math.sqrt(3*freq_reuse_factor)**(-gamma))
  99.         Noise = N / (fi *P_Tc)
  100.  
  101.         SINR = S/(I_c + Noise)
  102.  
  103.     return SINR
  104.  
  105. def calculateSINRinCellEdge(R, mi, omega, P_Tc, ni, fi, fi_2, scheme = 1):
  106.     if (scheme == 1):
  107.         S = (R/R_c)**(-ni)
  108.         I_c = 6*(fi_2/fi) * (math.sqrt(3*freq_reuse_factor)**(-gamma))
  109.         Noise = N / (omega*fi *P_Tc)
  110.  
  111.         SINR = S/(I_c + Noise)
  112.     else:
  113.         S = (R/R_c)**(-ni)
  114.         I_c = 6*(fi_2/fi) * ((1/omega)*math.sqrt(3)**(-gamma) + (1 + 1/omega)*math.sqrt(3*freq_reuse_factor)**(-gamma))
  115.         Noise = N / (omega*fi *P_Tc)
  116.  
  117.         SINR = S/(I_c + Noise)
  118.  
  119.     return SINR
  120.  
  121. def plotGraph(x, y, name):
  122.     graph = panda.DataFrame(y, x)
  123.     graph.plot(kind='line', grid=True, label='SINR [dB]')
  124.     plt.show()
  125.     plt.savefig(name)
  126.  
  127. def calculateSINRAndPlotGraphs():
  128.     R_0_prim = centre_range #R_0_prim = calculateFresnelZoneBreakpoint(h_BS, h_UE, C, f)
  129.     fi_result = calculateFi((R_0_prim - 1), R_0_prim, C, f) # fi dla center
  130.     fi_2 = calculateFi((R_0_prim + 1), R_0_prim, C, f) # fi dla edge
  131.     print("fi_gwiazdka: ", str(fi_2))
  132.     print("fi_center: ", str(fi_result))
  133.  
  134.     ni_result_c = calculateNi((R_0_prim - 1), R_0_prim)
  135.     ni_result_e = calculateNi((R_0_prim + 1), R_0_prim)
  136.  
  137.     ### SCHEME 1 ###
  138.     calculated_SINR_sch_1 = []
  139.     x = []
  140.     P_tc_1 = calculateP_Tc(P_T, omega, scheme = 1)
  141.    
  142.     file = open("calculated_SINR.txt", "w")
  143.     file.write("P_tc_1: "); file.write(str(P_tc_1)); file.write(" \n")
  144.     file.write("R_0_prim: "); file.write(str(R_0_prim)); file.write(" \n")
  145.  
  146.     for r in range(1, R_c):
  147.         x.append(r/R_c)
  148.  
  149.         if(r < R_0_prim):
  150.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result_c, fi_result, fi_2, scheme = 1)
  151.         else:
  152.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result_e, fi_result, fi_2, scheme = 1)
  153.         sinr_in_dB = 10*math.log10(sinr)
  154.         calculated_SINR_sch_1.append(sinr_in_dB)
  155.        
  156.         file.write(str(sinr_in_dB))
  157.         file.write(" \n")
  158.  
  159.     plt.figure(1)
  160.     plt.plot(x, calculated_SINR_sch_1)
  161.     plt.savefig('wykres SINR (sch_1).png')
  162.     file.close()
  163.  
  164.     ### SCHEME 2 ###
  165.     calculated_SINR_sch_2 = []
  166.     P_tc_1 = calculateP_Tc(P_T, omega, scheme = 2)
  167.    
  168.     file_2 = open("calculated_SINR (sch_2).txt", "w")
  169.     file_2.write("P_tc_1: "); file_2.write(str(P_tc_1)); file_2.write(" \n")
  170.     file_2.write("R_0_prim: "); file_2.write(str(R_0_prim)); file_2.write(" \n")
  171.  
  172.     for r in range(1, R_c):
  173.         ni_result = calculateNi(r, R_0_prim)
  174.  
  175.         if(r < R_0_prim):
  176.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  177.         else:
  178.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  179.         sinr_in_dB = 10*math.log10(sinr)
  180.         calculated_SINR_sch_2.append(sinr_in_dB)
  181.        
  182.         file_2.write(str(sinr_in_dB))
  183.         file_2.write(" \n")
  184.  
  185.     plt.figure(2)
  186.     plt.plot(x, calculated_SINR_sch_2)
  187.     plt.savefig('wykres SINR (sch_2).png')
  188.  
  189.     file_2.close()
  190.  
  191.     ## PLOT BOTH GRAPHS ON ONE ##
  192.     plt.figure(3)
  193.     plt.plot(x, calculated_SINR_sch_1, label='Schemat I')
  194.     plt.plot(x, calculated_SINR_sch_2, label='Schemat II')
  195.     plt.legend(loc='upper right')
  196.     plt.title("Wartość SINR w funkcji odległości od stacji bazowej przy użyciu FFR")
  197.     plt.xlabel('d/R')
  198.     plt.ylabel('SINR [dB]')
  199.     plt.savefig('Both schemes.png')
  200.  
  201. def intelligenFrequencyReuse():
  202.     file_3 = open("intelligent_FR.txt", "w")
  203.     file_3.write("INTELLIGENT FREQUENCY REUSE - wyniki w kolejnych krokach "); file_3.write(" \n")
  204.     #### dopisać algorytm
  205.     file_3.close()
  206.  
  207. def calculateGainInICIC():
  208.     file_4 = open("calculate_gain.txt", "w")
  209.     file_4.write("Oblicz  zysk w ICIC"); file_4.write(" \n")
  210.  
  211.     R_0_prim = centre_range  #R_0_prim = calculateFresnelZoneBreakpoint(h_BS, h_UE, C, f)
  212.     calculated_difference_1 = []
  213.     calculated_difference_2 = []
  214.     fi_result = calculateFi((R_0_prim-10), R_0_prim, C, f)
  215.     fi_2 = calculateFi((R_0_prim+10), R_0_prim, C, f)
  216.     x_ch =[]
  217.     ni_result = 2 #calculateNi(R_0_prim, R_0_prim)
  218.     omega_ch = 1.01
  219.  
  220.     for omega_ch in range(101, 280, 1):
  221.         omega_ch = omega_ch/100
  222.         P_tc = calculateP_Tc(P_T, omega_ch, scheme = 1)
  223.         file_4.write("Dla: "); file_4.write(str(P_tc)); file_4.write(" sinr na granicy centrum = ");
  224.         sinr_c = calculateSINRinCellCenter((R_0_prim - 1), mi, omega_ch, P_tc, ni_result, fi_result, fi_2, scheme = 1)
  225.         sinr_c_in_dB = 10*math.log10(sinr_c)
  226.         file_4.write(str(sinr_c_in_dB))
  227.         sinr_e = calculateSINRinCellEdge((R_0_prim + 1), mi, omega_ch, P_tc, gamma, fi_result, fi_2, scheme = 1)
  228.         sinr_e_in_dB = 10*math.log10(sinr_e)
  229.         file_4.write(" ,na poczatku czesci granicznej = "); file_4.write(str(sinr_e_in_dB))
  230.         gain_1 = sinr_e_in_dB - sinr_c_in_dB
  231.         file_4.write(" , a roznica wynosila = "); file_4.write(str(gain_1)); file_4.write(" \n")
  232.  
  233.         calculated_difference_1.append(gain_1)
  234.  
  235.  
  236.         P_tc = calculateP_Tc(P_T, omega_ch, scheme = 2)
  237.         sinr_c = calculateSINRinCellCenter((R_0_prim - 1), mi, omega_ch, P_tc, ni_result, fi_result, fi_2, scheme = 2)
  238.         sinr_c_in_dB = 10*math.log10(sinr_c)
  239.         sinr_e = calculateSINRinCellEdge((R_0_prim + 1), mi, omega_ch, P_tc, gamma, fi_result, fi_2, scheme = 2)
  240.         sinr_e_in_dB = 10*math.log10(sinr_e)
  241.         gain_2 = sinr_e_in_dB - sinr_c_in_dB
  242.  
  243.         calculated_difference_2.append(gain_2)
  244.         x_ch.append(omega_ch)
  245.         print(omega_ch)
  246.        
  247.     ## PLOT BOTH GRAPHS ON ONE ##
  248.     plt.figure(4)
  249.     plt.plot(x_ch, calculated_difference_1, label='Scheme I', markersize=20)
  250.     plt.plot(x_ch, calculated_difference_2, label='Schemat II', linestyle='dashed')
  251.     plt.legend(loc='upper right')
  252.     plt.xlabel('omega')
  253.     plt.ylabel('Gain in SINR value [dB]')
  254.     plt.title("Wzrost w wartości SINR w zależności od wzrostu wartości omegi")
  255.     plt.savefig('SINR diff.png')
  256.  
  257.     file_4.close()
  258.  
  259. def plotSINRforDifferentOmegas():
  260.     R_0_prim = centre_range
  261.     fi_result = calculateFi((R_0_prim - 1), R_0_prim, C, f) # fi dla center
  262.     fi_2 = calculateFi((R_0_prim + 1), R_0_prim, C, f) # fi dla edge
  263.  
  264.     ni_result_c = calculateNi((R_0_prim - 1), R_0_prim)
  265.     ni_result_e = calculateNi((R_0_prim + 1), R_0_prim)
  266.  
  267.     # omegas_for_plotting = [1.0, 1.2, 1.5, 1.8, 2.0]
  268.     omegas_for_plotting = [1.0, 1.5, 2.0, 2.5, 3.5]
  269.  
  270.     dict_scheme_1 = {}
  271.  
  272.     ### SCHEME 1 ###
  273.     for omega_1 in omegas_for_plotting:
  274.         calculated_SINR_sch_1 = []
  275.         x = []
  276.         P_tc_1 = calculateP_Tc(P_T, omega_1, scheme = 1)
  277.  
  278.         for r in range(1, R_c):
  279.             x.append(r/R_c)
  280.  
  281.             if(r < R_0_prim):
  282.                 sinr = calculateSINRinCellCenter(r, mi, omega_1, P_tc_1, ni_result_c, fi_result, fi_2, scheme = 1)
  283.             else:
  284.                 sinr = calculateSINRinCellEdge(r, mi, omega_1, P_tc_1, ni_result_e, fi_result, fi_2, scheme = 1)
  285.             sinr_in_dB = 10*math.log10(sinr)
  286.             calculated_SINR_sch_1.append(sinr_in_dB)
  287.  
  288.         dict_scheme_1[omega_1] = calculated_SINR_sch_1
  289.        
  290.  
  291.     ## GRAPHS FOR SCHEME 1 ##
  292.     plt.figure(5)
  293.     for omega_1 in omegas_for_plotting:
  294.         plt.plot(x, dict_scheme_1[omega_1], label='Schemat I - omega: '+str(omega_1))
  295.    
  296.     plt.legend(loc='upper right')
  297.     plt.title("Wartość SINR w funkcji odległości od stacji bazowej przy użyciu FFR")
  298.     plt.xlabel('d/R')
  299.     plt.ylabel('SINR [dB]')
  300.     plt.savefig('SINR_for_few_omegas_SCH_1.png')
  301.  
  302.  
  303.     ### SCHEME 2 ###
  304.     dict_scheme_2 = {}
  305.  
  306.     for omega_1 in omegas_for_plotting:
  307.         P_tc_1 = calculateP_Tc(P_T, omega_1, scheme = 2)
  308.         calculated_SINR_sch_2 = []
  309.  
  310.         for r in range(1, R_c):
  311.             ni_result = calculateNi(r, R_0_prim)
  312.  
  313.             if(r < R_0_prim):
  314.                 sinr = calculateSINRinCellCenter(r, mi, omega_1, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  315.             else:
  316.                 sinr = calculateSINRinCellEdge(r, mi, omega_1, P_tc_1, ni_result, fi_result, fi_2, scheme = 2)
  317.             sinr_in_dB = 10*math.log10(sinr)
  318.             calculated_SINR_sch_2.append(sinr_in_dB)
  319.        
  320.         dict_scheme_2[omega_1] = calculated_SINR_sch_2
  321.  
  322.     ## GRAPHS FOR SCHEME 2 ##
  323.     plt.figure(6)
  324.     for omega_1 in omegas_for_plotting:
  325.         plt.plot(x, dict_scheme_2[omega_1], label='Schemat I - omega: '+str(omega_1))
  326.  
  327.     plt.legend(loc='upper right')
  328.     plt.title("Wartość SINR w funkcji odległości od stacji bazowej przy użyciu FFR")
  329.     plt.xlabel('d/R')
  330.     plt.ylabel('SINR [dB]')
  331.     plt.savefig('SINR_for_few_omegas_SCH_2.png')
  332.  
  333.  
  334. def intelligentFrequencyReuse():
  335.     R_0_prim = centre_range
  336.     fi_result = calculateFi((R_0_prim - 1), R_0_prim, C, f) # fi dla center
  337.     fi_2 = calculateFi((R_0_prim + 1), R_0_prim, C, f) # fi dla edge
  338.  
  339.     ni_result_c = calculateNi((R_0_prim - 1), R_0_prim)
  340.     ni_result_e = calculateNi((R_0_prim + 1), R_0_prim)
  341.  
  342.     ### SCHEME 1 ###
  343.     calculated_SINR_sch_1 = []
  344.     x = []
  345.     P_tc_1 = calculateP_Tc(P_T, omega, scheme = 1)
  346.    
  347.     for r in range(1, R_c):
  348.         x.append(r/R_c)
  349.  
  350.         if(r < R_0_prim):
  351.             sinr = calculateSINRinCellCenter(r, mi, omega, P_tc_1, ni_result_c, fi_result, fi_2, scheme = 1)
  352.         else:
  353.             sinr = calculateSINRinCellEdge(r, mi, omega, P_tc_1, ni_result_e, fi_result, fi_2, scheme = 1)
  354.         sinr_in_dB = 10*math.log10(sinr)
  355.         calculated_SINR_sch_1.append(sinr_in_dB)
  356.  
  357.     plt.figure(1)
  358.     plt.plot(x, calculated_SINR_sch_1)
  359.     plt.savefig('IntelligentFR.png')
  360.  
  361.  
  362. def main():
  363.     #calculateSINRAndPlotGraphs()
  364.     #calculateGainInICIC()
  365.     #plotSINRforDifferentOmegas()
  366.     intelligentFrequencyReuse()
  367.  
  368.    
  369. if __name__ == "__main__":
  370.     main()
  371.  
  372.  
  373.  
  374.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement