GNU Radio's OWC Package
OWC_Channel_absolute_two_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_TWO_IMPL_H
24 #define INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_TWO_IMPL_H
25 
27 #include <gnuradio/random.h>
28 
29 namespace gr {
30  namespace owc {
31 
33  {
34  private:
35  int d_num_inputs = 1;
36  int d_num_outputs = 1;
37 
38  std::vector<float> d_tx_lambertian_order_array;
39  std::vector<float> d_rx_photosensor_area_array;
40 
41  std::vector<float> d_distance_array;
42 
43  std::vector<float> d_emission_angle_array;
44  std::vector<float> d_acceptance_angle_array;
45 
46  std::vector<float> d_optical_filter_transmittance_array;
47  std::vector<float> d_refractive_index_array;
48  std::vector<float> d_concentrator_FOV_array;
49  std::vector<float> d_E2O_conversion_factor_array;
50  std::vector<float> d_O2E_conversion_factor_array;
51 
52  std::vector<float> d_tx_coordinates_array;
53  std::vector<float> d_tx_orientation_array;
54  std::vector<float> d_rx_coordinates_array;
55  std::vector<float> d_rx_orientation_array;
56 
57  int d_sample_rate;
58 
59  std::vector<int> d_num_delay_samples_array;
60  std::vector<int> d_blockage_array;
61 
62  std::vector<float> d_remaining_input_samples;
63 
64  std::vector<float> d_noise_power_array;
65 
66  gr::random d_rng;
67 
68  int d_noutput_items_previous = 10000;//Using 10000 (a very large number just to be safe) zeros initially to add at the very start
69 
70  public:
71  OWC_Channel_absolute_two_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, int sample_rate, const std::vector<int>& blockage_array, const std::vector<float>& noise_power_array);
73 
74  void set_num_inputs(int num_inputs){d_num_inputs = num_inputs;}
75  int r_num_inputs() {return d_num_inputs;}
76 
77  void set_num_outputs(int num_outputs){d_num_outputs = num_outputs;}
78  int r_num_outputs() {return d_num_outputs;}
79 
80  void set_tx_coordinates_array(std::vector<float> tx_coordinates_array){d_tx_coordinates_array = tx_coordinates_array;}
81  std::vector<float> tx_coordinates_array() {return d_tx_coordinates_array;}
82 
83  void set_tx_orientation_array(std::vector<float> tx_orientation_array){d_tx_orientation_array = tx_orientation_array;}
84  std::vector<float> tx_orientation_array() {return d_tx_orientation_array;}
85 
86  void set_rx_coordinates_array(std::vector<float> rx_coordinates_array){d_rx_coordinates_array = rx_coordinates_array;}
87  std::vector<float> rx_coordinates_array() {return d_rx_coordinates_array;}
88 
89  void set_rx_orientation_array(std::vector<float> rx_orientation_array){d_rx_orientation_array = rx_orientation_array;}
90  std::vector<float> rx_orientation_array() {return d_rx_orientation_array;}
91 
92  void set_tx_lambertian_order_array(std::vector<float> tx_lambertian_order_array){d_tx_lambertian_order_array = tx_lambertian_order_array;}
93  std::vector<float> tx_lambertian_order_array() {return d_tx_lambertian_order_array;}
94 
95  void set_rx_photosensor_area_array(std::vector<float> rx_photosensor_area_array){d_rx_photosensor_area_array = rx_photosensor_area_array;}
96  std::vector<float> rx_photosensor_area_array() {return d_rx_photosensor_area_array;}
97 
99  std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
100 
101  void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array;}
102  std::vector<float> refractive_index_array() {return d_refractive_index_array;}
103 
104  void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array;}
105  std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
106 
107  void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array;}
108  std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
109 
110  void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array;}
111  std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
112 
113  float channel_model(float emission_angle, float acceptance_angle, float distance, float lambertian_order, float ps_area, float optical_filter_transmittance, float refractive_index, float concentrator_FOV, float E2O_conversion_factor, float O2E_conversion_factor, int blockage){
114  float Gt = 0;
115 
116  if (emission_angle <= 90)
117  {
118  Gt = ((lambertian_order + 1)/(2*M_PI))*pow(cos(emission_angle*(M_PI/180)),lambertian_order);
119  }
120  else
121  {
122  Gt = 0;
123  }
124 
125  float Ts = optical_filter_transmittance;
126 
127  float refractive_index_squared = refractive_index*refractive_index;
128  float sin_of_concentrator_FOV_squared = sin(concentrator_FOV*(M_PI/180))*sin(concentrator_FOV*(M_PI/180));
129  float g = refractive_index_squared/sin_of_concentrator_FOV_squared;
130  if ((acceptance_angle < 0) || (acceptance_angle > concentrator_FOV))
131  {g = 0.0;}
132 
133  float Gr = ps_area*Ts*g*cos(acceptance_angle*(M_PI/180));
134  float distance_squared = distance * distance;
135 
136  float Ct = E2O_conversion_factor;
137  float Cr = O2E_conversion_factor;
138 
139  float H = Ct*((Gt*Gr)/distance_squared)*Cr;
140 
141  H = H * blockage;
142 
143  return H; }
144 
145 
147  {
148  d_distance_array.clear();
149  for (int i = 0; i < 3*r_num_outputs(); i+=3)
150  {
151  float x2 = rx_coordinates_array()[i];
152  float y2 = rx_coordinates_array()[i+1];
153  float z2 = rx_coordinates_array()[i+2];
154 
155  for (int j = 0; j < 3*r_num_inputs(); j+=3)
156  {
157  float x1 = tx_coordinates_array()[j];
158  float y1 = tx_coordinates_array()[j+1];
159  float z1 = tx_coordinates_array()[j+2];
160 
161  float xSquared = (x2-x1)*(x2-x1);
162  float ySquared = (y2-y1)*(y2-y1);
163  float zSquared = (z2-z1)*(z2-z1);
164 
165  float distance = sqrt(xSquared+ySquared+zSquared);
166 
167  d_distance_array.push_back(distance);
168  }
169  }
170  }
171 
172  std::vector<float> distance_array() {return d_distance_array;}
173 
175  {
176  d_emission_angle_array.clear();
177  for (int i = 0; i < 3*r_num_outputs(); i+=3)
178  {
179  float x2 = rx_coordinates_array()[i];
180  float y2 = rx_coordinates_array()[i+1];
181  float z2 = rx_coordinates_array()[i+2];
182 
183  for (int j = 0; j < 3*r_num_inputs(); j+=3)
184  {
185  float x1 = tx_coordinates_array()[j];
186  float y1 = tx_coordinates_array()[j+1];
187  float z1 = tx_coordinates_array()[j+2];
188 
189  float ux = (x2-x1); //tx to rx vector
190  float uy = (y2-y1);
191  float uz = (z2-z1);
192 
193  float ux_squared = ux*ux;
194  float uy_squared = uy*uy;
195  float uz_squared = uz*uz;
196 
197  float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
198 
199  float vx = tx_orientation_array()[j]; //tx orientation vector
200  float vy = tx_orientation_array()[j+1];
201  float vz = tx_orientation_array()[j+2];
202 
203  float vx_squared = vx*vx;
204  float vy_squared = vy*vy;
205  float vz_squared = vz*vz;
206 
207  float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
208 
209  float numerator= (ux*vx)+(uy*vy)+(uz*vz);
210  float denominator =u_mag*v_mag;
211 
212  float angle = acos((numerator/denominator))*(180/M_PI);
213 
214  d_emission_angle_array.push_back(angle);
215  }
216  }
217  }
218  std::vector<float> emission_angle_array() {return d_emission_angle_array;}
219 
221  {
222  d_acceptance_angle_array.clear();
223  for (int i = 0; i < 3*r_num_outputs(); i+=3)
224  {
225  float x1 = rx_coordinates_array()[i];
226  float y1 = rx_coordinates_array()[i+1];
227  float z1 = rx_coordinates_array()[i+2];
228 
229  float vx = rx_orientation_array()[i]; //tx orientation vector
230  float vy = rx_orientation_array()[i+1];
231  float vz = rx_orientation_array()[i+2];
232 
233  for (int j = 0; j < 3*r_num_inputs(); j+=3)
234  {
235  float x2 = tx_coordinates_array()[j];
236  float y2 = tx_coordinates_array()[j+1];
237  float z2 = tx_coordinates_array()[j+2];
238 
239  float ux = (x2-x1); //tx to rx vector
240  float uy = (y2-y1);
241  float uz = (z2-z1);
242 
243  float ux_squared = ux*ux;
244  float uy_squared = uy*uy;
245  float uz_squared = uz*uz;
246 
247  float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
248 
249  float vx_squared = vx*vx;
250  float vy_squared = vy*vy;
251  float vz_squared = vz*vz;
252 
253  float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
254 
255  float numerator= (ux*vx)+(uy*vy)+(uz*vz);
256  float denominator =u_mag*v_mag;
257 
258  float angle = acos(numerator/denominator)*(180/M_PI);
259 
260  d_acceptance_angle_array.push_back(angle);
261  }
262  }
263  }
264  std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
265 
266  void set_sample_rate(int sample_rate){d_sample_rate = sample_rate;}
267  int sample_rate() {return d_sample_rate;}
268 
270  {
271  d_num_delay_samples_array.clear();
272  float speed_of_light = 299792458;
273 
274  float propagation_time = 0;
275  float num_delay_samples = 0;
276 
277  int array_length = r_num_inputs()*r_num_outputs();
278 
279  for (int x = 0; x < array_length; x++)
280  {
281  propagation_time = distance_array()[x] / speed_of_light;
282  num_delay_samples = round(propagation_time * sample_rate());
283 
284  d_num_delay_samples_array.push_back(num_delay_samples);
285  }
286  }
287  std::vector<int> num_delay_samples_array() {return d_num_delay_samples_array;}
288 
289  void set_blockage_array(std::vector<int> blockage_array){d_blockage_array = blockage_array;}
290  std::vector<int> blockage_array() {return d_blockage_array;}
291 
293  {
294  for (int x = 0; x < r_num_inputs()*d_noutput_items_previous; x++)
295  {
296  d_remaining_input_samples.push_back(0);
297  }
298  }
299  std::vector<float> remaining_samples_array() {return d_remaining_input_samples;}
300 
301  void set_noise_power_array(std::vector<float> noise_power_array){d_noise_power_array = noise_power_array;}
302  std::vector<float> noise_power_array() {return d_noise_power_array;}
303 
304  // Where all the action really happens
305  int work(
306  int noutput_items,
307  gr_vector_const_void_star &input_items,
308  gr_vector_void_star &output_items
309  );
310  };
311 
312  } // namespace owc
313 } // namespace gr
314 
315 #endif /* INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_TWO_IMPL_H */
316 
void set_tx_coordinates_array(std::vector< float > tx_coordinates_array)
Definition: OWC_Channel_absolute_two_impl.h:80
int sample_rate()
Definition: OWC_Channel_absolute_two_impl.h:267
void set_remaining_samples_array()
Definition: OWC_Channel_absolute_two_impl.h:292
std::vector< int > blockage_array()
Definition: OWC_Channel_absolute_two_impl.h:290
std::vector< float > rx_orientation_array()
Definition: OWC_Channel_absolute_two_impl.h:90
void set_rx_photosensor_area_array(std::vector< float > rx_photosensor_area_array)
Definition: OWC_Channel_absolute_two_impl.h:95
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition: OWC_Channel_absolute_two_impl.h:107
std::vector< float > distance_array()
Definition: OWC_Channel_absolute_two_impl.h:172
std::vector< float > acceptance_angle_array()
Definition: OWC_Channel_absolute_two_impl.h:264
Definition: OWC_Channel_absolute_two_impl.h:32
void set_noise_power_array(std::vector< float > noise_power_array)
Definition: OWC_Channel_absolute_two_impl.h:301
std::vector< float > tx_coordinates_array()
Definition: OWC_Channel_absolute_two_impl.h:81
void set_tx_lambertian_order_array(std::vector< float > tx_lambertian_order_array)
Definition: OWC_Channel_absolute_two_impl.h:92
void set_distance_array()
Definition: OWC_Channel_absolute_two_impl.h:146
std::vector< int > num_delay_samples_array()
Definition: OWC_Channel_absolute_two_impl.h:287
std::vector< float > O2E_conversion_factor_array()
Definition: OWC_Channel_absolute_two_impl.h:111
void set_num_outputs(int num_outputs)
Definition: OWC_Channel_absolute_two_impl.h:77
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition: OWC_Channel_absolute_two_impl.h:98
std::vector< float > tx_orientation_array()
Definition: OWC_Channel_absolute_two_impl.h:84
<+description of block+>
Definition: OWC_Channel_absolute_two.h:37
void set_num_inputs(int num_inputs)
Definition: OWC_Channel_absolute_two_impl.h:74
void set_emission_angle_array()
Definition: OWC_Channel_absolute_two_impl.h:174
void set_sample_rate(int sample_rate)
Definition: OWC_Channel_absolute_two_impl.h:266
std::vector< float > noise_power_array()
Definition: OWC_Channel_absolute_two_impl.h:302
std::vector< float > concentrator_FOV_array()
Definition: OWC_Channel_absolute_two_impl.h:105
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
float channel_model(float emission_angle, float acceptance_angle, float distance, float lambertian_order, float ps_area, float optical_filter_transmittance, float refractive_index, float concentrator_FOV, float E2O_conversion_factor, float O2E_conversion_factor, int blockage)
Definition: OWC_Channel_absolute_two_impl.h:113
void set_rx_coordinates_array(std::vector< float > rx_coordinates_array)
Definition: OWC_Channel_absolute_two_impl.h:86
std::vector< float > optical_filter_transmittance_array()
Definition: OWC_Channel_absolute_two_impl.h:99
std::vector< float > tx_lambertian_order_array()
Definition: OWC_Channel_absolute_two_impl.h:93
OWC_Channel_absolute_two_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, int sample_rate, const std::vector< int > &blockage_array, const std::vector< float > &noise_power_array)
int r_num_outputs()
Definition: OWC_Channel_absolute_two_impl.h:78
Definition: binary_to_decimal_mapper.h:29
std::vector< float > remaining_samples_array()
Definition: OWC_Channel_absolute_two_impl.h:299
void set_num_delay_samples_array()
Definition: OWC_Channel_absolute_two_impl.h:269
std::vector< float > E2O_conversion_factor_array()
Definition: OWC_Channel_absolute_two_impl.h:108
void set_tx_orientation_array(std::vector< float > tx_orientation_array)
Definition: OWC_Channel_absolute_two_impl.h:83
std::vector< float > rx_photosensor_area_array()
Definition: OWC_Channel_absolute_two_impl.h:96
void set_blockage_array(std::vector< int > blockage_array)
Definition: OWC_Channel_absolute_two_impl.h:289
void set_acceptance_angle_array()
Definition: OWC_Channel_absolute_two_impl.h:220
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition: OWC_Channel_absolute_two_impl.h:110
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition: OWC_Channel_absolute_two_impl.h:104
void set_rx_orientation_array(std::vector< float > rx_orientation_array)
Definition: OWC_Channel_absolute_two_impl.h:89
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition: OWC_Channel_absolute_two_impl.h:101
std::vector< float > refractive_index_array()
Definition: OWC_Channel_absolute_two_impl.h:102
std::vector< float > rx_coordinates_array()
Definition: OWC_Channel_absolute_two_impl.h:87
std::vector< float > emission_angle_array()
Definition: OWC_Channel_absolute_two_impl.h:218
int r_num_inputs()
Definition: OWC_Channel_absolute_two_impl.h:75