GNU Radio's OWC Package
OWC_Channel_absolute_impl.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /* gr-owc OOT module for optical wireless communications.
3  *
4  * Copyright 2021 Arsalan Ahmed from The Ubiquitous Communications and Networking (UCAN) Lab, University of Massachusetts, Boston.
5  *
6  * This is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * This software is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this software; see the file COPYING. If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_IMPL_H
24 #define INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_IMPL_H
25 
27 
28 namespace gr {
29  namespace owc {
30 
32  {
33  private:
34  int d_num_inputs = 1;
35  int d_num_outputs = 1;
36 
37  std::vector<float> d_tx_lambertian_order_array;
38  std::vector<float> d_rx_photosensor_area_array;
39 
40  std::vector<float> d_distance_array;
41 
42  std::vector<float> d_emission_angle_array;
43  std::vector<float> d_acceptance_angle_array;
44 
45  std::vector<float> d_optical_filter_transmittance_array;
46  std::vector<float> d_refractive_index_array;
47  std::vector<float> d_concentrator_FOV_array;
48  std::vector<float> d_E2O_conversion_factor_array;
49  std::vector<float> d_O2E_conversion_factor_array;
50 
51  std::vector<float> d_tx_coordinates_array;
52  std::vector<float> d_tx_orientation_array;
53  std::vector<float> d_rx_coordinates_array;
54  std::vector<float> d_rx_orientation_array;
55 
56 
57  public:
58  OWC_Channel_absolute_impl(int num_inputs, int num_outputs, const std::vector<float>& tx_coordinates_array, const std::vector<float>& tx_orientation_array, const std::vector<float>& rx_coordinates_array, const std::vector<float>& rx_orientation_array, const std::vector<float>& tx_lambertian_order_array, const std::vector<float>& rx_photosensor_area_array, const std::vector<float>& optical_filter_transmittance_array, const std::vector<float>& refractive_index_array, const std::vector<float>& concentrator_FOV_array, const std::vector<float>& E2O_conversion_factor_array, const std::vector<float>& O2E_conversion_factor_array);
60 
61  void set_num_inputs(int num_inputs){d_num_inputs = num_inputs;}
62  int r_num_inputs() {return d_num_inputs;}
63 
64  void set_num_outputs(int num_outputs){d_num_outputs = num_outputs;}
65  int r_num_outputs() {return d_num_outputs;}
66 
67 
68 
69 
70  void set_tx_coordinates_array(std::vector<float> tx_coordinates_array){d_tx_coordinates_array = tx_coordinates_array;}
71  std::vector<float> tx_coordinates_array() {return d_tx_coordinates_array;}
72 
73  void set_tx_orientation_array(std::vector<float> tx_orientation_array){d_tx_orientation_array = tx_orientation_array;}
74  std::vector<float> tx_orientation_array() {return d_tx_orientation_array;}
75 
76  void set_rx_coordinates_array(std::vector<float> rx_coordinates_array){d_rx_coordinates_array = rx_coordinates_array;}
77  std::vector<float> rx_coordinates_array() {return d_rx_coordinates_array;}
78 
79  void set_rx_orientation_array(std::vector<float> rx_orientation_array){d_rx_orientation_array = rx_orientation_array;}
80  std::vector<float> rx_orientation_array() {return d_rx_orientation_array;}
81 
82 
83 
84 
85  void set_tx_lambertian_order_array(std::vector<float> tx_lambertian_order_array){d_tx_lambertian_order_array = tx_lambertian_order_array;}
86  std::vector<float> tx_lambertian_order_array() {return d_tx_lambertian_order_array;}
87 
88  void set_rx_photosensor_area_array(std::vector<float> rx_photosensor_area_array){d_rx_photosensor_area_array = rx_photosensor_area_array;}
89  std::vector<float> rx_photosensor_area_array() {return d_rx_photosensor_area_array;}
90 
92  std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
93 
94  void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array;}
95  std::vector<float> refractive_index_array() {return d_refractive_index_array;}
96 
97  void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array;}
98  std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
99 
100  void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array;}
101  std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
102 
103  void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array;}
104  std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
105 
106  float channel_model(float emission_angle, float acceptance_angle, float distance, float lambertian_order_m, float photosensor_area, float optical_filter_transmittance, float refractive_index, float concentrator_FOV, float E2O_conversion_factor, float O2E_conversion_factor){
107 
108  float Gt = 0;
109 
110  if (emission_angle <= 90)
111  {
112  Gt = ((lambertian_order_m + 1)/(2*M_PI))*pow(cos(emission_angle*(M_PI/180)),lambertian_order_m);
113  }
114  else
115  {
116  Gt = 0;
117  }
118 
119  float Ts = optical_filter_transmittance;
120 
121  float refractive_index_squared = refractive_index*refractive_index;
122  float sin_of_concentrator_FOV_squared = sin(concentrator_FOV*(M_PI/180))*sin(concentrator_FOV*(M_PI/180));
123  float g = refractive_index_squared/sin_of_concentrator_FOV_squared;
124  if ((acceptance_angle < 0) || (acceptance_angle > concentrator_FOV))
125  {g = 0;}
126 
127  float Gr = photosensor_area*Ts*g*cos(acceptance_angle*(M_PI/180));
128  float distance_squared = distance * distance;
129 
130  float Ct = E2O_conversion_factor;
131  float Cr = O2E_conversion_factor;
132 
133  float H = Ct*((Gt*Gr)/distance_squared)*Cr;
134 
135  return H; }
136 
137  //void set_distance_array(int num_inputs, int num_outputs, std::vector<float> tx_coordinates_array, std::vector<float> rx_coordinates_array)
138 
140  {
141  d_distance_array.clear();
142  for (int i = 0; i < 3*r_num_outputs(); i+=3)
143  {
144  float x2 = rx_coordinates_array()[i];
145  float y2 = rx_coordinates_array()[i+1];
146  float z2 = rx_coordinates_array()[i+2];
147 
148  for (int j = 0; j < 3*r_num_inputs(); j+=3)
149  {
150  float x1 = tx_coordinates_array()[j];
151  float y1 = tx_coordinates_array()[j+1];
152  float z1 = tx_coordinates_array()[j+2];
153 
154  float xSquared = (x2-x1)*(x2-x1);
155  float ySquared = (y2-y1)*(y2-y1);
156  float zSquared = (z2-z1)*(z2-z1);
157 
158  float distance = sqrt(xSquared+ySquared+zSquared);
159 
160  d_distance_array.push_back(distance);
161  }
162  }
163  }
164 
165  std::vector<float> distance_array() {return d_distance_array;}
166 
167  //void set_emission_angle_array(int num_inputs, int num_outputs, std::vector<float> tx_coordinates_array, std::vector<float> tx_orientation_array, std::vector<float> rx_coordinates_array)
169  {
170  d_emission_angle_array.clear();
171  for (int i = 0; i < 3*r_num_outputs(); i+=3)
172  {
173  float x2 = rx_coordinates_array()[i];
174  float y2 = rx_coordinates_array()[i+1];
175  float z2 = rx_coordinates_array()[i+2];
176 
177  for (int j = 0; j < 3*r_num_inputs(); j+=3)
178  {
179  float x1 = tx_coordinates_array()[j];
180  float y1 = tx_coordinates_array()[j+1];
181  float z1 = tx_coordinates_array()[j+2];
182 
183  float ux = (x2-x1); //tx to rx vector
184  float uy = (y2-y1);
185  float uz = (z2-z1);
186 
187  float ux_squared = ux*ux;
188  float uy_squared = uy*uy;
189  float uz_squared = uz*uz;
190 
191  float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
192 
193  float vx = tx_orientation_array()[j]; //tx orientation vector
194  float vy = tx_orientation_array()[j+1];
195  float vz = tx_orientation_array()[j+2];
196 
197  float vx_squared = vx*vx;
198  float vy_squared = vy*vy;
199  float vz_squared = vz*vz;
200 
201  float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
202 
203  float numerator= (ux*vx)+(uy*vy)+(uz*vz);
204  float denominator =u_mag*v_mag;
205 
206  float angle = acos((numerator/denominator))*(180/M_PI);
207 
208  d_emission_angle_array.push_back(angle);
209  }
210  }
211  }
212  std::vector<float> emission_angle_array() {return d_emission_angle_array;}
213 
214  //void set_acceptance_angle_array(int num_inputs, int num_outputs, std::vector<float> tx_coordinates_array, std::vector<float> rx_coordinates_array, std::vector<float> rx_orientation_array)
216  {
217  d_acceptance_angle_array.clear();
218  for (int i = 0; i < 3*r_num_outputs(); i+=3)
219  {
220  float x1 = rx_coordinates_array()[i];
221  float y1 = rx_coordinates_array()[i+1];
222  float z1 = rx_coordinates_array()[i+2];
223 
224  float vx = rx_orientation_array()[i]; //tx orientation vector
225  float vy = rx_orientation_array()[i+1];
226  float vz = rx_orientation_array()[i+2];
227 
228  for (int j = 0; j < 3*r_num_inputs(); j+=3)
229  {
230  float x2 = tx_coordinates_array()[j];
231  float y2 = tx_coordinates_array()[j+1];
232  float z2 = tx_coordinates_array()[j+2];
233 
234  float ux = (x2-x1); //tx to rx vector
235  float uy = (y2-y1);
236  float uz = (z2-z1);
237 
238  float ux_squared = ux*ux;
239  float uy_squared = uy*uy;
240  float uz_squared = uz*uz;
241 
242  float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
243 
244  float vx_squared = vx*vx;
245  float vy_squared = vy*vy;
246  float vz_squared = vz*vz;
247 
248  float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
249 
250  float numerator= (ux*vx)+(uy*vy)+(uz*vz);
251  float denominator =u_mag*v_mag;
252 
253  float angle = acos(numerator/denominator)*(180/M_PI);
254 
255  d_acceptance_angle_array.push_back(angle);
256  }
257  }
258  }
259  std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
260 
261 
262  // Where all the action really happens
263  int work(
264  int noutput_items,
265  gr_vector_const_void_star &input_items,
266  gr_vector_void_star &output_items
267  );
268  };
269 
270  } // namespace owc
271 } // namespace gr
272 
273 #endif /* INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_IMPL_H */
OWC_Channel_absolute_impl(int num_inputs, int num_outputs, const std::vector< float > &tx_coordinates_array, const std::vector< float > &tx_orientation_array, const std::vector< float > &rx_coordinates_array, const std::vector< float > &rx_orientation_array, const std::vector< float > &tx_lambertian_order_array, const std::vector< float > &rx_photosensor_area_array, const std::vector< float > &optical_filter_transmittance_array, const std::vector< float > &refractive_index_array, const std::vector< float > &concentrator_FOV_array, const std::vector< float > &E2O_conversion_factor_array, const std::vector< float > &O2E_conversion_factor_array)
std::vector< float > rx_coordinates_array()
Definition: OWC_Channel_absolute_impl.h:77
int r_num_outputs()
Definition: OWC_Channel_absolute_impl.h:65
std::vector< float > rx_photosensor_area_array()
Definition: OWC_Channel_absolute_impl.h:89
void set_distance_array()
Definition: OWC_Channel_absolute_impl.h:139
void set_rx_coordinates_array(std::vector< float > rx_coordinates_array)
Definition: OWC_Channel_absolute_impl.h:76
std::vector< float > refractive_index_array()
Definition: OWC_Channel_absolute_impl.h:95
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition: OWC_Channel_absolute_impl.h:100
std::vector< float > optical_filter_transmittance_array()
Definition: OWC_Channel_absolute_impl.h:92
void set_num_inputs(int num_inputs)
Definition: OWC_Channel_absolute_impl.h:61
std::vector< float > tx_coordinates_array()
Definition: OWC_Channel_absolute_impl.h:71
<+description of block+>
Definition: OWC_Channel_absolute.h:37
int r_num_inputs()
Definition: OWC_Channel_absolute_impl.h:62
std::vector< float > distance_array()
Definition: OWC_Channel_absolute_impl.h:165
void set_tx_orientation_array(std::vector< float > tx_orientation_array)
Definition: OWC_Channel_absolute_impl.h:73
std::vector< float > O2E_conversion_factor_array()
Definition: OWC_Channel_absolute_impl.h:104
Definition: binary_to_decimal_mapper.h:29
void set_tx_coordinates_array(std::vector< float > tx_coordinates_array)
Definition: OWC_Channel_absolute_impl.h:70
void set_rx_photosensor_area_array(std::vector< float > rx_photosensor_area_array)
Definition: OWC_Channel_absolute_impl.h:88
std::vector< float > concentrator_FOV_array()
Definition: OWC_Channel_absolute_impl.h:98
void set_acceptance_angle_array()
Definition: OWC_Channel_absolute_impl.h:215
void set_rx_orientation_array(std::vector< float > rx_orientation_array)
Definition: OWC_Channel_absolute_impl.h:79
float channel_model(float emission_angle, float acceptance_angle, float distance, float lambertian_order_m, float photosensor_area, float optical_filter_transmittance, float refractive_index, float concentrator_FOV, float E2O_conversion_factor, float O2E_conversion_factor)
Definition: OWC_Channel_absolute_impl.h:106
std::vector< float > rx_orientation_array()
Definition: OWC_Channel_absolute_impl.h:80
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition: OWC_Channel_absolute_impl.h:91
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
std::vector< float > emission_angle_array()
Definition: OWC_Channel_absolute_impl.h:212
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition: OWC_Channel_absolute_impl.h:94
std::vector< float > E2O_conversion_factor_array()
Definition: OWC_Channel_absolute_impl.h:101
Definition: OWC_Channel_absolute_impl.h:31
void set_tx_lambertian_order_array(std::vector< float > tx_lambertian_order_array)
Definition: OWC_Channel_absolute_impl.h:85
std::vector< float > tx_lambertian_order_array()
Definition: OWC_Channel_absolute_impl.h:86
void set_emission_angle_array()
Definition: OWC_Channel_absolute_impl.h:168
void set_num_outputs(int num_outputs)
Definition: OWC_Channel_absolute_impl.h:64
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition: OWC_Channel_absolute_impl.h:103
std::vector< float > tx_orientation_array()
Definition: OWC_Channel_absolute_impl.h:74
std::vector< float > acceptance_angle_array()
Definition: OWC_Channel_absolute_impl.h:259
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition: OWC_Channel_absolute_impl.h:97