23 #ifndef INCLUDED_DIGITAL_CONSTELLATION_H
24 #define INCLUDED_DIGITAL_CONSTELLATION_H
28 #include <boost/enable_shared_from_this.hpp>
61 :
public boost::enable_shared_from_this<constellation>
65 std::vector<int> pre_diff_code,
66 unsigned int rotational_symmetry,
67 unsigned int dimensionality);
72 void map_to_points(
unsigned int value,
gr_complex *points);
73 std::vector<gr_complex> map_to_points_v(
unsigned int value);
76 virtual unsigned int decision_maker(
const gr_complex *sample) = 0;
78 unsigned int decision_maker_v(std::vector<gr_complex> sample);
80 unsigned int decision_maker_pe(
const gr_complex *sample,
float *phase_error);
87 virtual void calc_euclidean_metric(
const gr_complex *sample,
float *metric);
88 virtual void calc_hard_symbol_metric(
const gr_complex *sample,
float *metric);
91 std::vector<gr_complex>
points() {
return d_constellation;}
94 std::vector<gr_complex> s_points();
96 std::vector<std::vector<gr_complex> > v_points();
108 unsigned int bits_per_symbol()
110 return floor(log(
double(d_constellation.size()))/d_dimensionality/log(2.0));
120 return shared_from_this();
134 float get_distance(
unsigned int index,
const gr_complex *sample);
135 unsigned int get_closest_point(
const gr_complex *sample);
158 static sptr make(std::vector<gr_complex> constell,
159 std::vector<int> pre_diff_code,
160 unsigned int rotational_symmetry,
161 unsigned int dimensionality);
163 unsigned int decision_maker(
const gr_complex *sample);
170 std::vector<int> pre_diff_code,
171 unsigned int rotational_symmetry,
172 unsigned int dimensionality);
193 std::vector<int> pre_diff_code,
194 unsigned int rotational_symmetry,
195 unsigned int dimensionality,
196 unsigned int n_sectors);
200 unsigned int decision_maker(
const gr_complex *sample);
203 virtual unsigned int get_sector(
const gr_complex *sample) = 0;
204 virtual unsigned int calc_sector_value(
unsigned int sector) = 0;
205 void find_sector_values();
210 std::vector<int> sector_values;
241 std::vector<int> pre_diff_code,
242 unsigned int rotational_symmetry,
243 unsigned int real_sectors,
244 unsigned int imag_sectors,
245 float width_real_sectors,
246 float width_imag_sectors);
252 std::vector<int> pre_diff_code,
253 unsigned int rotational_symmetry,
254 unsigned int real_sectors,
255 unsigned int imag_sectors,
256 float width_real_sectors,
257 float width_imag_sectors);
259 unsigned int get_sector(
const gr_complex *sample);
261 unsigned int calc_sector_value(
unsigned int sector);
264 unsigned int n_real_sectors;
265 unsigned int n_imag_sectors;
266 float d_width_real_sectors;
267 float d_width_imag_sectors;
298 std::vector<int> pre_diff_code,
299 unsigned int rotational_symmetry,
300 unsigned int real_sectors,
301 unsigned int imag_sectors,
302 float width_real_sectors,
303 float width_imag_sectors,
304 std::vector<unsigned int> sector_values);
309 std::vector<int> pre_diff_code,
310 unsigned int rotational_symmetry,
311 unsigned int real_sectors,
312 unsigned int imag_sectors,
313 float width_real_sectors,
314 float width_imag_sectors,
315 std::vector<unsigned int> sector_values);
318 return d_sector_values[sector];
322 std::vector<unsigned int> d_sector_values;
347 static sptr make(std::vector<gr_complex> constell,
348 std::vector<int> pre_diff_code,
349 unsigned int n_sectors);
354 unsigned int get_sector(
const gr_complex *sample);
356 unsigned int calc_sector_value(
unsigned int sector);
359 std::vector<int> pre_diff_code,
360 unsigned int n_sectors);
385 unsigned int decision_maker(
const gr_complex *sample);
413 unsigned int decision_maker(
const gr_complex *sample);
441 unsigned int decision_maker(
const gr_complex *sample);
469 unsigned int decision_maker(
const gr_complex *sample);