package eti.radio.pr_inz; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.ChartUtils; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.Plot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; public class Wykresy extends JPanel implements ActionListener { // public Double[] xp = new Double[850]; public Double[] yp = new Double[850]; public Integer[] x = {470, 300, 300, 470, 640, 640, 470}; public Integer[] y = {400, 480, 313, 230, 313, 480, 570}; public double UT_x, UT_y; public double BS0_x = x[0], BS0_y = y[0]; public double zasieg; int nw = 0, s = 1; //double f_c = 2.6; // [GHz] *Math.pow(10, 9); double d_2D; //m double c = 3*Math.pow(10, 8); int d_2D_IN = 1; int h_BS = 25, h_UT = 1; ///zrobić jako Slidery int h_E = 1; // 1m int h = 5; //w metrach, do RMa int W = 20; //w metrach, do RMa double sigma_LOS, sigma_NLOS; public Double[][] PL_LOS= new Double[7][850]; public Double[][] PL_NLOS= new Double[7][850]; public Double[][] PL_NLOS2= new Double[7][850]; double d_BP, d2_BP; public Double[] p = {10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0}; public Double[] d2D = {10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0}; public Double[][] d_3D = new Double[7][850]; public Double[] radius = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; public Double[] SNR = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; public Double[] SNR_WAT = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; public double I_suma_NLOS = 0, I_suma_LOS = 0; double N = -174; double N_W = Math.pow(10, (N/10 - 3)); // private JButton wyjscie; private JLabel tytul7; public JTabbedPane tabbedPane; public String nazwaModelu = ""; public BufferedImage tlo_wykresy; public double f_c = 3; //GHz Double[] SINR_NLOS = new Double[850]; Double[] SINR_LOS = new Double[850]; Double[] SINR_dB_NLOS = new Double[850]; Double[] SINR_dB_LOS = new Double[850]; public int nr_tytulu = 0; public Wykresy(){ setLayout(null); setVisible(true); for(int i=0; i < 850; i++){ // zerowanie SINRów, chyba jednak nie ma znaczenia SINR_NLOS[i] = 0.0; SINR_LOS[i] = 0.0; SINR_dB_NLOS[i] = 0.0; SINR_dB_LOS[i] = 0.0; } File zdj_menu = new File("zdjecia/strona.png"); try{ tlo_wykresy = ImageIO.read(zdj_menu); } catch(IOException e){ System.err.println("Blad odczytu obrazków"); } tytul7 = new JLabel( "Wykresy przedstawiające wartość SINR zależną od odległości UT od BS ", JLabel.CENTER); tytul7.setBounds(5, 70, 1000, 100); tytul7.setFont(new Font("Sitka Text", Font.BOLD, 25)); wyjscie = new JButton("Wyjście"); wyjscie.addActionListener(this); wyjscie.setBounds(750, 650, 180, 50); wyjscie.setFont(new Font("Sitka Text", Font.BOLD, 25)); wyjscie.setBackground(Color.white); tabbedPane = new JTabbedPane(); add(tabbedPane); add(tytul7); add(wyjscie); } public XYDataset daneNLOS(){ XYSeriesCollection zbior_danych = new XYSeriesCollection(); XYSeries dane = new XYSeries(""); for(int i=0; i < 850; i++){ dane.add(i, SINR_dB_NLOS[i]); } zbior_danych.addSeries(dane); return zbior_danych; } public XYDataset daneLOS(){ XYSeriesCollection zbior_danych = new XYSeriesCollection(); XYSeries dane = new XYSeries(""); for(int i=0; i < 850; i++){ dane.add(i, SINR_dB_LOS[i]); } zbior_danych.addSeries(dane); return zbior_danych; } /////////////////////////////////////////////// public XYDataset daneNLOS_zaniki(){ XYSeriesCollection zbior_danych = new XYSeriesCollection(); XYSeries dane = new XYSeries(""); for(int i=0; i < 850; i++){ dane.add(i, SINR_dB_LOS[i]); } zbior_danych.addSeries(dane); return zbior_danych; } public XYDataset daneLOS_zaniki(){ XYSeriesCollection zbior_danych = new XYSeriesCollection(); XYSeries dane = new XYSeries(""); for(int i=0; i < 850; i++){ dane.add(i, SINR_dB_LOS[i]); } zbior_danych.addSeries(dane); return zbior_danych; } ////////////////////////////////////////////// public void Rysuj_wykres(){ XYDataset dane_NLOS = daneNLOS(); //dodawanie wartości SINR JFreeChart wykres_1 = ChartFactory.createXYLineChart("Funkcja wartości SINR od odległości od stacji bazowej (scenariusz NLOS)", "d [m]", "SINR [dB]", dane_NLOS, PlotOrientation.VERTICAL, true, true, false); ///////////////////////// /* ValueAxis rangeAxis = wykres_1.getXYPlot().getDomainAxis(); rangeAxis.setRange(0.0, 80.0); rangeAxis.setAutoTickUnitSelection(true); ValueAxis domainAxis = wykres_1.getXYPlot().getRangeAxis(); if(s == 1){domainAxis.setRange(0, 1000);} else if(s == 2){ domainAxis.setRange(0, 1000);} else if(s == 3){ domainAxis.setRange(0, 1000);} else if(s == 4){ domainAxis.setRange(0, 650);} else if(s == 5){ domainAxis.setRange(0, 650);} else if(s == 6){ domainAxis.setRange(0, 5000);} else if(s == 7){ domainAxis.setRange(0, 5000);} domainAxis.setAutoTickUnitSelection(true);*/ ///////////////////////////////////////// ChartPanel chPanel_1 = new ChartPanel(wykres_1); XYDataset dane_LOS = daneLOS(); //dodawanie wartości SINR JFreeChart wykres_2 = ChartFactory.createXYLineChart("Funkcja wartości SINR od odległości od stacji bazowej (scenariusz LOS)", "d [m]", "SINR [dB]", dane_LOS, PlotOrientation.VERTICAL, true, true, false); ChartPanel chPanel_2 = new ChartPanel(wykres_2); /////////////////////////////////////////////////////// XYDataset dane_NLOS_zaniki = daneNLOS_zaniki(); //dodawanie wartości SINR JFreeChart wykres_3 = ChartFactory.createXYLineChart("Funkcja wartości SINR od odległości od stacji bazowej z uwzględnieniem zaników powolnych (scenariusz NLOS)", "d [m]", "SINR [dB]", dane_NLOS_zaniki, PlotOrientation.VERTICAL, true, true, false); ChartPanel chPanel_3 = new ChartPanel(wykres_3); XYDataset dane_LOS_zaniki = daneLOS_zaniki(); //dodawanie wartości SINR JFreeChart wykres_4 = ChartFactory.createXYLineChart("Funkcja wartości SINR od odległości od stacji bazowej z uwzględnieniem zaników powolnych (scenariusz LOS)", "d [m]", "SINR [dB]", dane_LOS_zaniki, PlotOrientation.VERTICAL, true, true, false); ChartPanel chPanel_4 = new ChartPanel(wykres_4); /////////////////////////////////////////////////////// SwingUtilities.invokeLater(() -> { chPanel_1.setBounds(1, 200, 520, 380); chPanel_1.setVisible(true); chPanel_2.setBounds(500, 200, 520, 380); chPanel_2.setVisible(true); chPanel_3.setBounds(500, 200, 520, 380); chPanel_3.setVisible(true); chPanel_4.setBounds(500, 200, 520, 380); chPanel_4.setVisible(true); }); /////// JTabbedPane : //JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.setBounds(130, 130, 750, 500); tabbedPane.addTab("Wykres NLOS", chPanel_1); tabbedPane.setMnemonicAt(0, KeyEvent.VK_2); tabbedPane.addTab("Wykres LOS", chPanel_2); tabbedPane.setMnemonicAt(1, KeyEvent.VK_2); tabbedPane.addTab("Wykres NLOS z uwzględnieniem zaników", chPanel_3); tabbedPane.setMnemonicAt(2, KeyEvent.VK_2); tabbedPane.addTab("Wykres LOS z uwzględnieniem zaników", chPanel_4); tabbedPane.setMnemonicAt(3, KeyEvent.VK_2); tabbedPane.setVisible(true); //tytul7 = new JLabel( "Wykresy przedstawiające wartość SINR dla modelu " + nazwaModelu, JLabel.CENTER); //add(chPanel_1); add(chPanel_2); add(tytul7); add(tabbedPane); } public void actionPerformed(ActionEvent e){ Object source = e.getSource(); if(source == wyjscie){ System.exit(0); } } public void paintComponent(Graphics graphic) { Graphics2D g2d = (Graphics2D) graphic; g2d.drawImage(tlo_wykresy, 0, 0, this); } public double PL_O2I(int n, double pl){ double L_szklo = 2 + 0.2*f_c; //dB double L_beton = 5 + 4*f_c; //dB double PL_przeniki = 0; double PL_tw, PL_in, sigma_P; double N = 5; // !!!!!!!!!!!!!!!!!!! ZMIENIĆ PL_in = 0.5*d_2D_IN; if(n == 0){ //nisko stratny model PL_tw = 5 - Math.log10(0.3*Math.pow(10, (-L_szklo/10)) + 0.7*Math.pow(10, (-L_beton/10))); sigma_P = 4.4; //dB PL_przeniki = pl + PL_tw + PL_in; // + N; } else if(n == 1){ ////wysoko stratny model PL_tw = 5 - Math.log10(0.7*Math.pow(10, (-L_szklo/10)) + 0.3*Math.pow(10, (-L_beton/10))); sigma_P = 4.4; //dB PL_przeniki = pl + PL_tw + PL_in; // + N; } return PL_przeniki; } public double licz_sygnal_odebrany(double P_T, double G_TX, double L_FTX, double G_RX, double L_FRX, double PathL){ //SINR = P_T + G_TX - L_FTX + (PL +I) + G_RX - L_FRX - N - F - IM int IM = 2; double S, t_e = 1, t_o = 290, N, F; //double k = 1.38*Math.pow(10, (-38)); //N = 10*Math.log10(k * t_o * pasmo); //N = -174; // [dBm] F = 6 ; S = P_T + G_TX - L_FTX - PathL + G_RX - L_FRX - F - IM; // [dBm] return S; } public void pathLossDlaModelu(double ut_x, double ut_y, double f, boolean zmiennaLosowa){ if(s == 1){ d_2D = 140; sigma_LOS = 3; //dB sigma_NLOS = 8.03; //dB } else if(s == 2){ d_2D = 1000; sigma_LOS = 4; //dB sigma_NLOS = 6; //dB } else if(s == 3){ d_2D = 1000; sigma_LOS = 4; //dB sigma_NLOS = 6; //dB } else if(s == 4 ){ d_2D = 650; sigma_LOS = 4; //dB sigma_NLOS = 7.82; //dB } else if(s == 5){ d_2D = 650; sigma_LOS = 4; //dB sigma_NLOS = 7.82; //dB } else if(s == 6){ d_2D = 5000; if(d_2D >= 10 && d_2D <= d2_BP){sigma_LOS = 4;} //dB} else if(d_2D >= d2_BP && d_2D <= 21000){sigma_LOS = 6;} //dB} sigma_NLOS = 8; } else if(s == 7){ d_2D = 5000; if(d_2D >= 10 && d_2D <= d2_BP){sigma_LOS = 4;} //dB} else if(d_2D >= d2_BP && d_2D <= 21000){sigma_LOS = 6;} //dB} sigma_NLOS = 8; } for(int k = 1; k < 7; k++){ xp[0] = 470.0; yp[0] = 400.0; radius[k] = Math.sqrt( Math.pow((x[k] - xp[0]), 2) + Math.pow((y[k] - yp[0]), 2)); d2D[k] = (radius[k]*d_2D)/85; d_3D[k][0] = Math.sqrt( Math.pow((h_BS-h_UT), 2) + Math.pow(d2D[k], 2) ); System.out.println("d_3D["+k+"] = " + d_3D[k][0]); } d_3D[0][0] = Math.sqrt( Math.pow((h_BS-h_UT), 2) + Math.pow(Double.MIN_VALUE, 2) ); //d_3D[0][0] = Double.MIN_VALUE; //!!!!!!!!! for(int j=1; j < 850; j++){ if((ut_x > BS0_x) && (ut_y < BS0_y)){ // I ćwiartka xp[j] = xp[j-1] + 0.1; yp[j] = ((-1)*(ut_y - y[0])/(ut_x - x[0])) * (xp[j] - x[0]) + y[0]; // (-1) bo y rośnie w dół } else if((ut_x < BS0_x) && (ut_y < BS0_y)){ // II ćwiartka xp[j] = xp[j-1] - 0.1; yp[j] = ((-1)*(ut_y - y[0])/(ut_x - x[0])) * (xp[j] - x[0]) + y[0]; // (-1) bo y rośnie w dół } else if((ut_x < BS0_x) && (ut_y > BS0_y)){ // III ćwiartka xp[j] = xp[j-1] - 0.1; yp[j] = ((-1)*(ut_y - y[0])/(ut_x - x[0])) * (xp[j] - x[0]) + y[0]; // (-1) bo y rośnie w dół } else if((ut_x > BS0_x) && (ut_y > BS0_y)){ // IV ćwiartka xp[j] = xp[j-1] + 0.1; yp[j] = ((-1)*(ut_y - y[0])/(ut_x - x[0])) * (xp[j] - x[0]) + y[0]; // (-1) bo y rośnie w dół } for(int i = 0; i < 7; i++){ radius[i] = Math.sqrt( Math.pow((x[i] - xp[j]), 2) + Math.pow((y[i] - yp[j]), 2)); d2D[i] = (radius[i] * d_2D)/85; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 d_3D[i][j] = Math.sqrt( Math.pow((h_BS-h_UT), 2) + Math.pow(d2D[i], 2) ); } } if(s == 1){ //model Indoor Hotspot - InH for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ PL_LOS[i][j] = 32.4 + 17.3*Math.log10(d_3D[i][j]) + 20*Math.log10(f + 0.1*i); //- path loss for LOS PL_NLOS2[i][j] = 38.3*Math.log10(d_3D[i][j]) + 17.3 + 24.9*Math.log10(f + 0.1*i); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); //- path loss for NLOS } } /*sigma_LOS = 3; //dB sigma_NLOS = 8.03; //dB*/ } else if(s == 2 || s == 3){ //model Urban Macro- UMa for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ if( d_2D >= 10 && d_2D <= d_BP){ PL_LOS[i][j] = 28 + 22*Math.log10(d_3D[i][j]) + 20*Math.log10(f + 0.1*i); PL_NLOS2[i][j] = 13.54 + 39.08*Math.log10(d_3D[i][j]) + 20*Math.log10(f + 0.1*i) -0.6*(h_UT-1.5); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); } else if(d_2D >= d_BP && d_2D <= 5000){ PL_LOS[i][j] = 28 + 40*Math.log10(d_3D[i][j]) + 20*Math.log10(f + 0.1*i) -9*Math.log10(Math.pow(d_BP,2) + Math.pow((h_BS + h_UT),2)); PL_NLOS2[i][j] = 13.54 + 39.08*Math.log10(d_3D[i][j]) + 20*Math.log10(f + 0.1*i) -0.6*(h_UT-1.5); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); } } } /*sigma_LOS = 4; //dB sigma_NLOS = 6; //dB*/ if(s == 3) { for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ PL_LOS[i][j] = PL_O2I(nw, PL_LOS[i][j]); PL_NLOS[i][j] = PL_O2I(nw, PL_NLOS[i][j]); } } } } else if(s == 4 || s == 5){ //model Urban Micro- UMi for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ if( d_2D >= 10 && d_2D <= d_BP){ PL_LOS[i][j] = 32.4 + 21*Math.log10(d_3D[i][j]) + 20*Math.log10(f); PL_NLOS2[i][j] = 22.4 + 35.3*Math.log10(d_3D[i][j]) + 21.3*Math.log10(f) -0.3*(h_UT-1.5); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); } else if(d_2D >= d_BP && d_2D <= 5000){ PL_LOS[i][j] = 32.4 + 40*Math.log10(d_3D[i][j]) + 20*Math.log10(f) -9.5*Math.log10(Math.pow(d_BP,2) + Math.pow((h_BS + h_UT),2)); PL_NLOS2[i][j] = 22.4 + 35.3*Math.log10(d_3D[i][j]) + 21.3*Math.log10(f) -0.3*(h_UT-1.5); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); } } } sigma_LOS = 4; //dB sigma_NLOS = 7.82; //dB if(s == 5) { for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ PL_LOS[i][j] = PL_O2I(nw, PL_LOS[i][j]); PL_NLOS[i][j] = PL_O2I(nw, PL_NLOS[i][j]); } } } } else if(s == 6 || s == 7) { //model Rural Macro- RMa for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ if (d_2D >= 10 && d_2D <= d2_BP) { PL_LOS[i][j] = 20 * Math.log10((40 * Math.PI * d_3D[i][j] * f) / 3) + Math.min(Math.pow(0.03 * h, 1.72), 10) * Math.log10(d_3D[i][j]) - Math.min(Math.pow(0.044 * h, 1.72), 14.77) + 0.002 * Math.log10(h) * d_3D[i][j]; PL_NLOS2[i][j] = 161.04 - 7.1 * Math.log10(W) + 7.5 * Math.log10(h) - (24.37 - 3.7 * Math.pow((h / h_BS), 2)) * Math.log10(h_BS) + (43.42 - 3.1 * Math.log10(h_BS)) * (Math.log10(d_3D[i][j]) - 3) + 20 * Math.log10(f) - (3.2 *Math.pow(Math.log10(11.75 * h_UT), 2) - 4.97); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); sigma_LOS = 4; //dB } else if (d_2D >= d2_BP && d_2D <= 21000) { PL_LOS[i][j] = 20 * Math.log10((40 * Math.PI * d2_BP * f) / 3) + Math.min(Math.pow(0.03 * h, 1.72), 10) * Math.log10(d2_BP) - Math.min(Math.pow(0.044 * h, 1.72), 14.77) + 0.002 * Math.log10(h) * d2_BP + 40 * Math.log10(d_3D[i][j] / d2_BP); PL_NLOS2[i][j] = 161.04 - 7.1 * Math.log10(W) + 7.5 * Math.log10(h) - (24.37 - 3.7 * Math.pow((h / h_BS), 2)) * Math.log10(h_BS) + (43.42 - 3.1 * Math.log10(h_BS)) * (Math.log10(d_3D[i][j]) - 3) + 20 * Math.log10(f) - (3.2 *Math.pow(Math.log10(11.75 * h_UT), 2) - 4.97); PL_NLOS[i][j] = Math.max(PL_LOS[i][j], PL_NLOS2[i][j]); sigma_LOS = 6; //dB } } } sigma_NLOS = 8; //dB if (s == 7) { for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ PL_LOS[i][j] = PL_O2I(nw, PL_LOS[i][j]); PL_NLOS[i][j] = PL_O2I(nw, PL_NLOS[i][j]); System.out.println("Udało się, yaaaaaaaaaaaaaaaaaaaaaaaaay!"); } } } } Random r = new Random(); if(zmiennaLosowa == true){ for(int j = 0; j < 850; j++){ for(int i=0; i < 7; i++){ PL_LOS[i][j] = PL_LOS[i][j] + r.nextGaussian()*sigma_LOS; PL_NLOS[i][j] = PL_NLOS[i][j] + r.nextGaussian()*sigma_NLOS; } } } } public void licz_SINR(){ Double[] S_NLOS = new Double[7]; Double[] S_LOS = new Double[7]; Double[] I_W_NLOS = new Double[7]; //inerferencje w watach Double[] I_W_LOS = new Double[7]; //inerferencje w watach Double[] S_0_NLOS = new Double[850]; Double[] S_0_LOS = new Double[850]; for(int t=0; t < 850; t++){ for (int i = 0; i < 7; i++) { if(i == 0){ if(t==0){ S_NLOS[i] = licz_sygnal_odebrany(p[i], 17, 2, 0, 0, 0); S_LOS[i] = licz_sygnal_odebrany(p[i], 17, 2, 0, 0, 0); //LOS tylko między UT i BS0 } S_NLOS[i] = licz_sygnal_odebrany(p[i], 17, 2, 0, 0, PL_NLOS[i][t]); S_LOS[i] = licz_sygnal_odebrany(p[i], 17, 2, 0, 0, PL_LOS[i][t]); //LOS tylko między UT i BS0 } else{ S_NLOS[i] = licz_sygnal_odebrany(p[i], 17, 2, 0, 0, PL_NLOS[i][t]); S_LOS[i] = licz_sygnal_odebrany(p[i], 17, 2, 0, 0, PL_NLOS[i][t]); } } S_0_NLOS[t] = Math.pow(10, (S_NLOS[0]/10 - 3)); // z dBm na waty I_W_NLOS[0] = 0.0; I_suma_NLOS = 0.0; S_0_LOS[t] = Math.pow(10, (S_LOS[0]/10 - 3)); // z dBm na waty I_W_LOS[0] = 0.0; I_suma_LOS = 0.0; for(int j=1; j < 7; j++){ I_W_NLOS[j] = Math.pow(10, S_NLOS[j]/10 - 3); // z dBm na waty I_suma_NLOS = I_suma_NLOS + I_W_NLOS[j]; I_W_LOS[j] = Math.pow(10, (S_LOS[j]/10 - 3)); // z dBm na waty I_suma_LOS = I_suma_LOS + I_W_LOS[j]; } SINR_NLOS[t] = S_0_NLOS[t] / ( I_suma_NLOS + N_W); SINR_dB_NLOS[t] = 10*Math.log10(SINR_NLOS[t]); //na dB SINR_LOS[t] = S_0_LOS[t] / ( I_suma_LOS + N_W); SINR_dB_LOS[t] = 10*Math.log10(SINR_LOS[t]); //na dB } System.out.println("SINR_dB_NLOS dla t = 0 " + SINR_dB_NLOS[0]); System.out.println("SINR_dB_LOS dla t = 0 " + SINR_dB_LOS[0]); System.out.println("SINR_dB_NLOS dla t = 850 " + SINR_dB_NLOS[849]); System.out.println("SINR_dB_LOS dla t = 850 " + SINR_dB_LOS[849]); System.out.println("d_3D[0][0]: " + d_3D[0][0] + "d_3D[0][1]: " + d_3D[0][1] ); } public void zaniki(){ pathLossDlaModelu(UT_x, UT_y, f_c, true); licz_SINR(); } }