summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/dvbt2/dvbt2_miso_cc_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/dvbt2/dvbt2_miso_cc_impl.cc')
-rw-r--r--gr-dtv/lib/dvbt2/dvbt2_miso_cc_impl.cc596
1 files changed, 596 insertions, 0 deletions
diff --git a/gr-dtv/lib/dvbt2/dvbt2_miso_cc_impl.cc b/gr-dtv/lib/dvbt2/dvbt2_miso_cc_impl.cc
new file mode 100644
index 0000000000..f8798064a9
--- /dev/null
+++ b/gr-dtv/lib/dvbt2/dvbt2_miso_cc_impl.cc
@@ -0,0 +1,596 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include "dvbt2_miso_cc_impl.h"
+
+namespace gr {
+ namespace dtv {
+
+ dvbt2_miso_cc::sptr
+ dvbt2_miso_cc::make(dvbt2_extended_carrier_t carriermode, dvbt2_fftsize_t fftsize, dvbt2_pilotpattern_t pilotpattern, dvbt2_guardinterval_t guardinterval, int numdatasyms, dvbt2_papr_t paprmode)
+ {
+ return gnuradio::get_initial_sptr
+ (new dvbt2_miso_cc_impl(carriermode, fftsize, pilotpattern, guardinterval, numdatasyms, paprmode));
+ }
+
+ /*
+ * The private constructor
+ */
+ dvbt2_miso_cc_impl::dvbt2_miso_cc_impl(dvbt2_extended_carrier_t carriermode, dvbt2_fftsize_t fftsize, dvbt2_pilotpattern_t pilotpattern, dvbt2_guardinterval_t guardinterval, int numdatasyms, dvbt2_papr_t paprmode)
+ : gr::sync_block("dvbt2_miso_cc",
+ gr::io_signature::make(1, 1, sizeof(gr_complex)),
+ gr::io_signature::make(2, 2, sizeof(gr_complex)))
+ {
+ switch (fftsize) {
+ case FFTSIZE_1K:
+ N_P2 = 16;
+ C_P2 = 546;
+ break;
+ case FFTSIZE_2K:
+ N_P2 = 8;
+ C_P2 = 1098;
+ break;
+ case FFTSIZE_4K:
+ N_P2 = 4;
+ C_P2 = 2198;
+ break;
+ case FFTSIZE_8K:
+ case FFTSIZE_8K_T2GI:
+ N_P2 = 2;
+ C_P2 = 4398;
+ break;
+ case FFTSIZE_16K:
+ case FFTSIZE_16K_T2GI:
+ N_P2 = 1;
+ C_P2 = 8814;
+ break;
+ case FFTSIZE_32K:
+ case FFTSIZE_32K_T2GI:
+ N_P2 = 1;
+ C_P2 = 17612;
+ break;
+ }
+ switch (fftsize) {
+ case FFTSIZE_1K:
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 764;
+ N_FC = 568;
+ C_FC = 402;
+ break;
+ case PILOT_PP2:
+ C_DATA = 768;
+ N_FC = 710;
+ C_FC = 654;
+ break;
+ case PILOT_PP3:
+ C_DATA = 798;
+ N_FC = 710;
+ C_FC = 490;
+ break;
+ case PILOT_PP4:
+ C_DATA = 804;
+ N_FC = 780;
+ C_FC = 707;
+ break;
+ case PILOT_PP5:
+ C_DATA = 818;
+ N_FC = 780;
+ C_FC = 544;
+ break;
+ case PILOT_PP6:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP7:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP8:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ if (paprmode == PAPR_TR || paprmode == PAPR_BOTH) {
+ if (C_DATA != 0) {
+ C_DATA -= 10;
+ }
+ if (N_FC != 0) {
+ N_FC -= 10;
+ }
+ if (C_FC != 0) {
+ C_FC -= 10;
+ }
+ }
+ break;
+ case FFTSIZE_2K:
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 1522;
+ N_FC = 1136;
+ C_FC = 804;
+ break;
+ case PILOT_PP2:
+ C_DATA = 1532;
+ N_FC = 1420;
+ C_FC = 1309;
+ break;
+ case PILOT_PP3:
+ C_DATA = 1596;
+ N_FC = 1420;
+ C_FC = 980;
+ break;
+ case PILOT_PP4:
+ C_DATA = 1602;
+ N_FC = 1562;
+ C_FC = 1415;
+ break;
+ case PILOT_PP5:
+ C_DATA = 1632;
+ N_FC = 1562;
+ C_FC = 1088;
+ break;
+ case PILOT_PP6:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP7:
+ C_DATA = 1646;
+ N_FC = 1632;
+ C_FC = 1396;
+ break;
+ case PILOT_PP8:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ if (paprmode == PAPR_TR || paprmode == PAPR_BOTH) {
+ if (C_DATA != 0) {
+ C_DATA -= 18;
+ }
+ if (N_FC != 0) {
+ N_FC -= 18;
+ }
+ if (C_FC != 0) {
+ C_FC -= 18;
+ }
+ }
+ break;
+ case FFTSIZE_4K:
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 3084;
+ N_FC = 2272;
+ C_FC = 1609;
+ break;
+ case PILOT_PP2:
+ C_DATA = 3092;
+ N_FC = 2840;
+ C_FC = 2619;
+ break;
+ case PILOT_PP3:
+ C_DATA = 3228;
+ N_FC = 2840;
+ C_FC = 1961;
+ break;
+ case PILOT_PP4:
+ C_DATA = 3234;
+ N_FC = 3124;
+ C_FC = 2831;
+ break;
+ case PILOT_PP5:
+ C_DATA = 3298;
+ N_FC = 3124;
+ C_FC = 2177;
+ break;
+ case PILOT_PP6:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP7:
+ C_DATA = 3328;
+ N_FC = 3266;
+ C_FC = 2792;
+ break;
+ case PILOT_PP8:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ if (paprmode == PAPR_TR || paprmode == PAPR_BOTH) {
+ if (C_DATA != 0) {
+ C_DATA -= 36;
+ }
+ if (N_FC != 0) {
+ N_FC -= 36;
+ }
+ if (C_FC != 0) {
+ C_FC -= 36;
+ }
+ }
+ break;
+ case FFTSIZE_8K:
+ case FFTSIZE_8K_T2GI:
+ if (carriermode == CARRIERS_NORMAL) {
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 6208;
+ N_FC = 4544;
+ C_FC = 3218;
+ break;
+ case PILOT_PP2:
+ C_DATA = 6214;
+ N_FC = 5680;
+ C_FC = 5238;
+ break;
+ case PILOT_PP3:
+ C_DATA = 6494;
+ N_FC = 5680;
+ C_FC = 3922;
+ break;
+ case PILOT_PP4:
+ C_DATA = 6498;
+ N_FC = 6248;
+ C_FC = 5662;
+ break;
+ case PILOT_PP5:
+ C_DATA = 6634;
+ N_FC = 6248;
+ C_FC = 4354;
+ break;
+ case PILOT_PP6:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP7:
+ C_DATA = 6698;
+ N_FC = 6532;
+ C_FC = 5585;
+ break;
+ case PILOT_PP8:
+ C_DATA = 6698;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ }
+ else {
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 6296;
+ N_FC = 4608;
+ C_FC = 3264;
+ break;
+ case PILOT_PP2:
+ C_DATA = 6298;
+ N_FC = 5760;
+ C_FC = 5312;
+ break;
+ case PILOT_PP3:
+ C_DATA = 6584;
+ N_FC = 5760;
+ C_FC = 3978;
+ break;
+ case PILOT_PP4:
+ C_DATA = 6588;
+ N_FC = 6336;
+ C_FC = 5742;
+ break;
+ case PILOT_PP5:
+ C_DATA = 6728;
+ N_FC = 6336;
+ C_FC = 4416;
+ break;
+ case PILOT_PP6:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP7:
+ C_DATA = 6788;
+ N_FC = 6624;
+ C_FC = 5664;
+ break;
+ case PILOT_PP8:
+ C_DATA = 6788;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ }
+ if (paprmode == PAPR_TR || paprmode == PAPR_BOTH) {
+ if (C_DATA != 0) {
+ C_DATA -= 72;
+ }
+ if (N_FC != 0) {
+ N_FC -= 72;
+ }
+ if (C_FC != 0) {
+ C_FC -= 72;
+ }
+ }
+ break;
+ case FFTSIZE_16K:
+ case FFTSIZE_16K_T2GI:
+ if (carriermode == CARRIERS_NORMAL) {
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 12418;
+ N_FC = 9088;
+ C_FC = 6437;
+ break;
+ case PILOT_PP2:
+ C_DATA = 12436;
+ N_FC = 11360;
+ C_FC = 10476;
+ break;
+ case PILOT_PP3:
+ C_DATA = 12988;
+ N_FC = 11360;
+ C_FC = 7845;
+ break;
+ case PILOT_PP4:
+ C_DATA = 13002;
+ N_FC = 12496;
+ C_FC = 11324;
+ break;
+ case PILOT_PP5:
+ C_DATA = 13272;
+ N_FC = 12496;
+ C_FC = 8709;
+ break;
+ case PILOT_PP6:
+ C_DATA = 13288;
+ N_FC = 13064;
+ C_FC = 11801;
+ break;
+ case PILOT_PP7:
+ C_DATA = 13416;
+ N_FC = 13064;
+ C_FC = 11170;
+ break;
+ case PILOT_PP8:
+ C_DATA = 13406;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ }
+ else {
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 12678;
+ N_FC = 9280;
+ C_FC = 6573;
+ break;
+ case PILOT_PP2:
+ C_DATA = 12698;
+ N_FC = 11600;
+ C_FC = 10697;
+ break;
+ case PILOT_PP3:
+ C_DATA = 13262;
+ N_FC = 11600;
+ C_FC = 8011;
+ break;
+ case PILOT_PP4:
+ C_DATA = 13276;
+ N_FC = 12760;
+ C_FC = 11563;
+ break;
+ case PILOT_PP5:
+ C_DATA = 13552;
+ N_FC = 12760;
+ C_FC = 8893;
+ break;
+ case PILOT_PP6:
+ C_DATA = 13568;
+ N_FC = 13340;
+ C_FC = 12051;
+ break;
+ case PILOT_PP7:
+ C_DATA = 13698;
+ N_FC = 13340;
+ C_FC = 11406;
+ break;
+ case PILOT_PP8:
+ C_DATA = 13688;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ }
+ if (paprmode == PAPR_TR || paprmode == PAPR_BOTH) {
+ if (C_DATA != 0) {
+ C_DATA -= 144;
+ }
+ if (N_FC != 0) {
+ N_FC -= 144;
+ }
+ if (C_FC != 0) {
+ C_FC -= 144;
+ }
+ }
+ break;
+ case FFTSIZE_32K:
+ case FFTSIZE_32K_T2GI:
+ if (carriermode == CARRIERS_NORMAL) {
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP2:
+ C_DATA = 24886;
+ N_FC = 22720;
+ C_FC = 20952;
+ break;
+ case PILOT_PP3:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP4:
+ C_DATA = 26022;
+ N_FC = 24992;
+ C_FC = 22649;
+ break;
+ case PILOT_PP5:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP6:
+ C_DATA = 26592;
+ N_FC = 26128;
+ C_FC = 23603;
+ break;
+ case PILOT_PP7:
+ C_DATA = 26836;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP8:
+ C_DATA = 26812;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ }
+ else {
+ switch (pilotpattern) {
+ case PILOT_PP1:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP2:
+ C_DATA = 25412;
+ N_FC = 23200;
+ C_FC = 21395;
+ break;
+ case PILOT_PP3:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP4:
+ C_DATA = 26572;
+ N_FC = 25520;
+ C_FC = 23127;
+ break;
+ case PILOT_PP5:
+ C_DATA = 0;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP6:
+ C_DATA = 27152;
+ N_FC = 26680;
+ C_FC = 24102;
+ break;
+ case PILOT_PP7:
+ C_DATA = 27404;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ case PILOT_PP8:
+ C_DATA = 27376;
+ N_FC = 0;
+ C_FC = 0;
+ break;
+ }
+ }
+ if (paprmode == PAPR_TR || paprmode == PAPR_BOTH) {
+ if (C_DATA != 0) {
+ C_DATA -= 288;
+ }
+ if (N_FC != 0) {
+ N_FC -= 288;
+ }
+ if (C_FC != 0) {
+ C_FC -= 288;
+ }
+ }
+ break;
+ }
+ if (N_FC == 0) {
+ set_output_multiple((N_P2 * C_P2) + (numdatasyms * C_DATA));
+ miso_items = (N_P2 * C_P2) + (numdatasyms * C_DATA);
+ }
+ else {
+ set_output_multiple((N_P2 * C_P2) + ((numdatasyms - 1) * C_DATA) + N_FC);
+ miso_items = (N_P2 * C_P2) + ((numdatasyms - 1) * C_DATA) + N_FC;
+ }
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ dvbt2_miso_cc_impl::~dvbt2_miso_cc_impl()
+ {
+ }
+
+ int
+ dvbt2_miso_cc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const gr_complex *in = (const gr_complex *) input_items[0];
+ gr_complex *out1 = (gr_complex *) output_items[0];
+ gr_complex *out2 = (gr_complex *) output_items[1];
+ gr_complex temp1, temp2;
+
+ for (int i = 0; i < noutput_items; i += miso_items) {
+ memcpy(out1, in, sizeof(gr_complex) * miso_items);
+ out1 += miso_items;
+ for (int j = 0; j < miso_items; j += 2) {
+ temp1 = *in++;
+ temp2 = *in++;
+ out2->real() = -temp2.real();
+ out2->imag() = temp2.imag();
+ out2++;
+ out2->real() = temp1.real();
+ out2->imag() = -temp1.imag();
+ out2++;
+ }
+ }
+
+ // Tell runtime system how many output items we produced.
+ return noutput_items;
+ }
+
+ } /* namespace dtv */
+} /* namespace gr */
+