summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/dvb/dvb_bch_bb_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/dvb/dvb_bch_bb_impl.cc')
-rw-r--r--gr-dtv/lib/dvb/dvb_bch_bb_impl.cc112
1 files changed, 110 insertions, 2 deletions
diff --git a/gr-dtv/lib/dvb/dvb_bch_bb_impl.cc b/gr-dtv/lib/dvb/dvb_bch_bb_impl.cc
index f035750f3c..b1ebb6db79 100644
--- a/gr-dtv/lib/dvb/dvb_bch_bb_impl.cc
+++ b/gr-dtv/lib/dvb/dvb_bch_bb_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2015 Free Software Foundation, Inc.
+ * Copyright 2015,2016 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -100,6 +100,11 @@ namespace gr {
nbch = 58320;
bch_code = BCH_CODE_N8;
break;
+ case C2_9_VLSNR:
+ kbch = 14208;
+ nbch = 14400;
+ bch_code = BCH_CODE_N12;
+ break;
case C13_45:
kbch = 18528;
nbch = 18720;
@@ -222,7 +227,7 @@ namespace gr {
break;
}
}
- else {
+ else if (framesize == FECFRAME_SHORT) {
switch (rate) {
case C1_4:
kbch = 3072;
@@ -309,6 +314,55 @@ namespace gr {
nbch = 11520;
bch_code = BCH_CODE_S12;
break;
+ case C1_5_VLSNR_SF2:
+ kbch = 2512;
+ nbch = 2680;
+ bch_code = BCH_CODE_S12;
+ break;
+ case C11_45_VLSNR_SF2:
+ kbch = 3792;
+ nbch = 3960;
+ bch_code = BCH_CODE_S12;
+ break;
+ case C1_5_VLSNR:
+ kbch = 3072;
+ nbch = 3240;
+ bch_code = BCH_CODE_S12;
+ break;
+ case C4_15_VLSNR:
+ kbch = 4152;
+ nbch = 4320;
+ bch_code = BCH_CODE_S12;
+ break;
+ case C1_3_VLSNR:
+ kbch = 5232;
+ nbch = 5400;
+ bch_code = BCH_CODE_S12;
+ break;
+ default:
+ kbch = 0;
+ nbch = 0;
+ bch_code = 0;
+ break;
+ }
+ }
+ else {
+ switch (rate) {
+ case C1_5_MEDIUM:
+ kbch = 5660;
+ nbch = 5840;
+ bch_code = BCH_CODE_M12;
+ break;
+ case C11_45_MEDIUM:
+ kbch = 7740;
+ nbch = 7920;
+ bch_code = BCH_CODE_M12;
+ break;
+ case C1_3_MEDIUM:
+ kbch = 10620;
+ nbch = 10800;
+ bch_code = BCH_CODE_M12;
+ break;
default:
kbch = 0;
nbch = 0;
@@ -453,6 +507,20 @@ namespace gr {
const int polyn11[]={1,0,1,1,0,1,0,0,0,1,0,1,1,1,0,0,1};
const int polyn12[]={1,1,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1};
+ // Medium polynomials
+ const int polym01[]={1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1};
+ const int polym02[]={1,1,0,0,1,0,0,1,0,0,1,1,0,0,0,1};
+ const int polym03[]={1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1};
+ const int polym04[]={1,0,1,1,0,1,1,0,1,0,1,1,0,0,0,1};
+ const int polym05[]={1,1,1,0,1,0,1,1,0,0,1,0,1,0,0,1};
+ const int polym06[]={1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1};
+ const int polym07[]={1,0,1,0,1,1,0,1,0,0,0,1,1,0,1,1};
+ const int polym08[]={1,0,1,0,1,0,1,0,1,1,0,1,0,0,1,1};
+ const int polym09[]={1,1,1,0,1,1,0,1,0,1,0,1,1,1,0,1};
+ const int polym10[]={1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1};
+ const int polym11[]={1,1,1,0,1,0,0,0,0,1,0,1,0,0,0,1};
+ const int polym12[]={1,0,1,0,1,0,0,0,1,0,1,1,0,1,1,1};
+
// Short polynomials
const int polys01[]={1,1,0,1,0,1,0,0,0,0,0,0,0,0,1};
const int polys02[]={1,0,0,0,0,0,1,0,1,0,0,1,0,0,1};
@@ -499,6 +567,19 @@ namespace gr {
len = poly_mult(polys11, 15, polyout[0], len, polyout[1]);
len = poly_mult(polys12, 15, polyout[1], len, polyout[0]);
poly_pack(polyout[0], m_poly_s_12, 168);
+
+ len = poly_mult(polym01, 16, polym02, 16, polyout[0]);
+ len = poly_mult(polym03, 16, polyout[0], len, polyout[1]);
+ len = poly_mult(polym04, 16, polyout[1], len, polyout[0]);
+ len = poly_mult(polym05, 16, polyout[0], len, polyout[1]);
+ len = poly_mult(polym06, 16, polyout[1], len, polyout[0]);
+ len = poly_mult(polym07, 16, polyout[0], len, polyout[1]);
+ len = poly_mult(polym08, 16, polyout[1], len, polyout[0]);
+ len = poly_mult(polym09, 16, polyout[0], len, polyout[1]);
+ len = poly_mult(polym10, 16, polyout[1], len, polyout[0]);
+ len = poly_mult(polym11, 16, polyout[0], len, polyout[1]);
+ len = poly_mult(polym12, 16, polyout[1], len, polyout[0]);
+ poly_pack(polyout[0], m_poly_m_12, 180);
}
int
@@ -619,6 +700,33 @@ namespace gr {
}
}
break;
+ case BCH_CODE_M12:
+ for (int i = 0; i < noutput_items; i += nbch) {
+ //Zero the shift register
+ memset(shift, 0, sizeof(unsigned int) * 6);
+ // MSB of the codeword first
+ for (int j = 0; j < (int)kbch; j++) {
+ temp = *in++;
+ *out++ = temp;
+ consumed++;
+ b = (temp ^ ((shift[5] & 0x00001000) ? 1 : 0));
+ reg_6_shift(shift);
+ if (b) {
+ shift[0] ^= m_poly_m_12[0];
+ shift[1] ^= m_poly_m_12[1];
+ shift[2] ^= m_poly_m_12[2];
+ shift[3] ^= m_poly_m_12[3];
+ shift[4] ^= m_poly_m_12[4];
+ shift[5] ^= m_poly_m_12[5];
+ }
+ }
+ // Now add the parity bits to the output
+ for (int n = 0; n < 180; n++) {
+ *out++ = (shift[5] & 0x00001000) ? 1 : 0;
+ reg_6_shift(shift);
+ }
+ }
+ break;
}
// Tell runtime system how many input items we consumed on