GNU Radio's OWC Package
OWC_Channel_relative_cpvolk_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_CPVOLK_IMPL_H
9#define INCLUDED_OWC_OWC_CHANNEL_RELATIVE_CPVOLK_IMPL_H
10
12#include <random>
13#include <algorithm>
14#include <cmath>
15
16namespace gr {
17namespace owc {
18
20{
21private:
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 gen;
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
86public:
87 OWC_Channel_relative_cpvolk_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);
89
90 void set_num_inputs(int num_inputs){d_num_inputs = num_inputs; set = true;}
91 int r_num_inputs() {return d_num_inputs;}
92
93 void set_num_outputs(int num_outputs){d_num_outputs = num_outputs; set = true;}
94 int r_num_outputs() {return d_num_outputs;}
95
96 void set_emission_angle_array(std::vector<float> emission_angle_array){d_emission_angle_array = emission_angle_array; set = true;}
97 std::vector<float> emission_angle_array() {return d_emission_angle_array;}
98
99 void set_acceptance_angle_array(std::vector<float> acceptance_angle_array){d_acceptance_angle_array = acceptance_angle_array; set = true;}
100 std::vector<float> acceptance_angle_array() {return d_acceptance_angle_array;}
101
102 void set_distance_array(std::vector<float> distance_array){d_distance_array = distance_array; set = true;}
103 std::vector<float> distance_array() {return d_distance_array;}
104
105 void set_lambertian_order_array(std::vector<float> lambertian_order_array){d_lambertian_order_array = lambertian_order_array; set = true;}
106 std::vector<float> lambertian_order_array() {return d_lambertian_order_array;}
107
108 void set_photosensor_area_array(std::vector<float> photosensor_area_array){d_photosensor_area_array = photosensor_area_array; set = true;}
109 std::vector<float> photosensor_area_array() {return d_photosensor_area_array;}
110
111 void set_optical_filter_transmittance_array(std::vector<float> optical_filter_transmittance_array){d_optical_filter_transmittance_array = optical_filter_transmittance_array; set = true;}
112 std::vector<float> optical_filter_transmittance_array() {return d_optical_filter_transmittance_array;}
113
114 void set_refractive_index_array(std::vector<float> refractive_index_array){d_refractive_index_array = refractive_index_array; set = true;}
115 std::vector<float> refractive_index_array() {return d_refractive_index_array;}
116
117 void set_clip_neg(bool clip_neg){d_clip_neg = clip_neg;}
118 bool get_clip_neg(){return d_clip_neg;}
119
120 void set_shot_noise(bool shot_noise){d_shot_noise = shot_noise;}
121 bool get_shot_noise(){return d_shot_noise;}
122
123 void set_sample_rate(float sample_rate){d_sample_rate = sample_rate;}
124 float sample_rate() {return d_sample_rate;}
125
126 void set_responsivity(float responsivity){d_responsivity = responsivity;}
127 float responsivity() {return d_responsivity;}
128
129 void set_concentrator_FOV_array(std::vector<float> concentrator_FOV_array){d_concentrator_FOV_array = concentrator_FOV_array; set = true;}
130 std::vector<float> concentrator_FOV_array() {return d_concentrator_FOV_array;}
131
132 void set_E2O_conversion_factor_array(std::vector<float> E2O_conversion_factor_array){d_E2O_conversion_factor_array = E2O_conversion_factor_array; set = true;}
133 std::vector<float> E2O_conversion_factor_array() {return d_E2O_conversion_factor_array;}
134
135 void set_O2E_conversion_factor_array(std::vector<float> O2E_conversion_factor_array){d_O2E_conversion_factor_array = O2E_conversion_factor_array; set = true;}
136 std::vector<float> O2E_conversion_factor_array() {return d_O2E_conversion_factor_array;}
137
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_CPVOLK_IMPL_H */
OWC_Channel_relative_cpvolk_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)
std::vector< float > optical_filter_transmittance_array()
Definition OWC_Channel_relative_cpvolk_impl.h:112
float responsivity()
Definition OWC_Channel_relative_cpvolk_impl.h:127
void set_num_inputs(int num_inputs)
Definition OWC_Channel_relative_cpvolk_impl.h:90
void set_distance_array(std::vector< float > distance_array)
Definition OWC_Channel_relative_cpvolk_impl.h:102
bool get_shot_noise()
Definition OWC_Channel_relative_cpvolk_impl.h:121
void set_lambertian_order_array(std::vector< float > lambertian_order_array)
Definition OWC_Channel_relative_cpvolk_impl.h:105
float sample_rate()
Definition OWC_Channel_relative_cpvolk_impl.h:124
void set_concentrator_FOV_array(std::vector< float > concentrator_FOV_array)
Definition OWC_Channel_relative_cpvolk_impl.h:129
int r_num_outputs()
Definition OWC_Channel_relative_cpvolk_impl.h:94
std::vector< float > lambertian_order_array()
Definition OWC_Channel_relative_cpvolk_impl.h:106
void set_optical_filter_transmittance_array(std::vector< float > optical_filter_transmittance_array)
Definition OWC_Channel_relative_cpvolk_impl.h:111
std::vector< float > concentrator_FOV_array()
Definition OWC_Channel_relative_cpvolk_impl.h:130
void set_O2E_conversion_factor_array(std::vector< float > O2E_conversion_factor_array)
Definition OWC_Channel_relative_cpvolk_impl.h:135
std::vector< float > photosensor_area_array()
Definition OWC_Channel_relative_cpvolk_impl.h:109
std::vector< float > distance_array()
Definition OWC_Channel_relative_cpvolk_impl.h:103
void set_num_outputs(int num_outputs)
Definition OWC_Channel_relative_cpvolk_impl.h:93
std::vector< float > E2O_conversion_factor_array()
Definition OWC_Channel_relative_cpvolk_impl.h:133
void set_refractive_index_array(std::vector< float > refractive_index_array)
Definition OWC_Channel_relative_cpvolk_impl.h:114
std::vector< float > O2E_conversion_factor_array()
Definition OWC_Channel_relative_cpvolk_impl.h:136
std::vector< float > emission_angle_array()
Definition OWC_Channel_relative_cpvolk_impl.h:97
std::vector< float > acceptance_angle_array()
Definition OWC_Channel_relative_cpvolk_impl.h:100
int r_num_inputs()
Definition OWC_Channel_relative_cpvolk_impl.h:91
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
void set_clip_neg(bool clip_neg)
Definition OWC_Channel_relative_cpvolk_impl.h:117
void set_shot_noise(bool shot_noise)
Definition OWC_Channel_relative_cpvolk_impl.h:120
void set_E2O_conversion_factor_array(std::vector< float > E2O_conversion_factor_array)
Definition OWC_Channel_relative_cpvolk_impl.h:132
bool get_clip_neg()
Definition OWC_Channel_relative_cpvolk_impl.h:118
void set_sample_rate(float sample_rate)
Definition OWC_Channel_relative_cpvolk_impl.h:123
void set_photosensor_area_array(std::vector< float > photosensor_area_array)
Definition OWC_Channel_relative_cpvolk_impl.h:108
void set_responsivity(float responsivity)
Definition OWC_Channel_relative_cpvolk_impl.h:126
std::vector< float > refractive_index_array()
Definition OWC_Channel_relative_cpvolk_impl.h:115
void set_acceptance_angle_array(std::vector< float > acceptance_angle_array)
Definition OWC_Channel_relative_cpvolk_impl.h:99
void set_emission_angle_array(std::vector< float > emission_angle_array)
Definition OWC_Channel_relative_cpvolk_impl.h:96
<+description of block+>
Definition OWC_Channel_relative_cpvolk.h:23
Definition Hermitian_Symmetry_i_o_same_vec_size_cplus.h:31
Definition Hermitian_Symmetry_i_o_same_vec_size_cplus.h:30