32 #define INFINITY std::numeric_limits<double>::infinity()
37 void SISO::find_half_const(
int &select_half, itpp::vec &re_part,
itpp::bmat &re_bin_part, itpp::vec &im_part,
itpp::bmat &im_bin_part)
45 int half_nb_bits_symb = nb_bits_symb/2;
49 re_part.set_size(half_len);
50 re_bin_part.set_size(half_len, half_nb_bits_symb);
52 re_part(0) = constellation(0).real();
53 im_part.set_size(half_len);
54 im_bin_part.set_size(half_len, half_nb_bits_symb);
56 im_part(0) = constellation(0).imag();
60 print_err_msg(
"SISO::find_half_const: number of bits per symbol must be a multiple of two");
63 const double min_diff = 1e-3;
65 if (idx.length()!=half_len)
67 print_err_msg(
"SISO::find_half_const: the constellation must be quadratic");
70 itpp::bvec temp(nb_bits_symb);
74 temp = bin_constellation.get_row(idx(n));
75 re_bin_part.set_row(n,temp(0,half_nb_bits_symb-1));
77 select_half = (re_bin_part.get_row(0)==re_bin_part.get_row(1))?0:1;
80 temp = bin_constellation.get_row(0);
81 re_bin_part.set_row(0,temp(select_half*half_nb_bits_symb,(1+select_half)*half_nb_bits_symb-1));
82 im_bin_part.set_row(0,temp((1-select_half)*half_nb_bits_symb,(2-select_half)*half_nb_bits_symb-1));
85 for (n=1; n<const_size; n++)
87 temp = bin_constellation.get_row(n);
88 buffer = constellation(n).real();
92 re_part(re_idx) = buffer;
93 re_bin_part.set_row(re_idx, temp(select_half*half_nb_bits_symb,(1+select_half)*half_nb_bits_symb-1));
95 buffer = constellation(n).imag();
99 im_part(im_idx) = buffer;
100 im_bin_part.set_row(im_idx, temp((1-select_half)*half_nb_bits_symb,(2-select_half)*half_nb_bits_symb-1));
105 void SISO::EquivRecSig(itpp::vec &x_eq,
const itpp::cmat &rec_sig)
113 for (
int k=0; k<nb_rec_ant; k++)
115 x_eq.set_subvector(k*2*block_duration,
itpp::real(rec_sig.get_col(k)));
116 x_eq.set_subvector(k*2*block_duration+block_duration,
itpp::imag(rec_sig.get_col(k)));
120 void SISO::EquivCh(itpp::mat &H_eq,
const itpp::cvec &H)
127 itpp::mat Aq(2*block_duration,2*nb_em_ant);
128 itpp::mat Bq(2*block_duration,2*nb_em_ant);
129 itpp::cmat temp(block_duration,nb_em_ant);
130 itpp::vec h(2*nb_em_ant);
131 itpp::mat AhBh(2*block_duration,2);
133 for (k=0; k<symbols_block; k++)
135 temp = ST_gen1.get(k*block_duration,k*block_duration+block_duration-1,0,nb_em_ant-1);
137 Aq.set_submatrix(0, nb_em_ant, -
itpp::imag(temp));
138 Aq.set_submatrix(block_duration, 0,
itpp::imag(temp));
139 Aq.set_submatrix(block_duration, nb_em_ant,
itpp::real(temp));
140 temp = ST_gen2.get(k*block_duration,k*block_duration+block_duration-1,0,nb_em_ant-1);
142 Bq.set_submatrix(0, nb_em_ant, -
itpp::real(temp));
143 Bq.set_submatrix(block_duration, 0,
itpp::real(temp));
144 Bq.set_submatrix(block_duration, nb_em_ant, -
itpp::imag(temp));
145 for (n=0; n<nb_rec_ant; n++)
147 h.set_subvector(0,
real(H.mid(n*nb_em_ant,nb_em_ant)));
148 h.set_subvector(nb_em_ant,
imag(H.mid(n*nb_em_ant,nb_em_ant)));
149 AhBh.set_col(0, Aq*h);
150 AhBh.set_col(1, Bq*h);
151 H_eq.set_submatrix(2*block_duration*n, 2*k, AhBh);
156 void SISO::Hassibi_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
const itpp::vec &apriori_data)
160 int nb_subblocks = rec_sig.rows()/block_duration;
161 double N0 = 2*sigma2;
162 int nb_all_symb =
itpp::pow2i(nb_bits_symb*symbols_block);
164 itpp::bvec bin_frame(nb_bits_symb*symbols_block);
165 itpp::bmat mat_bin_frame(nb_bits_symb, symbols_block);
166 itpp::vec symb_frame_eq(2*symbols_block);
168 itpp::mat H_eq(2*nb_rec_ant*block_duration,2*symbols_block);
169 itpp::vec x_eq(2*block_duration*nb_rec_ant);
170 register int ns,q,nb,n,k;
172 extrinsic_data.set_size(nb_bits_symb*nb_subblocks*symbols_block);
174 for (ns=0; ns<nb_subblocks; ns++)
177 EquivCh(H_eq, c_impulse_response.get_col(ns));
179 EquivRecSig(x_eq, rec_sig(ns*block_duration,(ns+1)*block_duration-1,0,nb_rec_ant-1));
181 for (q=0; q<symbols_block; q++)
183 for (nb=0; nb<nb_bits_symb; nb++)
187 for (n=0; n<nb_all_symb; n++)
190 mat_bin_frame =
itpp::reshape(bin_frame, nb_bits_symb, symbols_block);
191 for (k=0; k<symbols_block; k++)
193 symb_frame_eq(2*k) = constellation(
itpp::bin2dec(mat_bin_frame.get_col(k))).real();
194 symb_frame_eq(1+2*k) = constellation(
itpp::bin2dec(mat_bin_frame.get_col(k))).imag();
197 itpp::to_vec(bin_frame)*apriori_data.mid(ns*nb_bits_symb*symbols_block,nb_bits_symb*symbols_block);
198 if (bin_frame(nb+q*nb_bits_symb))
203 index = nb+q*nb_bits_symb+ns*nb_bits_symb*symbols_block;
204 extrinsic_data(index) = (nom-denom)-apriori_data(index);
210 void SISO::GA(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
const itpp::vec &apriori_data)
214 int nb_subblocks = rec_sig.rows()/block_duration;
215 int half_nb_bits_symb = nb_bits_symb/2;
224 find_half_const(select_half, re_part, re_bin_part, im_part, im_bin_part);
227 itpp::mat H_eq(2*nb_rec_ant*block_duration,2*symbols_block);
228 itpp::vec E_re_s(symbols_block);
229 itpp::vec E_im_s(symbols_block);
230 itpp::vec Var_re_s(symbols_block);
231 itpp::vec Var_im_s(symbols_block);
232 itpp::vec Ey(2*block_duration*nb_rec_ant);
233 itpp::mat Cy(2*block_duration*nb_rec_ant,2*block_duration*nb_rec_ant);
234 itpp::mat Cy_inv(2*block_duration*nb_rec_ant,2*block_duration*nb_rec_ant);
235 itpp::vec x_eq(2*block_duration*nb_rec_ant);
236 itpp::vec EZeta(2*block_duration*nb_rec_ant);
237 itpp::mat CZeta_inv(2*block_duration*nb_rec_ant,2*block_duration*nb_rec_ant);
240 register int ns,q,k,p,cs;
242 extrinsic_data.set_size(nb_bits_symb*nb_subblocks*symbols_block);
243 for (ns=0; ns<nb_subblocks; ns++)
250 for (q=0; q<symbols_block; q++)
252 index = q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
253 for (k=0; k<half_len; k++)
256 apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))),\
257 1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))));
259 apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))),\
260 1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))));
262 apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))),\
263 1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))));
265 apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))),\
266 1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))));
273 EquivCh(H_eq, c_impulse_response.get_col(ns));
277 Cy = sigma2*
itpp::eye(2*block_duration*nb_rec_ant);
278 for (q=0; q<symbols_block; q++)
281 Ey += (H_eq.get_col(2*q)*E_re_s(q)+H_eq.get_col(1+2*q)*E_im_s(q));
290 EquivRecSig(x_eq, rec_sig(ns*block_duration,(ns+1)*block_duration-1,0,nb_rec_ant-1));
293 for (q=0; q<symbols_block; q++)
296 EZeta = Ey-H_eq.get_col(2*q)*E_re_s(q);
298 ((Var_re_s(q)/(1-(((H_eq.get_col(2*q)).
transpose()*Cy_inv)*(H_eq.get_col(2*q)*Var_re_s(q)))(0)))*\
299 H_eq.get_col(2*q)), Cy_inv.transpose()*H_eq.get_col(2*q));
300 index = select_half*half_nb_bits_symb+q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
301 for (p=0; p<half_nb_bits_symb; p++)
305 for (cs=0; cs<half_len; cs++)
307 temp = -0.5*((x_eq-H_eq.get_col(2*q)*re_part(cs)-EZeta).
transpose()*CZeta_inv*(x_eq-H_eq.get_col(2*q)*re_part(cs)-EZeta))(0)+\
308 itpp::to_vec(re_bin_part.get_row(cs))*apriori_data.mid(index,half_nb_bits_symb);
309 if (re_bin_part(cs,p))
314 extrinsic_data(index+p) = (nom-denom)-apriori_data(index+p);
317 EZeta = Ey-H_eq.get_col(1+2*q)*E_im_s(q);
319 ((Var_im_s(q)/(1-(((H_eq.get_col(1+2*q)).
transpose()*Cy_inv)*(H_eq.get_col(1+2*q)*Var_im_s(q)))(0)))*\
320 H_eq.get_col(1+2*q)), Cy_inv.transpose()*H_eq.get_col(1+2*q));
321 index = (1-select_half)*half_nb_bits_symb+q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
322 for (p=0; p<half_nb_bits_symb; p++)
326 for (cs=0; cs<half_len; cs++)
328 temp = -0.5*((x_eq-H_eq.get_col(1+2*q)*im_part(cs)-EZeta).
transpose()*CZeta_inv*(x_eq-H_eq.get_col(1+2*q)*im_part(cs)-EZeta))(0)+\
329 itpp::to_vec(im_bin_part.get_row(cs))*apriori_data.mid(index,half_nb_bits_symb);
330 if (im_bin_part(cs,p))
335 extrinsic_data(index+p) = (nom-denom)-apriori_data(index+p);
341 void SISO::sGA(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
const itpp::vec &apriori_data)
345 int nb_subblocks = (int)(rec_sig.rows()/block_duration);
346 int half_nb_bits_symb = (int)(nb_bits_symb/2);
355 find_half_const(select_half, re_part, re_bin_part, im_part, im_bin_part);
358 itpp::mat H_eq(2*nb_rec_ant*block_duration,2*symbols_block);
360 itpp::vec E_re_s(symbols_block);
361 itpp::vec E_im_s(symbols_block);
362 itpp::vec Var_re_s(symbols_block);
363 itpp::vec Var_im_s(symbols_block);
364 itpp::vec Ey(2*block_duration*nb_rec_ant);
365 itpp::mat Cy(2*block_duration*nb_rec_ant,2*block_duration*nb_rec_ant);
366 itpp::vec x_eq(2*block_duration*nb_rec_ant);
367 itpp::vec EZeta(2*block_duration*nb_rec_ant);
368 itpp::vec CZeta(2*block_duration*nb_rec_ant);
371 register int ns,q,k,p,cs;
373 extrinsic_data.set_size(nb_bits_symb*nb_subblocks*symbols_block);
374 for (ns=0; ns<nb_subblocks; ns++)
381 for (q=0; q<symbols_block; q++)
383 index = q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
384 for (k=0; k<half_len; k++)
387 apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))),\
388 1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))));
390 apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))),\
391 1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))));
393 apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))),\
394 1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index,half_nb_bits_symb))));
396 apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))),\
397 1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index,half_nb_bits_symb))));
404 EquivCh(H_eq, c_impulse_response.get_col(ns));
408 Cy = sigma2*
itpp::eye(2*block_duration*nb_rec_ant);
409 for (q=0; q<symbols_block; q++)
412 Ey += (H_eq.get_col(2*q)*E_re_s(q)+H_eq.get_col(1+2*q)*E_im_s(q));
418 EquivRecSig(x_eq, rec_sig(ns*block_duration,(ns+1)*block_duration-1,0,nb_rec_ant-1));
421 for (q=0; q<symbols_block; q++)
424 EZeta = Ey-H_eq.get_col(2*q)*E_re_s(q);
426 index = select_half*half_nb_bits_symb+q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
427 for (p=0; p<half_nb_bits_symb; p++)
431 for (cs=0; cs<half_len; cs++)
434 itpp::to_vec(re_bin_part.get_row(cs))*apriori_data.mid(index,half_nb_bits_symb);
435 if (re_bin_part(cs,p))
440 extrinsic_data(index+p) = (nom-denom)-apriori_data(index+p);
443 EZeta = Ey-H_eq.get_col(1+2*q)*E_im_s(q);
445 index = (1-select_half)*half_nb_bits_symb+q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
446 for (p=0; p<half_nb_bits_symb; p++)
450 for (cs=0; cs<half_len; cs++)
453 itpp::to_vec(im_bin_part.get_row(cs))*apriori_data.mid(index,half_nb_bits_symb);
454 if (im_bin_part(cs,p))
459 extrinsic_data(index+p) = (nom-denom)-apriori_data(index+p);
465 void SISO::mmsePIC(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
const itpp::vec &apriori_data)
469 int nb_subblocks = rec_sig.rows()/block_duration;
470 int half_nb_bits_symb = nb_bits_symb/2;
471 int half_const_len =
itpp::pow2i(half_nb_bits_symb);
472 int nb_bits_subblock = nb_bits_symb*symbols_block;
473 itpp::vec Es(2*symbols_block);
474 itpp::vec Vs(2*symbols_block);
475 itpp::mat H_eq(2*nb_rec_ant*block_duration,2*symbols_block);
476 itpp::mat K(2*nb_rec_ant*block_duration,2*nb_rec_ant*block_duration);
477 itpp::mat K_inv(2*nb_rec_ant*block_duration,2*nb_rec_ant*block_duration);
478 itpp::vec x_eq(2*nb_rec_ant*block_duration);
479 itpp::vec interf(2*symbols_block);
480 itpp::vec temp(2*nb_rec_ant*block_duration);
481 itpp::vec w(2*nb_rec_ant*block_duration);
487 register int ns,q,k,s;
496 find_half_const(select_half, re_part, re_bin_part, im_part, im_bin_part);
497 double part_var = 1/(double)(2*nb_em_ant);
499 extrinsic_data.set_size(nb_bits_symb*nb_subblocks*symbols_block);
500 for (ns=0; ns<nb_subblocks; ns++)
505 for (q=0; q<symbols_block; q++)
507 index = q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
508 for (k=0; k<half_const_len; k++)
511 apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb))), \
512 (1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb)))));
514 apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb))), \
515 (1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb)))));
517 apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb))), \
518 (1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb)))));
520 apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb))), \
521 (1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb)))));
528 EquivCh(H_eq, c_impulse_response.get_col(ns));
533 EquivRecSig(x_eq, rec_sig(ns*block_duration,(ns+1)*block_duration-1,0,nb_rec_ant-1));
534 for (q=0; q<symbols_block; q++)
541 temp = H_eq.get_col(2*q);
543 (1+((temp.transpose()*K_inv)*(temp*(part_var-Vs(2*q))))(0)))*temp), K_inv.transpose()*temp));
544 s_tilde = w*(x_eq-H_eq*interf);
546 index = select_half*half_nb_bits_symb+nb_bits_symb*q+ns*nb_bits_subblock;
547 for (k=0; k<half_nb_bits_symb; k++)
551 for (s=0; s<half_const_len; s++)
554 tmp = -
itpp::sqr(s_tilde-mu_res*re_part(s))/(2*sigma2_res)+ \
555 itpp::to_vec(re_bin_part.get_row(s))*apriori_data.mid(index, half_nb_bits_symb);
556 if (re_bin_part(s,k))
561 extrinsic_data(index+k) = (nom-denom)-apriori_data(index+k);
568 temp = H_eq.get_col(2*q+1);
570 (1+((temp.transpose()*K_inv)*(temp*(part_var-Vs(1+2*q))))(0)))*temp), K_inv.transpose()*temp));
571 s_tilde = w*(x_eq-H_eq*interf);
573 index = (1-select_half)*half_nb_bits_symb+nb_bits_symb*q+ns*nb_bits_subblock;
574 for (k=0; k<half_nb_bits_symb; k++)
578 for (s=0; s<half_const_len; s++)
581 tmp = -
itpp::sqr(s_tilde-mu_res*im_part(s))/(2*sigma2_res)+ \
582 itpp::to_vec(im_bin_part.get_row(s))*apriori_data.mid(index, half_nb_bits_symb);
583 if (im_bin_part(s,k))
588 extrinsic_data(index+k) = (nom-denom)-apriori_data(index+k);
595 void SISO::zfPIC(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
const itpp::vec &apriori_data)
599 int nb_subblocks = rec_sig.rows()/block_duration;
600 int half_nb_bits_symb = nb_bits_symb/2;
601 int half_const_len =
itpp::pow2i(half_nb_bits_symb);
602 int nb_bits_subblock = nb_bits_symb*symbols_block;
603 itpp::vec Es(2*symbols_block);
604 itpp::vec Vs(2*symbols_block);
605 itpp::mat H_eq(2*nb_rec_ant*block_duration,2*symbols_block);
606 itpp::mat K(2*nb_rec_ant*block_duration,2*nb_rec_ant*block_duration);
607 itpp::vec x_eq(2*nb_rec_ant*block_duration);
608 itpp::vec interf(2*symbols_block);
609 itpp::vec temp(2*nb_rec_ant*block_duration);
610 itpp::vec w(2*nb_rec_ant*block_duration);
616 register int ns,q,k,s;
625 find_half_const(select_half, re_part, re_bin_part, im_part, im_bin_part);
627 extrinsic_data.set_size(nb_bits_symb*nb_subblocks*symbols_block);
628 for (ns=0; ns<nb_subblocks; ns++)
633 for (q=0; q<symbols_block; q++)
635 index = q*nb_bits_symb+ns*symbols_block*nb_bits_symb;
636 for (k=0; k<half_const_len; k++)
639 apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb))), \
640 (1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb)))));
642 apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb))), \
643 (1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb)))));
645 apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb))), \
646 (1+
exp(apriori_data.mid(select_half*half_nb_bits_symb+index, half_nb_bits_symb)))));
648 apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb))), \
649 (1+
exp(apriori_data.mid((1-select_half)*half_nb_bits_symb+index, half_nb_bits_symb)))));
656 EquivCh(H_eq, c_impulse_response.get_col(ns));
660 EquivRecSig(x_eq, rec_sig(ns*block_duration,(ns+1)*block_duration-1,0,nb_rec_ant-1));
661 for (q=0; q<symbols_block; q++)
668 temp = H_eq.get_col(2*q);
669 w = temp/(temp*temp);
670 s_tilde = w*(x_eq-H_eq*interf);
672 index = select_half*half_nb_bits_symb+nb_bits_symb*q+ns*nb_bits_subblock;
673 for (k=0; k<half_nb_bits_symb; k++)
677 for (s=0; s<half_const_len; s++)
680 tmp = -
itpp::sqr(s_tilde-mu_res*re_part(s))/(2*sigma2_res)+ \
681 itpp::to_vec(re_bin_part.get_row(s))*apriori_data.mid(index, half_nb_bits_symb);
682 if (re_bin_part(s,k))
687 extrinsic_data(index+k) = (nom-denom)-apriori_data(index+k);
694 temp = H_eq.get_col(2*q+1);
695 w = temp/(temp*temp);
696 s_tilde = w*(x_eq-H_eq*interf);
698 index = (1-select_half)*half_nb_bits_symb+nb_bits_symb*q+ns*nb_bits_subblock;
699 for (k=0; k<half_nb_bits_symb; k++)
703 for (s=0; s<half_const_len; s++)
706 tmp = -
itpp::sqr(s_tilde-mu_res*im_part(s))/(2*sigma2_res)+ \
707 itpp::to_vec(im_bin_part.get_row(s))*apriori_data.mid(index, half_nb_bits_symb);
708 if (im_bin_part(s,k))
713 extrinsic_data(index+k) = (nom-denom)-apriori_data(index+k);
720 void SISO::Alamouti_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::cmat &rec_sig,
const itpp::vec &apriori_data)
724 int int_len = apriori_data.length();
725 int nb_symb = (int)(int_len/nb_bits_symb);
726 itpp::cvec comb_sig(nb_symb);
728 itpp::cmat conj_H =
itpp::conj(c_impulse_response);
730 register int nr,n,cs;
731 for (nr=0; nr<nb_rec_ant; nr++)
733 for (n=0; n<(nb_symb/2); n++)
735 comb_sig(2*n) += (conj_H(2*nr,n)*rec_sig(2*n,nr)+c_impulse_response(1+2*nr,n)*conj_X(1+2*n,nr));
736 comb_sig(1+2*n) += (conj_H(1+2*nr,n)*rec_sig(2*n,nr)-c_impulse_response(2*nr,n)*conj_X(1+2*n,nr));
746 extrinsic_data.set_size(nb_bits_symb*nb_symb);
747 for (n=0; n<nb_symb; n++)
750 for (nr=0; nr<nb_bits_symb; nr++)
754 for (cs=0; cs<const_size; cs++)
756 temp = -
itpp::sqr(comb_sig(n)-buffer*constellation(cs))/(2*buffer*sigma2)+ \
757 itpp::to_vec(bin_constellation.get_row(cs))*apriori_data.mid(n*nb_bits_symb, nb_bits_symb);
758 if (bin_constellation(cs,nr))
763 index = n*nb_bits_symb+nr;
764 extrinsic_data(index) = (nom-denom)-apriori_data(index);
769 void SISO::demodulator_logMAP(itpp::vec &extrinsic_data,
const itpp::cvec &rec_sig,
const itpp::vec &apriori_data)
772 int nb_symb = rec_sig.length();
774 double nom,denom,temp;
777 extrinsic_data.set_size(nb_bits_symb*nb_symb);
778 for (k=0; k<nb_symb; k++)
780 for (i=0; i<nb_bits_symb; i++)
784 for (cs=0; cs<const_size; cs++)
786 temp = -
itpp::sqr(rec_sig(k)-c_impulse_response(0,k)*constellation(cs))/(2*sigma2)+\
787 itpp::to_vec(bin_constellation.get_row(cs))*apriori_data.mid(k*nb_bits_symb, nb_bits_symb);
788 if (bin_constellation(cs,i))
793 index = k*nb_bits_symb+i;
794 extrinsic_data(index) =
std::log(nom/denom)-apriori_data(index);
799 void SISO::demodulator_maxlogMAP(itpp::vec &extrinsic_data,
const itpp::cvec &rec_sig,
const itpp::vec &apriori_data)
802 int nb_symb = rec_sig.length();
804 double nom,denom,temp;
807 extrinsic_data.set_size(nb_bits_symb*nb_symb);
808 for (k=0; k<nb_symb; k++)
810 for (i=0; i<nb_bits_symb; i++)
814 for (cs=0; cs<const_size; cs++)
816 temp = -
itpp::sqr(rec_sig(k)-c_impulse_response(0,k)*constellation(cs))/(2*sigma2)+\
817 itpp::to_vec(bin_constellation.get_row(cs))*apriori_data.mid(k*nb_bits_symb, nb_bits_symb);
818 if (bin_constellation(cs,i))
823 index = k*nb_bits_symb+i;
824 extrinsic_data(index) = (nom-denom)-apriori_data(index);