105 void set_generators(
const itpp::ivec &in_gen,
const int &constraint_length);
120 const double &nonmatching_scaling_factor
183 const itpp::cvec &in_constellation,
184 const itpp::bmat &in_bin_constellation
187 const itpp::cvec &in_constellation,
188 const itpp::ivec &in_int_constellation
211 void rsc(itpp::vec &extrinsic_coded,
212 itpp::vec &extrinsic_data,
213 const itpp::vec &intrinsic_coded,
214 const itpp::vec &apriori_data
217 void rsc(itpp::vec &extrinsic_coded,
218 itpp::vec &extrinsic_data,
219 const itpp::vec &intrinsic_coded,
220 const itpp::vec &apriori_data,
224 void nsc(itpp::vec &extrinsic_coded,
225 itpp::vec &extrinsic_data,
226 const itpp::vec &intrinsic_coded,
227 const itpp::vec &apriori_data
230 void nsc(itpp::vec &extrinsic_coded,
231 itpp::vec &extrinsic_data,
232 const itpp::vec &intrinsic_coded,
233 const itpp::vec &apriori_data,
240 void equalizer(itpp::vec &extrinsic_data,
241 const itpp::vec &rec_sig,
242 const itpp::vec &apriori_data
248 void equalizer(itpp::vec &extrinsic_data,
249 const itpp::vec &rec_sig,
250 const itpp::vec &apriori_data,
255 itpp::vec &extrinsic_data,
256 const itpp::vec &intrinsic_coded,
257 const itpp::vec &apriori_data
260 void mud(itpp::mat &extrinsic_data,
261 const itpp::vec &rec_sig,
262 const itpp::mat &apriori_data
265 void demapper(itpp::vec &extrinsic_data,
266 const itpp::cvec &rec_sig,
267 const itpp::vec &apriori_data
270 void demapper(itpp::vec &extrinsic_data,
271 const itpp::cmat &rec_sig,
272 const itpp::vec &apriori_data
275 static double threshold(
const double &x,
const double &value);
276 static itpp::vec
threshold(
const itpp::vec &in,
const double &value);
277 static itpp::mat
threshold(
const itpp::mat &in,
const double &value);
280 void rsc_logMAP(itpp::vec &extrinsic_coded, itpp::vec &extrinsic_data,
281 const itpp::vec &intrinsic_coded,
const itpp::vec &apriori_data);
283 void rsc_maxlogMAP(itpp::vec &extrinsic_coded, itpp::vec &extrinsic_data,
284 const itpp::vec &intrinsic_coded,
const itpp::vec &apriori_data);
286 void rsc_sova(itpp::vec &extrinsic_data,
287 const itpp::vec &intrinsic_coded,
288 const itpp::vec &apriori_data,
292 void rsc_viterbi(itpp::vec &extrinsic_coded,
293 itpp::vec &extrinsic_data,
294 const itpp::vec &intrinsic_coded,
295 const itpp::vec &apriori_data,
299 void nsc_logMAP(itpp::vec &extrinsic_coded, itpp::vec &extrinsic_data,
300 const itpp::vec &intrinsic_coded,
const itpp::vec &apriori_data);
302 void nsc_maxlogMAP(itpp::vec &extrinsic_coded, itpp::vec &extrinsic_data,
303 const itpp::vec &intrinsic_coded,
const itpp::vec &apriori_data);
305 void equalizer_logMAP(itpp::vec &extrinsic_data,
const itpp::vec &rec_sig,
306 const itpp::vec &apriori_data);
308 void equalizer_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::vec &rec_sig,
309 const itpp::vec &apriori_data);
311 void mud_maxlogMAP(itpp::mat &extrinsic_data,
const itpp::vec &rec_sig,
312 const itpp::mat &apriori_data);
314 void mud_maxlogTMAP(itpp::mat &extrinsic_data,
const itpp::vec &rec_sig,
315 const itpp::mat &apriori_data,
const double &
threshold=-5);
317 void GCD(itpp::mat &extrinsic_data,
const itpp::vec &rec_sig,
318 const itpp::mat &apriori_data);
320 void sGCD(itpp::mat &extrinsic_data,
const itpp::vec &rec_sig,
321 const itpp::mat &apriori_data);
323 void Hassibi_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
324 const itpp::vec &apriori_data);
326 void GA(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
327 const itpp::vec &apriori_data);
329 void sGA(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
330 const itpp::vec &apriori_data);
332 void mmsePIC(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
333 const itpp::vec &apriori_data);
335 void zfPIC(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
336 const itpp::vec &apriori_data);
338 void Alamouti_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
339 const itpp::vec &apriori_data);
341 void demodulator_logMAP(itpp::vec &extrinsic_data,
const itpp::cvec &rec_sig,
342 const itpp::vec &apriori_data);
344 void demodulator_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::cvec &rec_sig,
345 const itpp::vec &apriori_data);
350 void print_err_msg(
const std::string &msg)
const;
354 struct ITPP_EXPORT MAP_Metrics
356 enum Type {Unknown, logMAP, maxlogMAP, SOVA, Viterbi};
357 MAP_Metrics() : _t(Unknown) {}
358 MAP_Metrics(Type t) : _t(t) {}
359 operator Type ()
const {
return _t;}
362 template<
typename T>
operator T ()
const;
364 MAP_Metrics MAP_metric;
375 double SOVA_scaling_factor;
377 double SOVA_threshold;
379 double Viterbi_scaling_factor[2];
381 bool Viterbi_hard_output_flag;
386 itpp::mat impulse_response;
388 itpp::cmat c_impulse_response;
390 itpp::bvec scrambler_pattern;
392 struct ITPP_EXPORT MUD_Methods
394 enum Type {Unknown, sGCD, maxlogMAP, GCD};
395 MUD_Methods() : _t(Unknown) {}
396 MUD_Methods(Type t) : _t(t) {}
397 operator Type ()
const {
return _t;}
400 template<
typename T>
operator T ()
const;
402 MUD_Methods MUD_method;
407 itpp::cvec constellation;
409 itpp::bmat bin_constellation;
424 struct ITPP_EXPORT Demapper_Methods
426 enum Type {Unknown, GA, Hassibi_maxlogMAP, sGA, mmsePIC, zfPIC, Alamouti_maxlogMAP};
427 Demapper_Methods() : _t(Unknown) {}
428 Demapper_Methods(Type t) : _t(t) {}
429 operator Type ()
const {
return _t;}
432 template<
typename T>
operator T ()
const;
434 Demapper_Methods demapper_method;
438 void zpFIRfilter(itpp::vec& filt,
443 void gen_chtrellis(
void);
445 void gen_hyperTrellis(
void);
457 void gen_rsctrellis(
void);
468 void gen_nsctrellis(
void);
479 void find_half_const(
int &select_half, itpp::vec &re_part,
480 itpp::bmat &re_bin_part, itpp::vec &im_part, itpp::bmat &im_bin_part);
482 void EquivRecSig(itpp::vec &x_eq,
const itpp::cmat &rec_sig);
484 void EquivCh(itpp::mat &H_eq,
const itpp::cvec &H);
486 void compute_symb_stats(itpp::vec &Es, itpp::vec &Vs,
487 int ns,
int select_half,
const itpp::vec &apriori_data,
488 const itpp::vec &re_part,
const itpp::vec &im_part,
489 const itpp::bmat &re_bin_part,
const itpp::bmat &im_bin_part);
490 static MAP_Metrics map_metric_from_string(
const std::string &in_MAP_metric);
491 static MUD_Methods mud_method_from_string(
const std::string &in_mud_method);
492 static Demapper_Methods demapper_method_from_string(
const std::string &in_dem_method);
858 const itpp::vec &apriori_data)
860 if (c_impulse_response.size()==0)
862 print_err_msg(
"SISO::demapper: channel impulse response not initialized");
865 if ((ST_gen1.size()==0) || (ST_gen2.size()==0))
867 print_err_msg(
"SISO::demapper: Space-Time generator polynomials not initialized");
870 if ((constellation.size()==0) || (bin_constellation.size()==0))
872 print_err_msg(
"SISO::demapper: constellation not initialized");
876 if (demapper_method==Demapper_Methods::Hassibi_maxlogMAP)
877 Hassibi_maxlogMAP(extrinsic_data, rec_sig, apriori_data);
878 else if (demapper_method==Demapper_Methods::GA)
879 GA(extrinsic_data, rec_sig, apriori_data);
880 else if (demapper_method==Demapper_Methods::sGA)
881 sGA(extrinsic_data, rec_sig, apriori_data);
882 else if (demapper_method==Demapper_Methods::mmsePIC)
883 mmsePIC(extrinsic_data, rec_sig, apriori_data);
884 else if (demapper_method==Demapper_Methods::zfPIC)
885 zfPIC(extrinsic_data, rec_sig, apriori_data);
886 else if (demapper_method==Demapper_Methods::Alamouti_maxlogMAP)
887 Alamouti_maxlogMAP(extrinsic_data, rec_sig, apriori_data);
889 print_err_msg(
"SISO::demapper: unknown demapper method. The demapper method should be either Hassibi_maxlogMAP, GA, sGA, mmsePIC, zfPIC or Alamouti_maxlogMAP");