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();
110 return floor(log(
double(d_constellation.size()))/d_dimensionality/log(2.0));
120 return shared_from_this();
135 void gen_soft_dec_lut(
int precision,
float npwr=1.0);
156 virtual std::vector<float> calc_soft_dec(
gr_complex sample,
float npwr=1.0);
176 void set_soft_dec_lut(
const std::vector< std::vector<float> > &soft_dec_lut,
180 bool has_soft_dec_lut();
191 std::vector<float> soft_decision_maker(
gr_complex sample);
209 float get_distance(
unsigned int index,
const gr_complex *sample);
210 unsigned int get_closest_point(
const gr_complex *sample);
243 static sptr make(std::vector<gr_complex> constell,
244 std::vector<int> pre_diff_code,
245 unsigned int rotational_symmetry,
246 unsigned int dimensionality);
248 unsigned int decision_maker(
const gr_complex *sample);
255 std::vector<int> pre_diff_code,
256 unsigned int rotational_symmetry,
257 unsigned int dimensionality);
278 std::vector<int> pre_diff_code,
279 unsigned int rotational_symmetry,
280 unsigned int dimensionality,
281 unsigned int n_sectors);
285 unsigned int decision_maker(
const gr_complex *sample);
288 virtual unsigned int get_sector(
const gr_complex *sample) = 0;
289 virtual unsigned int calc_sector_value(
unsigned int sector) = 0;
290 void find_sector_values();
295 std::vector<int> sector_values;
337 std::vector<int> pre_diff_code,
338 unsigned int rotational_symmetry,
339 unsigned int real_sectors,
340 unsigned int imag_sectors,
341 float width_real_sectors,
342 float width_imag_sectors);
348 std::vector<int> pre_diff_code,
349 unsigned int rotational_symmetry,
350 unsigned int real_sectors,
351 unsigned int imag_sectors,
352 float width_real_sectors,
353 float width_imag_sectors);
355 unsigned int get_sector(
const gr_complex *sample);
357 unsigned int calc_sector_value(
unsigned int sector);
360 unsigned int n_real_sectors;
361 unsigned int n_imag_sectors;
362 float d_width_real_sectors;
363 float d_width_imag_sectors;
394 std::vector<int> pre_diff_code,
395 unsigned int rotational_symmetry,
396 unsigned int real_sectors,
397 unsigned int imag_sectors,
398 float width_real_sectors,
399 float width_imag_sectors,
400 std::vector<unsigned int> sector_values);
405 std::vector<int> pre_diff_code,
406 unsigned int rotational_symmetry,
407 unsigned int real_sectors,
408 unsigned int imag_sectors,
409 float width_real_sectors,
410 float width_imag_sectors,
411 std::vector<unsigned int> sector_values);
414 return d_sector_values[sector];
418 std::vector<unsigned int> d_sector_values;
443 static sptr make(std::vector<gr_complex> constell,
444 std::vector<int> pre_diff_code,
445 unsigned int n_sectors);
450 unsigned int get_sector(
const gr_complex *sample);
452 unsigned int calc_sector_value(
unsigned int sector);
455 std::vector<int> pre_diff_code,
456 unsigned int n_sectors);
481 unsigned int decision_maker(
const gr_complex *sample);
513 unsigned int decision_maker(
const gr_complex *sample);
545 unsigned int decision_maker(
const gr_complex *sample);
579 unsigned int decision_maker(
const gr_complex *sample);