GNU Radio's OWC Package
OWC_Channel_relative_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_RELATIVE_TWO_IMPL_H
24 #define INCLUDED_OWC_OWC_CHANNEL_RELATIVE_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  std::vector<float> d_emission_angle_array;
38  std::vector<float> d_acceptance_angle_array;
39  std::vector<float> d_distance_array;
40  std::vector<float> d_lambertian_order_array;
41  std::vector<float> d_photosensor_area_array;
42  std::vector<float> d_optical_filter_transmittance_array;
43  std::vector<float> d_refractive_index_array;
44  std::vector<float> d_concentrator_FOV_array;
45  std::vector<float> d_E2O_conversion_factor_array;
46  std::vector<float> d_O2E_conversion_factor_array;
47 
48  int d_sample_rate;
49 
50  std::vector<int> d_num_delay_samples_array;
51  std::vector<int> d_blockage_array;
52 
53  std::vector<float> d_remaining_input_samples;
54 
55  std::vector<float> d_noise_power_array;
56 
57  gr::random d_rng;
58 
59  int d_noutput_items_previous = 10000;//Using 10000 (a very large number just to be safe) zeros initially to add at the very start
60 
61  public:
62  OWC_Channel_relative_two_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, int sample_rate, const std::vector<int>& blockage_array, const std::vector<float>& noise_power_array);
64 
65  void set_num_inputs(int num_inputs){d_num_inputs = num_inputs;}
66  int r_num_inputs() {return d_num_inputs;}
67 
68  void set_num_outputs(int num_outputs){d_num_outputs = num_outputs;}
69  int r_num_outputs() {return d_num_outputs;}
70 
71  void set_emission_angle_array(std::vector<float> emission_angle_array){d_emission_angle_array = emission_angle_array;}
72  std::vector<float> emission_angle_array() {return d_emission_angle_array;}
73 
74  void set_acceptance_angle_array(std::vector<float> acceptance_angle_array){d_acceptance_angle_array = acceptance_angle_array;}
75  std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
76 
77  void set_distance_array(std::vector<float> distance_array){d_distance_array = distance_array;}
78  std::vector<float> distance_array() {return d_distance_array;}
79 
80  void set_lambertian_order_array(std::vector<float> lambertian_order_array){d_lambertian_order_array = lambertian_order_array;}
81  std::vector<float> lambertian_order_array() {return d_lambertian_order_array;}
82 
83  void set_photosensor_area_array(std::vector<float> photosensor_area_array){d_photosensor_area_array = photosensor_area_array;}
84  std::vector<float> photosensor_area_array() {return d_photosensor_area_array;}
85 
87  std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
88 
89  void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array;}
90  std::vector<float> refractive_index_array() {return d_refractive_index_array;}
91 
92  void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array;}
93  std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
94 
95  void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array;}
96  std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
97 
98  void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array;}
99  std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
100 
101  void set_sample_rate(int sample_rate){d_sample_rate = sample_rate;}
102  int sample_rate() {return d_sample_rate;}
103 
105  {
106  d_num_delay_samples_array.clear();
107  float speed_of_light = 299792458;
108 
109  float propagation_time = 0;
110  float num_delay_samples = 0;
111 
112  int array_length = r_num_inputs()*r_num_outputs();
113 
114  for (int x = 0; x < array_length; x++)
115  {
116  propagation_time = distance_array()[x] / speed_of_light;
117  num_delay_samples = round(propagation_time * sample_rate());
118 
119  d_num_delay_samples_array.push_back(num_delay_samples);
120  }
121  }
122  std::vector<int> num_delay_samples_array() {return d_num_delay_samples_array;}
123 
124  void set_blockage_array(std::vector<int> blockage_array){d_blockage_array = blockage_array;}
125  std::vector<int> blockage_array() {return d_blockage_array;}
126 
127  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){
128  float Gt = 0;
129 
130  if (emission_angle <= 90)
131  {
132  Gt = ((lambertian_order + 1)/(2*M_PI))*pow(cos(emission_angle*(M_PI/180)),lambertian_order);
133  }
134  else
135  {
136  Gt = 0;
137  }
138 
139  float Ts = optical_filter_transmittance;
140 
141  float refractive_index_squared = refractive_index*refractive_index;
142  float sin_of_concentrator_FOV_squared = sin(concentrator_FOV*(M_PI/180))*sin(concentrator_FOV*(M_PI/180));
143  float g = refractive_index_squared/sin_of_concentrator_FOV_squared;
144  if ((acceptance_angle < 0) || (acceptance_angle > concentrator_FOV))
145  {g = 0.0;}
146 
147  float Gr = ps_area*Ts*g*cos(acceptance_angle*(M_PI/180));
148  float distance_squared = distance * distance;
149 
150  float Ct = E2O_conversion_factor;
151  float Cr = O2E_conversion_factor;
152 
153  float H = Ct*((Gt*Gr)/distance_squared)*Cr;
154 
155  H = H * blockage;
156 
157  return H; }
158 
160  {
161  for (int x = 0; x < r_num_inputs()*d_noutput_items_previous; x++)
162  {
163  d_remaining_input_samples.push_back(0);
164  }
165  }
166  std::vector<float> remaining_samples_array() {return d_remaining_input_samples;}
167 
168  void set_noise_power_array(std::vector<float> noise_power_array){d_noise_power_array = noise_power_array;}
169  std::vector<float> noise_power_array() {return d_noise_power_array;}
170  // Where all the action really happens
171  int work(
172  int noutput_items,
173  gr_vector_const_void_star &input_items,
174  gr_vector_void_star &output_items
175  );
176  };
177 
178  } // namespace owc
179 } // namespace gr
180 
181 #endif /* INCLUDED_OWC_OWC_CHANNEL_RELATIVE_TWO_IMPL_H */
182 
void set_remaining_samples_array()
Definition: OWC_Channel_relative_two_impl.h:159
void set_photosensor_area_array(std::vector< float > photosensor_area_array)
Definition: OWC_Channel_relative_two_impl.h:83
void set_num_outputs(int num_outputs)
Definition: OWC_Channel_relative_two_impl.h:68
std::vector< float > O2E_conversion_factor_array()
Definition: OWC_Channel_relative_two_impl.h:99
std::vector< float > photosensor_area_array()
Definition: OWC_Channel_relative_two_impl.h:84
<+description of block+>
Definition: OWC_Channel_relative_two.h:37
void set_num_inputs(int num_inputs)
Definition: OWC_Channel_relative_two_impl.h:65
void set_distance_array(std::vector< float > distance_array)
Definition: OWC_Channel_relative_two_impl.h:77
void set_acceptance_angle_array(std::vector< float > acceptance_angle_array)
Definition: OWC_Channel_relative_two_impl.h:74
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition: OWC_Channel_relative_two_impl.h:98
std::vector< float > emission_angle_array()
Definition: OWC_Channel_relative_two_impl.h:72
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition: OWC_Channel_relative_two_impl.h:89
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_relative_two_impl.h:127
std::vector< float > concentrator_FOV_array()
Definition: OWC_Channel_relative_two_impl.h:93
std::vector< float > acceptance_angle_array()
Definition: OWC_Channel_relative_two_impl.h:75
std::vector< float > E2O_conversion_factor_array()
Definition: OWC_Channel_relative_two_impl.h:96
Definition: OWC_Channel_relative_two_impl.h:32
Definition: binary_to_decimal_mapper.h:29
std::vector< float > lambertian_order_array()
Definition: OWC_Channel_relative_two_impl.h:81
int sample_rate()
Definition: OWC_Channel_relative_two_impl.h:102
int r_num_outputs()
Definition: OWC_Channel_relative_two_impl.h:69
std::vector< int > num_delay_samples_array()
Definition: OWC_Channel_relative_two_impl.h:122
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition: OWC_Channel_relative_two_impl.h:86
void set_num_delay_samples_array()
Definition: OWC_Channel_relative_two_impl.h:104
OWC_Channel_relative_two_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, int sample_rate, const std::vector< int > &blockage_array, const std::vector< float > &noise_power_array)
int r_num_inputs()
Definition: OWC_Channel_relative_two_impl.h:66
std::vector< int > blockage_array()
Definition: OWC_Channel_relative_two_impl.h:125
void set_noise_power_array(std::vector< float > noise_power_array)
Definition: OWC_Channel_relative_two_impl.h:168
std::vector< float > remaining_samples_array()
Definition: OWC_Channel_relative_two_impl.h:166
std::vector< float > optical_filter_transmittance_array()
Definition: OWC_Channel_relative_two_impl.h:87
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition: OWC_Channel_relative_two_impl.h:95
std::vector< float > refractive_index_array()
Definition: OWC_Channel_relative_two_impl.h:90
void set_emission_angle_array(std::vector< float > emission_angle_array)
Definition: OWC_Channel_relative_two_impl.h:71
std::vector< float > noise_power_array()
Definition: OWC_Channel_relative_two_impl.h:169
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition: OWC_Channel_relative_two_impl.h:92
void set_sample_rate(int sample_rate)
Definition: OWC_Channel_relative_two_impl.h:101
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
void set_lambertian_order_array(std::vector< float > lambertian_order_array)
Definition: OWC_Channel_relative_two_impl.h:80
void set_blockage_array(std::vector< int > blockage_array)
Definition: OWC_Channel_relative_two_impl.h:124
std::vector< float > distance_array()
Definition: OWC_Channel_relative_two_impl.h:78