23 #ifndef INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_TWO_IMPL_H 24 #define INCLUDED_OWC_OWC_CHANNEL_ABSOLUTE_TWO_IMPL_H 27 #include <gnuradio/random.h> 36 int d_num_outputs = 1;
38 std::vector<float> d_tx_lambertian_order_array;
39 std::vector<float> d_rx_photosensor_area_array;
41 std::vector<float> d_distance_array;
43 std::vector<float> d_emission_angle_array;
44 std::vector<float> d_acceptance_angle_array;
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;
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;
59 std::vector<int> d_num_delay_samples_array;
60 std::vector<int> d_blockage_array;
62 std::vector<float> d_remaining_input_samples;
64 std::vector<float> d_noise_power_array;
68 int d_noutput_items_previous = 10000;
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);
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){
116 if (emission_angle <= 90)
118 Gt = ((lambertian_order + 1)/(2*M_PI))*pow(cos(emission_angle*(M_PI/180)),lambertian_order);
125 float Ts = optical_filter_transmittance;
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))
133 float Gr = ps_area*Ts*g*cos(acceptance_angle*(M_PI/180));
134 float distance_squared = distance * distance;
136 float Ct = E2O_conversion_factor;
137 float Cr = O2E_conversion_factor;
139 float H = Ct*((Gt*Gr)/distance_squared)*Cr;
148 d_distance_array.clear();
161 float xSquared = (x2-x1)*(x2-x1);
162 float ySquared = (y2-y1)*(y2-y1);
163 float zSquared = (z2-z1)*(z2-z1);
165 float distance = sqrt(xSquared+ySquared+zSquared);
167 d_distance_array.push_back(distance);
176 d_emission_angle_array.clear();
193 float ux_squared = ux*ux;
194 float uy_squared = uy*uy;
195 float uz_squared = uz*uz;
197 float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
203 float vx_squared = vx*vx;
204 float vy_squared = vy*vy;
205 float vz_squared = vz*vz;
207 float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
209 float numerator= (ux*vx)+(uy*vy)+(uz*vz);
210 float denominator =u_mag*v_mag;
212 float angle = acos((numerator/denominator))*(180/M_PI);
214 d_emission_angle_array.push_back(angle);
222 d_acceptance_angle_array.clear();
243 float ux_squared = ux*ux;
244 float uy_squared = uy*uy;
245 float uz_squared = uz*uz;
247 float u_mag = sqrt(ux_squared + uy_squared + uz_squared);
249 float vx_squared = vx*vx;
250 float vy_squared = vy*vy;
251 float vz_squared = vz*vz;
253 float v_mag = sqrt(vx_squared + vy_squared + vz_squared);
255 float numerator= (ux*vx)+(uy*vy)+(uz*vz);
256 float denominator =u_mag*v_mag;
258 float angle = acos(numerator/denominator)*(180/M_PI);
260 d_acceptance_angle_array.push_back(angle);
271 d_num_delay_samples_array.clear();
272 float speed_of_light = 299792458;
274 float propagation_time = 0;
275 float num_delay_samples = 0;
279 for (
int x = 0; x < array_length; x++)
282 num_delay_samples = round(propagation_time *
sample_rate());
284 d_num_delay_samples_array.push_back(num_delay_samples);
294 for (
int x = 0; x <
r_num_inputs()*d_noutput_items_previous; x++)
296 d_remaining_input_samples.push_back(0);
307 gr_vector_const_void_star &input_items,
308 gr_vector_void_star &output_items
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
~OWC_Channel_absolute_two_impl()
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