GNU Radio's OWC Package
OWC_Channel_relative_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_RELATIVE_CPLUS_IMPL_H
9#define INCLUDED_OWC_OWC_CHANNEL_RELATIVE_CPLUS_IMPL_H
10
12#include <random>
13#include <cmath>
14
15namespace gr {
16namespace owc {
17
19{
20private:
21 std::mt19937 gen;
22 int d_num_inputs = 1;
23 int d_num_outputs = 1;
24 std::vector<float> d_emission_angle_array;
25 std::vector<float> d_acceptance_angle_array;
26 std::vector<float> d_distance_array;
27 std::vector<float> d_lambertian_order_array;
28 std::vector<float> d_photosensor_area_array;
29 std::vector<float> d_optical_filter_transmittance_array;
30 std::vector<float> d_refractive_index_array;
31 bool d_clip_neg;
32 bool d_shot_noise;
33 float d_sample_rate;
34 float d_responsivity;
35 std::vector<float> d_concentrator_FOV_array;
36 std::vector<float> d_E2O_conversion_factor_array;
37 std::vector<float> d_O2E_conversion_factor_array;
38 std::vector<float> channel_model_values;
39 bool set = true;
40 std::mt19937 generator;
41
42 void calculate_channel_model_values()
43 {
44 channel_model_values.clear();
45 int nout = r_num_outputs();
46 int nin = r_num_inputs();
47 for (int x = 0; x < nout; x++) {
48 for (int j = 0; j < nin; j++) {
49 float Gt = 0;
50 float Gr = 0;
51 float g = 0;
52 int index = x * nin + j;
53
54 if (emission_angle_array()[index] <= 90)
55 {
56 Gt = ((lambertian_order_array()[j] + 1)/(2*M_PI))*pow(cos(emission_angle_array()[index]*(M_PI/180)),lambertian_order_array()[j]);
57 }
58
59 if (std::abs(acceptance_angle_array()[index]) <= concentrator_FOV_array()[x]){
61 float refractive_index_squared = refractive_index_array()[x]*refractive_index_array()[x];
62 float sin_of_concentrator_FOV_squared = sin(concentrator_FOV_array()[x]*(M_PI/180))*sin(concentrator_FOV_array()[x]*(M_PI/180));
63 g = refractive_index_squared/sin_of_concentrator_FOV_squared;
64 Gr = photosensor_area_array()[x]*Ts*g*cos(acceptance_angle_array()[index]*(M_PI/180));
65 }
66
67 float distance_squared = distance_array()[index] * distance_array()[index];
68
69 float Ct = E2O_conversion_factor_array()[j];
70 float Cr = O2E_conversion_factor_array()[x];
71
72 float H = Ct*((Gt*Gr)/distance_squared)*Cr;
73 channel_model_values.push_back(H);
74 }
75 }
76 set = false;
77 }
78
79 float calculate_shot_noise(float P_avg) {
80 const float q = 1.60217663e-19;
81 float S_shot = 2 * q * responsivity() * P_avg;
82 float variance = S_shot * sample_rate();
83 return std::sqrt(variance);
84 }
85
86
87public:
88 OWC_Channel_relative_cplus_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, 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);
90
91 void set_num_inputs(int num_inputs){d_num_inputs = num_inputs; set = true;}
92 int r_num_inputs() {return d_num_inputs;}
93
94 void set_num_outputs(int num_outputs){d_num_outputs = num_outputs; set = true;}
95 int r_num_outputs() {return d_num_outputs;}
96
97 void set_emission_angle_array(std::vector<float> emission_angle_array){d_emission_angle_array = emission_angle_array; set = true;}
98 std::vector<float> emission_angle_array() {return d_emission_angle_array;}
99
100 void set_acceptance_angle_array(std::vector<float> acceptance_angle_array){d_acceptance_angle_array = acceptance_angle_array; set = true;}
101 std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
102
103 void set_distance_array(std::vector<float> distance_array){d_distance_array = distance_array; set = true;}
104 std::vector<float> distance_array() {return d_distance_array;}
105
106 void set_lambertian_order_array(std::vector<float> lambertian_order_array){d_lambertian_order_array = lambertian_order_array; set = true;}
107 std::vector<float> lambertian_order_array() {return d_lambertian_order_array;}
108
109 void set_photosensor_area_array(std::vector<float> photosensor_area_array){d_photosensor_area_array = photosensor_area_array; set = true;}
110 std::vector<float> photosensor_area_array() {return d_photosensor_area_array;}
111
112 void set_optical_filter_transmittance_array(std::vector<float> optical_filter_transmittance_array){d_optical_filter_transmittance_array = optical_filter_transmittance_array; set = true;}
113 std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
114
115 void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array; set = true;}
116 std::vector<float> refractive_index_array() {return d_refractive_index_array;}
117
118 void set_clip_neg(bool clip_neg){d_clip_neg = clip_neg;}
119 bool get_clip_neg(){return d_clip_neg;}
120
121 void set_shot_noise(bool shot_noise){d_shot_noise = shot_noise;}
122 bool get_shot_noise(){return d_shot_noise;}
123
124 void set_sample_rate(float sample_rate){d_sample_rate = sample_rate;}
125 float sample_rate() {return d_sample_rate;}
126
127 void set_responsivity(float responsivity){d_responsivity = responsivity;}
128 float responsivity() {return d_responsivity;}
129
130 void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array; set = true;}
131 std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
132
133 void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array; set = true;}
134 std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
135
136 void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array; set = true;}
137 std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
138
139 int work(int noutput_items,
140 gr_vector_const_void_star& input_items,
141 gr_vector_void_star& output_items);
142};
143
144} // namespace owc
145} // namespace gr
146
147#endif /* INCLUDED_OWC_OWC_CHANNEL_RELATIVE_CPLUS_IMPL_H */
std::vector< float > optical_filter_transmittance_array()
Definition OWC_Channel_relative_cplus_impl.h:113
std::vector< float > lambertian_order_array()
Definition OWC_Channel_relative_cplus_impl.h:107
std::vector< float > acceptance_angle_array()
Definition OWC_Channel_relative_cplus_impl.h:101
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition OWC_Channel_relative_cplus_impl.h:130
void set_acceptance_angle_array(std::vector< float > acceptance_angle_array)
Definition OWC_Channel_relative_cplus_impl.h:100
float responsivity()
Definition OWC_Channel_relative_cplus_impl.h:128
void set_num_outputs(int num_outputs)
Definition OWC_Channel_relative_cplus_impl.h:94
bool get_shot_noise()
Definition OWC_Channel_relative_cplus_impl.h:122
void set_emission_angle_array(std::vector< float > emission_angle_array)
Definition OWC_Channel_relative_cplus_impl.h:97
void set_responsivity(float responsivity)
Definition OWC_Channel_relative_cplus_impl.h:127
std::vector< float > concentrator_FOV_array()
Definition OWC_Channel_relative_cplus_impl.h:131
std::vector< float > emission_angle_array()
Definition OWC_Channel_relative_cplus_impl.h:98
std::vector< float > distance_array()
Definition OWC_Channel_relative_cplus_impl.h:104
int r_num_outputs()
Definition OWC_Channel_relative_cplus_impl.h:95
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition OWC_Channel_relative_cplus_impl.h:115
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition OWC_Channel_relative_cplus_impl.h:112
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition OWC_Channel_relative_cplus_impl.h:133
OWC_Channel_relative_cplus_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, 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 work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
bool get_clip_neg()
Definition OWC_Channel_relative_cplus_impl.h:119
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition OWC_Channel_relative_cplus_impl.h:136
void set_num_inputs(int num_inputs)
Definition OWC_Channel_relative_cplus_impl.h:91
void set_distance_array(std::vector< float > distance_array)
Definition OWC_Channel_relative_cplus_impl.h:103
void set_photosensor_area_array(std::vector< float > photosensor_area_array)
Definition OWC_Channel_relative_cplus_impl.h:109
std::vector< float > E2O_conversion_factor_array()
Definition OWC_Channel_relative_cplus_impl.h:134
std::vector< float > O2E_conversion_factor_array()
Definition OWC_Channel_relative_cplus_impl.h:137
void set_lambertian_order_array(std::vector< float > lambertian_order_array)
Definition OWC_Channel_relative_cplus_impl.h:106
int r_num_inputs()
Definition OWC_Channel_relative_cplus_impl.h:92
std::vector< float > refractive_index_array()
Definition OWC_Channel_relative_cplus_impl.h:116
std::vector< float > photosensor_area_array()
Definition OWC_Channel_relative_cplus_impl.h:110
void set_shot_noise(bool shot_noise)
Definition OWC_Channel_relative_cplus_impl.h:121
void set_sample_rate(float sample_rate)
Definition OWC_Channel_relative_cplus_impl.h:124
void set_clip_neg(bool clip_neg)
Definition OWC_Channel_relative_cplus_impl.h:118
float sample_rate()
Definition OWC_Channel_relative_cplus_impl.h:125
<+description of block+>
Definition OWC_Channel_relative_cplus.h:23
Definition Hermitian_Symmetry_i_o_same_vec_size_cplus.h:31
Definition Hermitian_Symmetry_i_o_same_vec_size_cplus.h:30