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