summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc
diff options
context:
space:
mode:
authorRon Economos <w6rz@comcast.net>2016-06-24 15:23:55 -0700
committerRon Economos <w6rz@comcast.net>2016-06-24 15:23:55 -0700
commit7abec697352c4db9700b42a336774d63b6b62bab (patch)
treebe8c2c9120e1d660368d445878b39de0c78e02c9 /gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc
parent7a1403796abd4f9df1483482ce06b169a3212be8 (diff)
gr-dtv: Add DVB-S2X VL-SNR modulation and framing for AMSAT.
Diffstat (limited to 'gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc')
-rw-r--r--gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc64
1 files changed, 61 insertions, 3 deletions
diff --git a/gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc b/gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc
index 7abfbe3f79..35e2973647 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc
+++ b/gr-dtv/lib/dvbs2/dvbs2_interleaver_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
@@ -48,11 +48,35 @@ namespace gr {
code_rate = rate;
if (framesize == FECFRAME_NORMAL) {
frame_size = FRAME_SIZE_NORMAL;
+ if (rate == C2_9_VLSNR) {
+ frame_size = FRAME_SIZE_NORMAL - NORMAL_PUNCTURING;
+ }
}
- else {
+ else if (framesize == FECFRAME_SHORT) {
frame_size = FRAME_SIZE_SHORT;
+ if (rate == C1_5_VLSNR_SF2 || rate == C11_45_VLSNR_SF2) {
+ frame_size = FRAME_SIZE_SHORT - SHORT_PUNCTURING_SET1;
+ }
+ if (rate == C1_5_VLSNR || rate == C4_15_VLSNR || rate == C1_3_VLSNR) {
+ frame_size = FRAME_SIZE_SHORT - SHORT_PUNCTURING_SET2;
+ }
+ }
+ else {
+ frame_size = FRAME_SIZE_MEDIUM - MEDIUM_PUNCTURING;
}
switch (constellation) {
+ case MOD_BPSK:
+ mod = 1;
+ rows = frame_size / mod;
+ set_output_multiple(rows);
+ packed_items = rows;
+ break;
+ case MOD_BPSK_SF2:
+ mod = 1;
+ rows = frame_size / mod;
+ set_output_multiple(rows * 2);
+ packed_items = rows * 2;
+ break;
case MOD_QPSK:
mod = 2;
rows = frame_size / mod;
@@ -69,7 +93,7 @@ namespace gr {
rowaddr2 = 0;
}
/* 102 */
- else if (rate == C25_36 || rate == C13_18 || rate == C7_15 || rate == C8_15) {
+ else if (rate == C25_36 || rate == C13_18 || rate == C7_15 || rate == C8_15 || rate == C26_45) {
rowaddr0 = rows;
rowaddr1 = 0;
rowaddr2 = rows * 2;
@@ -156,6 +180,20 @@ namespace gr {
rowaddr2 = 0;
rowaddr3 = rows * 3;
}
+ /* 3210 */
+ else if (rate == C140_180) {
+ rowaddr0 = rows * 3;
+ rowaddr1 = rows * 2;
+ rowaddr2 = rows;
+ rowaddr3 = 0;
+ }
+ /* 0321 */
+ else if (rate == C154_180) {
+ rowaddr0 = 0;
+ rowaddr1 = rows * 3;
+ rowaddr2 = rows * 2;
+ rowaddr3 = rows;
+ }
/* 0123 */
else {
rowaddr0 = 0;
@@ -434,6 +472,9 @@ namespace gr {
if (signal_constellation == MOD_128APSK) {
ninput_items_required[0] = ((noutput_items / 9270) * 9258) * mod;
}
+ else if (signal_constellation == MOD_BPSK_SF2) {
+ ninput_items_required[0] = (noutput_items * mod) / 2;
+ }
else {
ninput_items_required[0] = noutput_items * mod;
}
@@ -452,6 +493,23 @@ namespace gr {
int rows;
switch (signal_constellation) {
+ case MOD_BPSK:
+ for (int i = 0; i < noutput_items; i += packed_items) {
+ rows = frame_size;
+ for (int j = 0; j < rows; j++) {
+ out[produced++] = in[consumed++];
+ }
+ }
+ break;
+ case MOD_BPSK_SF2:
+ for (int i = 0; i < noutput_items; i += packed_items) {
+ rows = frame_size;
+ for (int j = 0; j < rows; j++) {
+ out[produced++] = in[consumed];
+ out[produced++] = in[consumed++];
+ }
+ }
+ break;
case MOD_QPSK:
for (int i = 0; i < noutput_items; i += packed_items) {
rows = frame_size / 2;