GNU Radio's OWC Package
OWC_Channel_absolute_cplus_impl.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2024 Kunal Sangurmath from The Ubiquitous Communications and Networking(UCAN) Lab, University of Massachusetts, Boston.
4 *
5 * SPDX-License-Identifier: GPL-3.0-or-later
6 */
7
8#ifndef INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_CPLUS_IMPL_H
9#define INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_CPLUS_IMPL_H
10
12#include <random>
13#include <cmath>
14
15namespace gr {
16namespace owc {
17
19private:
20 int d_num_inputs = 1;
21 int d_num_outputs = 1;
22
23 std::vector<float> d_tx_lambertian_order_array;
24 std::vector<float> d_rx_photosensor_area_array;
25
26 std::vector<float> d_distance_array;
27
28 std::vector<float> d_emission_angle_array;
29 std::vector<float> d_acceptance_angle_array;
30
31 std::vector<float> d_optical_filter_transmittance_array;
32 std::vector<float> d_refractive_index_array;
33 bool d_clip_neg;
34 bool d_shot_noise;
35 float d_sample_rate;
36 float d_responsivity;
37 std::vector<float> d_concentrator_FOV_array;
38 std::vector<float> d_E2O_conversion_factor_array;
39 std::vector<float> d_O2E_conversion_factor_array;
40
41 std::vector<float> d_tx_coordinates_array;
42 std::vector<float> d_tx_orientation_array;
43 std::vector<float> d_rx_coordinates_array;
44 std::vector<float> d_rx_orientation_array;
45 std::vector<float> channel_model_values;
46 bool set = true;
47 std::mt19937 gen;
48
49 void calculate_channel_model_values()
50 {
51 channel_model_values.clear();
52 int nout = r_num_outputs();
53 int nin = r_num_inputs();
54 for (int x = 0; x < nout; x++) {
55 for (int j = 0; j < nin; j++) {
56 float Gt = 0;
57 float Gr = 0;
58 float g = 0;
59 int index = x * nin + j;
60 float H = 1;
61
62 if(distance_array()[index] != 0){
63 if (emission_angle_array()[index] <= 90)
64 {
65 Gt = ((tx_lambertian_order_array()[j] + 1)/(2*M_PI))*pow(cos(emission_angle_array()[index]*(M_PI/180)),tx_lambertian_order_array()[j]);
66 }
67
68 if ((acceptance_angle_array()[index] >= 0) && (acceptance_angle_array()[index] <= concentrator_FOV_array()[x])){
70 float refractive_index_squared = refractive_index_array()[x]*refractive_index_array()[x];
71 float sin_of_concentrator_FOV_squared = sin(concentrator_FOV_array()[x]*(M_PI/180))*sin(concentrator_FOV_array()[x]*(M_PI/180));
72 g = refractive_index_squared/sin_of_concentrator_FOV_squared;
73 Gr = rx_photosensor_area_array()[x]*Ts*g*cos(acceptance_angle_array()[index]*(M_PI/180));
74 }
75
76 float distance_squared = distance_array()[index] * distance_array()[index];
77
78 float Ct = E2O_conversion_factor_array()[j];
79 float Cr = O2E_conversion_factor_array()[x];
80
81 H = Ct*((Gt*Gr)/distance_squared)*Cr;
82 }
83 channel_model_values.push_back(H);
84 }
85 }
86 set = false;
87 }
88
89 float calculate_shot_noise(float P_avg) {
90 const float q = 1.60217663e-19;
91 float S_shot = 2 * q * responsivity() * P_avg;
92 float variance = S_shot * sample_rate();
93 return std::sqrt(variance);
94 }
95
96 void set_distance_array()
97 {
98 d_distance_array.clear();
99 for (int i = 0; i < 3*r_num_outputs(); i+=3)
100 {
101 float x2 = rx_coordinates_array()[i];
102 float y2 = rx_coordinates_array()[i+1];
103 float z2 = rx_coordinates_array()[i+2];
104
105 for (int j = 0; j < 3*r_num_inputs(); j+=3)
106 {
107 float x1 = tx_coordinates_array()[j];
108 float y1 = tx_coordinates_array()[j+1];
109 float z1 = tx_coordinates_array()[j+2];
110
111 float xSquared = (x2-x1)*(x2-x1);
112 float ySquared = (y2-y1)*(y2-y1);
113 float zSquared = (z2-z1)*(z2-z1);
114
115 float distance = sqrt(xSquared+ySquared+zSquared);
116
117 d_distance_array.push_back(distance);
118 }
119 }
120 set = true;
121 }
122
123 void set_emission_angle_array()
124 {
125 d_emission_angle_array.clear();
126 for (int i = 0; i < 3*r_num_outputs(); i+=3)
127 {
128 float x2 = rx_coordinates_array()[i];
129 float y2 = rx_coordinates_array()[i+1];
130 float z2 = rx_coordinates_array()[i+2];
131
132 for (int j = 0; j < 3*r_num_inputs(); j+=3)
133 {
134 float x1 = tx_coordinates_array()[j];
135 float y1 = tx_coordinates_array()[j+1];
136 float z1 = tx_coordinates_array()[j+2];
137
138 float ux = (x2-x1); //tx to rx vector
139 float uy = (y2-y1);
140 float uz = (z2-z1);
141
142 float ux_squared = ux*ux;
143 float uy_squared = uy*uy;
144 float uz_squared = uz*uz;
145
146 float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
147
148 float vx = tx_orientation_array()[j];
149 float vy = tx_orientation_array()[j+1];
150 float vz = tx_orientation_array()[j+2];
151
152 float vx_squared = vx*vx;
153 float vy_squared = vy*vy;
154 float vz_squared = vz*vz;
155
156 float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
157 float angle = 0;
158
159 if(u_mag != 0){
160 float numerator= (ux*vx)+(uy*vy)+(uz*vz);
161 float denominator = u_mag*v_mag;
162
163 angle = acos((numerator/denominator))*(180/M_PI);
164 }
165
166 d_emission_angle_array.push_back(angle);
167 }
168 }
169 set = true;
170 }
171
172 void set_acceptance_angle_array()
173 {
174 d_acceptance_angle_array.clear();
175 for (int i = 0; i < 3*r_num_outputs(); i+=3)
176 {
177 float x1 = rx_coordinates_array()[i];
178 float y1 = rx_coordinates_array()[i+1];
179 float z1 = rx_coordinates_array()[i+2];
180
181 float vx = rx_orientation_array()[i];
182 float vy = rx_orientation_array()[i+1];
183 float vz = rx_orientation_array()[i+2];
184
185 for (int j = 0; j < 3*r_num_inputs(); j+=3)
186 {
187 float x2 = tx_coordinates_array()[j];
188 float y2 = tx_coordinates_array()[j+1];
189 float z2 = tx_coordinates_array()[j+2];
190
191 float ux = (x2-x1); //tx to rx vector
192 float uy = (y2-y1);
193 float uz = (z2-z1);
194
195 float ux_squared = ux*ux;
196 float uy_squared = uy*uy;
197 float uz_squared = uz*uz;
198
199 float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
200
201 float vx_squared = vx*vx;
202 float vy_squared = vy*vy;
203 float vz_squared = vz*vz;
204
205 float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
206
207 float angle = 0;
208
209 if(u_mag != 0){
210 float numerator= (ux*vx)+(uy*vy)+(uz*vz);
211 float denominator = u_mag*v_mag;
212
213 angle = acos((numerator/denominator))*(180/M_PI);
214 }
215
216 d_acceptance_angle_array.push_back(angle);
217 }
218 }
219 set = true;
220 }
221
222public:
223 OWC_Channel_absolute_cplus_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, bool clip_neg, bool shot_noise, float sample_rate, float responsivity, const std::vector<float>& concentrator_FOV_array, const std::vector<float>& E2O_conversion_factor_array, const std::vector<float>& O2E_conversion_factor_array);
225
226 void set_num_inputs(int num_inputs){d_num_inputs = num_inputs; set = true;}
227 int r_num_inputs() {return d_num_inputs;}
228
229 void set_num_outputs(int num_outputs){d_num_outputs = num_outputs; set = true;}
230 int r_num_outputs() {return d_num_outputs;}
231
232 void set_tx_coordinates_array(std::vector<float> tx_coordinates_array){d_tx_coordinates_array = tx_coordinates_array; set = true;}
233 std::vector<float> tx_coordinates_array() {return d_tx_coordinates_array;}
234
235 void set_tx_orientation_array(std::vector<float> tx_orientation_array){d_tx_orientation_array = tx_orientation_array; set = true;}
236 std::vector<float> tx_orientation_array() {return d_tx_orientation_array;}
237
238 void set_rx_coordinates_array(std::vector<float> rx_coordinates_array){d_rx_coordinates_array = rx_coordinates_array; set = true;}
239 std::vector<float> rx_coordinates_array() {return d_rx_coordinates_array;}
240
241 void set_rx_orientation_array(std::vector<float> rx_orientation_array){d_rx_orientation_array = rx_orientation_array; set = true;}
242 std::vector<float> rx_orientation_array() {return d_rx_orientation_array;}
243
244 void set_tx_lambertian_order_array(std::vector<float> tx_lambertian_order_array){d_tx_lambertian_order_array = tx_lambertian_order_array; set = true;}
245 std::vector<float> tx_lambertian_order_array() {return d_tx_lambertian_order_array;}
246
247 void set_rx_photosensor_area_array(std::vector<float> rx_photosensor_area_array){d_rx_photosensor_area_array = rx_photosensor_area_array; set = true;}
248 std::vector<float> rx_photosensor_area_array() {return d_rx_photosensor_area_array;}
249
250 void set_optical_filter_transmittance_array(std::vector<float> optical_filter_transmittance_array){d_optical_filter_transmittance_array = optical_filter_transmittance_array; set = true;}
251 std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
252
253 void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array; set = true;}
254 std::vector<float> refractive_index_array() {return d_refractive_index_array;}
255
256 void set_clip_neg(bool clip_neg){d_clip_neg = clip_neg;}
257 bool get_clip_neg(){return d_clip_neg;}
258
259 void set_shot_noise(bool shot_noise){d_shot_noise = shot_noise;}
260 bool get_shot_noise(){return d_shot_noise;}
261
262 void set_sample_rate(float sample_rate){d_sample_rate = sample_rate;}
263 float sample_rate() {return d_sample_rate;}
264
265 void set_responsivity(float responsivity){d_responsivity = responsivity;}
266 float responsivity() {return d_responsivity;}
267
268 void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array; set = true;}
269 std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
270
271 void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array; set = true;}
272 std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
273
274 void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array; set = true;}
275 std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
276
277 std::vector<float> distance_array() {return d_distance_array;}
278
279 std::vector<float> emission_angle_array() {return d_emission_angle_array;}
280
281 std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
282
283
284 // Where all the action really happens
285 int work(int noutput_items, gr_vector_const_void_star &input_items,
286 gr_vector_void_star &output_items);
287};
288
289} // namespace owc
290} // namespace gr
291
292#endif /* INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_CPLUS_IMPL_H */
std::vector< float > O2E_conversion_factor_array()
Definition OWC_Channel_absolute_cplus_impl.h:275
std::vector< float > rx_photosensor_area_array()
Definition OWC_Channel_absolute_cplus_impl.h:248
int r_num_outputs()
Definition OWC_Channel_absolute_cplus_impl.h:230
float sample_rate()
Definition OWC_Channel_absolute_cplus_impl.h:263
void set_tx_lambertian_order_array(std::vector< float > tx_lambertian_order_array)
Definition OWC_Channel_absolute_cplus_impl.h:244
std::vector< float > tx_orientation_array()
Definition OWC_Channel_absolute_cplus_impl.h:236
void set_sample_rate(float sample_rate)
Definition OWC_Channel_absolute_cplus_impl.h:262
std::vector< float > refractive_index_array()
Definition OWC_Channel_absolute_cplus_impl.h:254
std::vector< float > rx_coordinates_array()
Definition OWC_Channel_absolute_cplus_impl.h:239
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition OWC_Channel_absolute_cplus_impl.h:268
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition OWC_Channel_absolute_cplus_impl.h:250
void set_shot_noise(bool shot_noise)
Definition OWC_Channel_absolute_cplus_impl.h:259
std::vector< float > distance_array()
Definition OWC_Channel_absolute_cplus_impl.h:277
std::vector< float > concentrator_FOV_array()
Definition OWC_Channel_absolute_cplus_impl.h:269
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition OWC_Channel_absolute_cplus_impl.h:271
void set_rx_coordinates_array(std::vector< float > rx_coordinates_array)
Definition OWC_Channel_absolute_cplus_impl.h:238
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition OWC_Channel_absolute_cplus_impl.h:253
void set_rx_orientation_array(std::vector< float > rx_orientation_array)
Definition OWC_Channel_absolute_cplus_impl.h:241
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
void set_tx_coordinates_array(std::vector< float > tx_coordinates_array)
Definition OWC_Channel_absolute_cplus_impl.h:232
std::vector< float > emission_angle_array()
Definition OWC_Channel_absolute_cplus_impl.h:279
bool get_clip_neg()
Definition OWC_Channel_absolute_cplus_impl.h:257
void set_num_inputs(int num_inputs)
Definition OWC_Channel_absolute_cplus_impl.h:226
void set_clip_neg(bool clip_neg)
Definition OWC_Channel_absolute_cplus_impl.h:256
void set_responsivity(float responsivity)
Definition OWC_Channel_absolute_cplus_impl.h:265
float responsivity()
Definition OWC_Channel_absolute_cplus_impl.h:266
std::vector< float > E2O_conversion_factor_array()
Definition OWC_Channel_absolute_cplus_impl.h:272
void set_tx_orientation_array(std::vector< float > tx_orientation_array)
Definition OWC_Channel_absolute_cplus_impl.h:235
void set_num_outputs(int num_outputs)
Definition OWC_Channel_absolute_cplus_impl.h:229
std::vector< float > tx_coordinates_array()
Definition OWC_Channel_absolute_cplus_impl.h:233
bool get_shot_noise()
Definition OWC_Channel_absolute_cplus_impl.h:260
std::vector< float > acceptance_angle_array()
Definition OWC_Channel_absolute_cplus_impl.h:281
std::vector< float > optical_filter_transmittance_array()
Definition OWC_Channel_absolute_cplus_impl.h:251
void set_rx_photosensor_area_array(std::vector< float > rx_photosensor_area_array)
Definition OWC_Channel_absolute_cplus_impl.h:247
OWC_Channel_absolute_cplus_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, bool clip_neg, bool shot_noise, float sample_rate, float responsivity, const std::vector< float > &concentrator_FOV_array, const std::vector< float > &E2O_conversion_factor_array, const std::vector< float > &O2E_conversion_factor_array)
int r_num_inputs()
Definition OWC_Channel_absolute_cplus_impl.h:227
std::vector< float > tx_lambertian_order_array()
Definition OWC_Channel_absolute_cplus_impl.h:245
std::vector< float > rx_orientation_array()
Definition OWC_Channel_absolute_cplus_impl.h:242
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition OWC_Channel_absolute_cplus_impl.h:274
<+description of block+>
Definition OWC_Channel_absolute_cplus.h:22
Definition Hermitian_Symmetry_i_o_same_vec_size_cplus.h:31
Definition Hermitian_Symmetry_i_o_same_vec_size_cplus.h:30