GNU Radio's OWC Package
OWC_Channel_relative_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_RELATIVE_IMPL_H
24 #define INCLUDED_OWC_OWC_CHANNEL_RELATIVE_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  std::vector<float> d_emission_angle_array;
37  std::vector<float> d_acceptance_angle_array;
38  std::vector<float> d_distance_array;
39  std::vector<float> d_lambertian_order_array;
40  std::vector<float> d_photosensor_area_array;
41  std::vector<float> d_optical_filter_transmittance_array;
42  std::vector<float> d_refractive_index_array;
43  std::vector<float> d_concentrator_FOV_array;
44  std::vector<float> d_E2O_conversion_factor_array;
45  std::vector<float> d_O2E_conversion_factor_array;
46 
47  public:
48  OWC_Channel_relative_impl(int num_inputs, int num_outputs, const std::vector<float>& emission_angle_array, const std::vector<float>& acceptance_angle_array, const std::vector<float>& distance_array, const std::vector<float>& lambertian_order_array, const std::vector<float>& 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);
50 
51  void set_num_inputs(int num_inputs){d_num_inputs = num_inputs;}
52  int r_num_inputs() {return d_num_inputs;}
53 
54  void set_num_outputs(int num_outputs){d_num_outputs = num_outputs;}
55  int r_num_outputs() {return d_num_outputs;}
56 
57  void set_emission_angle_array(std::vector<float> emission_angle_array){d_emission_angle_array = emission_angle_array;}
58  std::vector<float> emission_angle_array() {return d_emission_angle_array;}
59 
60  void set_acceptance_angle_array(std::vector<float> acceptance_angle_array){d_acceptance_angle_array = acceptance_angle_array;}
61  std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
62 
63  void set_distance_array(std::vector<float> distance_array){d_distance_array = distance_array;}
64  std::vector<float> distance_array() {return d_distance_array;}
65 
66  void set_lambertian_order_array(std::vector<float> lambertian_order_array){d_lambertian_order_array = lambertian_order_array;}
67  std::vector<float> lambertian_order_array() {return d_lambertian_order_array;}
68 
69  void set_photosensor_area_array(std::vector<float> photosensor_area_array){d_photosensor_area_array = photosensor_area_array;}
70  std::vector<float> photosensor_area_array() {return d_photosensor_area_array;}
71 
73  std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
74 
75  void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array;}
76  std::vector<float> refractive_index_array() {return d_refractive_index_array;}
77 
78  void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array;}
79  std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
80 
81  void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array;}
82  std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
83 
84  void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array;}
85  std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
86 
87  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){
88 
89  float Gt = 0;
90 
91  if (emission_angle <= 90)
92  {
93  Gt = ((lambertian_order + 1)/(2*M_PI))*pow(cos(emission_angle*(M_PI/180)),lambertian_order);
94  }
95  else
96  {
97  Gt = 0;
98  }
99 
100  float Ts = optical_filter_transmittance;
101 
102  float refractive_index_squared = refractive_index*refractive_index;
103  float sin_of_concentrator_FOV_squared = sin(concentrator_FOV*(M_PI/180))*sin(concentrator_FOV*(M_PI/180));
104  float g = refractive_index_squared/sin_of_concentrator_FOV_squared;
105  if ((acceptance_angle < 0) || (acceptance_angle > concentrator_FOV))
106  {g = 0;}
107 
108  float Gr = ps_area*Ts*g*cos(acceptance_angle*(M_PI/180));
109  float distance_squared = distance * distance;
110 
111  float Ct = E2O_conversion_factor;
112  float Cr = O2E_conversion_factor;
113 
114  float H = Ct*((Gt*Gr)/distance_squared)*Cr;
115 
116  return H; }
117 
118  // Where all the action really happens
119  int work(
120  int noutput_items,
121  gr_vector_const_void_star &input_items,
122  gr_vector_void_star &output_items
123  );
124  };
125 
126  } // namespace owc
127 } // namespace gr
128 
129 #endif /* INCLUDED_OWC_OWC_CHANNEL_RELATIVE_IMPL_H */
130 
void set_num_outputs(int num_outputs)
Definition: OWC_Channel_relative_impl.h:54
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition: OWC_Channel_relative_impl.h:72
void set_acceptance_angle_array(std::vector< float > acceptance_angle_array)
Definition: OWC_Channel_relative_impl.h:60
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition: OWC_Channel_relative_impl.h:78
void set_photosensor_area_array(std::vector< float > photosensor_area_array)
Definition: OWC_Channel_relative_impl.h:69
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition: OWC_Channel_relative_impl.h:81
int r_num_inputs()
Definition: OWC_Channel_relative_impl.h:52
std::vector< float > optical_filter_transmittance_array()
Definition: OWC_Channel_relative_impl.h:73
void set_num_inputs(int num_inputs)
Definition: OWC_Channel_relative_impl.h:51
std::vector< float > O2E_conversion_factor_array()
Definition: OWC_Channel_relative_impl.h:85
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition: OWC_Channel_relative_impl.h:84
void set_emission_angle_array(std::vector< float > emission_angle_array)
Definition: OWC_Channel_relative_impl.h:57
<+description of block+>
Definition: OWC_Channel_relative.h:37
std::vector< float > photosensor_area_array()
Definition: OWC_Channel_relative_impl.h:70
std::vector< float > emission_angle_array()
Definition: OWC_Channel_relative_impl.h:58
Definition: binary_to_decimal_mapper.h:29
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)
Definition: OWC_Channel_relative_impl.h:87
std::vector< float > E2O_conversion_factor_array()
Definition: OWC_Channel_relative_impl.h:82
std::vector< float > acceptance_angle_array()
Definition: OWC_Channel_relative_impl.h:61
std::vector< float > refractive_index_array()
Definition: OWC_Channel_relative_impl.h:76
int r_num_outputs()
Definition: OWC_Channel_relative_impl.h:55
void set_lambertian_order_array(std::vector< float > lambertian_order_array)
Definition: OWC_Channel_relative_impl.h:66
std::vector< float > concentrator_FOV_array()
Definition: OWC_Channel_relative_impl.h:79
OWC_Channel_relative_impl(int num_inputs, int num_outputs, const std::vector< float > &emission_angle_array, const std::vector< float > &acceptance_angle_array, const std::vector< float > &distance_array, const std::vector< float > &lambertian_order_array, const std::vector< float > &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 > lambertian_order_array()
Definition: OWC_Channel_relative_impl.h:67
void set_distance_array(std::vector< float > distance_array)
Definition: OWC_Channel_relative_impl.h:63
std::vector< float > distance_array()
Definition: OWC_Channel_relative_impl.h:64
Definition: OWC_Channel_relative_impl.h:31
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition: OWC_Channel_relative_impl.h:75