[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] [gnuradio] 03/08: gr-dtv: Add DVB-S2X VL-SNR modulatio
From: |
git |
Subject: |
[Commit-gnuradio] [gnuradio] 03/08: gr-dtv: Add DVB-S2X VL-SNR modulation and framing for AMSAT. |
Date: |
Sat, 25 Jun 2016 19:08:00 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script.
jcorgan pushed a commit to branch master
in repository gnuradio.
commit 7abec697352c4db9700b42a336774d63b6b62bab
Author: Ron Economos <address@hidden>
Date: Fri Jun 24 15:23:55 2016 -0700
gr-dtv: Add DVB-S2X VL-SNR modulation and framing for AMSAT.
---
gr-dtv/examples/dvbs2_tx.grc | 108 +++-
gr-dtv/grc/dtv_dvb_bbheader_bb.xml | 10 +-
gr-dtv/grc/dtv_dvb_bbscrambler_bb.xml | 10 +-
gr-dtv/grc/dtv_dvb_bch_bb.xml | 10 +-
gr-dtv/grc/dtv_dvb_ldpc_bb.xml | 10 +-
gr-dtv/grc/dtv_dvbs2_interleaver_bb.xml | 245 +++++++-
gr-dtv/grc/dtv_dvbs2_modulator_bc.xml | 204 +++++-
gr-dtv/grc/dtv_dvbs2_physical_cc.xml | 151 ++++-
gr-dtv/include/gnuradio/dtv/dvb_config.h | 2 +
gr-dtv/lib/dvb/dvb_defines.h | 12 +
gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc | 42 +-
gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc | 64 +-
gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc | 21 +
gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h | 3 +-
gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc | 872 ++++++++++++++++++++++++--
gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.h | 11 +-
16 files changed, 1628 insertions(+), 147 deletions(-)
diff --git a/gr-dtv/examples/dvbs2_tx.grc b/gr-dtv/examples/dvbs2_tx.grc
index c6de308..99c797d 100644
--- a/gr-dtv/examples/dvbs2_tx.grc
+++ b/gr-dtv/examples/dvbs2_tx.grc
@@ -244,7 +244,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(784, 547)</value>
+ <value>(776, 548)</value>
</param>
<param>
<key>_rotation</key>
@@ -291,7 +291,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(176, 43)</value>
+ <value>(176, 36)</value>
</param>
<param>
<key>_rotation</key>
@@ -326,7 +326,7 @@
<key>dtv_dvb_bbheader_bb</key>
<param>
<key>mode</key>
- <value>FECFRAME_NORMAL</value>
+ <value>INPUTMODE_NORMAL</value>
</param>
<param>
<key>alias</key>
@@ -346,6 +346,10 @@
</param>
<param>
<key>rate4</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate5</key>
<value>C1_4</value>
</param>
<param>
@@ -365,12 +369,16 @@
<value>168</value>
</param>
<param>
- <key>framesize</key>
+ <key>framesize1</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>framesize2</key>
<value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(400, 27)</value>
+ <value>(408, 24)</value>
</param>
<param>
<key>_rotation</key>
@@ -425,6 +433,10 @@
</param>
<param>
<key>rate4</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate5</key>
<value>C1_4</value>
</param>
<param>
@@ -440,12 +452,16 @@
<value>True</value>
</param>
<param>
- <key>framesize</key>
+ <key>framesize1</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>framesize2</key>
<value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(608, 35)</value>
+ <value>(624, 28)</value>
</param>
<param>
<key>_rotation</key>
@@ -488,6 +504,10 @@
</param>
<param>
<key>rate4</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate5</key>
<value>C1_4</value>
</param>
<param>
@@ -503,12 +523,16 @@
<value>True</value>
</param>
<param>
- <key>framesize</key>
+ <key>framesize1</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>framesize2</key>
<value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(824, 35)</value>
+ <value>(848, 28)</value>
</param>
<param>
<key>_rotation</key>
@@ -551,6 +575,10 @@
</param>
<param>
<key>rate4</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate5</key>
<value>C1_4</value>
</param>
<param>
@@ -570,12 +598,16 @@
<value>True</value>
</param>
<param>
- <key>framesize</key>
+ <key>framesize1</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>framesize2</key>
<value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1048, 27)</value>
+ <value>(1064, 24)</value>
</param>
<param>
<key>_rotation</key>
@@ -605,8 +637,16 @@
<value></value>
</param>
<param>
- <key>rate</key>
- <value>C_OTHER</value>
+ <key>rate1</key>
+ <value>C9_10</value>
+ </param>
+ <param>
+ <key>rate2</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate3</key>
+ <value>C1_4</value>
</param>
<param>
<key>comment</key>
@@ -630,7 +670,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(192, 235)</value>
+ <value>(184, 220)</value>
</param>
<param>
<key>_rotation</key>
@@ -660,10 +700,18 @@
<value></value>
</param>
<param>
- <key>rate</key>
+ <key>rate1</key>
<value>C9_10</value>
</param>
<param>
+ <key>rate2</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate3</key>
+ <value>C1_4</value>
+ </param>
+ <param>
<key>comment</key>
<value></value>
</param>
@@ -685,7 +733,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(472, 227)</value>
+ <value>(448, 216)</value>
</param>
<param>
<key>_rotation</key>
@@ -711,10 +759,18 @@
<value></value>
</param>
<param>
- <key>rate</key>
+ <key>rate1</key>
<value>C9_10</value>
</param>
<param>
+ <key>rate2</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate3</key>
+ <value>C1_4</value>
+ </param>
+ <param>
<key>comment</key>
<value></value>
</param>
@@ -736,7 +792,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(192, 443)</value>
+ <value>(184, 432)</value>
</param>
<param>
<key>_rotation</key>
@@ -787,7 +843,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(472, 459)</value>
+ <value>(464, 444)</value>
</param>
<param>
<key>_rotation</key>
@@ -1742,7 +1798,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(1040, 243)</value>
+ <value>(1040, 228)</value>
</param>
<param>
<key>_rotation</key>
@@ -2509,7 +2565,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(1040, 427)</value>
+ <value>(1048, 416)</value>
</param>
<param>
<key>_rotation</key>
@@ -2636,6 +2692,10 @@
<value>False</value>
</param>
<param>
+ <key>hide_lo_controls</key>
+ <value>True</value>
+ </param>
+ <param>
<key>stream_args</key>
<value></value>
</param>
@@ -2696,7 +2756,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(784, 203)</value>
+ <value>(776, 196)</value>
</param>
<param>
<key>_rotation</key>
@@ -2720,7 +2780,7 @@
</param>
<param>
<key>ref_level</key>
- <value>0</value>
+ <value>-20</value>
</param>
<param>
<key>ref_scale</key>
@@ -2744,7 +2804,7 @@
</param>
<param>
<key>win_size</key>
- <value></value>
+ <value>800,600</value>
</param>
<param>
<key>win</key>
diff --git a/gr-dtv/grc/dtv_dvb_bbheader_bb.xml
b/gr-dtv/grc/dtv_dvb_bbheader_bb.xml
index c3b78bf..b18b87b 100644
--- a/gr-dtv/grc/dtv_dvb_bbheader_bb.xml
+++ b/gr-dtv/grc/dtv_dvb_bbheader_bb.xml
@@ -189,11 +189,6 @@ $rolloff.val, $mode.val, $inband.val, $fecblocks,
$tsrate)</make>
<type>enum</type>
<hide>#if str($standard) == 'STANDARD_DVBS2' then $framesize2.hide_normal
else 'all'</hide>
<option>
- <name>2/9 VL-SNR</name>
- <key>C2_9_VLSNR</key>
- <opt>val:dtv.C2_9_VLSNR</opt>
- </option>
- <option>
<name>1/4</name>
<key>C1_4</key>
<opt>val:dtv.C1_4</opt>
@@ -249,6 +244,11 @@ $rolloff.val, $mode.val, $inband.val, $fecblocks,
$tsrate)</make>
<opt>val:dtv.C9_10</opt>
</option>
<option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
<name>13/45</name>
<key>C13_45</key>
<opt>val:dtv.C13_45</opt>
diff --git a/gr-dtv/grc/dtv_dvb_bbscrambler_bb.xml
b/gr-dtv/grc/dtv_dvb_bbscrambler_bb.xml
index 34f96d3..1dbf396 100644
--- a/gr-dtv/grc/dtv_dvb_bbscrambler_bb.xml
+++ b/gr-dtv/grc/dtv_dvb_bbscrambler_bb.xml
@@ -189,11 +189,6 @@ $rate5.val, #slurp
<type>enum</type>
<hide>#if str($standard) == 'STANDARD_DVBS2' then $framesize2.hide_normal
else 'all'</hide>
<option>
- <name>2/9 VL-SNR</name>
- <key>C2_9_VLSNR</key>
- <opt>val:dtv.C2_9_VLSNR</opt>
- </option>
- <option>
<name>1/4</name>
<key>C1_4</key>
<opt>val:dtv.C1_4</opt>
@@ -249,6 +244,11 @@ $rate5.val, #slurp
<opt>val:dtv.C9_10</opt>
</option>
<option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
<name>13/45</name>
<key>C13_45</key>
<opt>val:dtv.C13_45</opt>
diff --git a/gr-dtv/grc/dtv_dvb_bch_bb.xml b/gr-dtv/grc/dtv_dvb_bch_bb.xml
index 99fa6aa..12ac8c6 100644
--- a/gr-dtv/grc/dtv_dvb_bch_bb.xml
+++ b/gr-dtv/grc/dtv_dvb_bch_bb.xml
@@ -189,11 +189,6 @@ $rate5.val, #slurp
<type>enum</type>
<hide>#if str($standard) == 'STANDARD_DVBS2' then $framesize2.hide_normal
else 'all'</hide>
<option>
- <name>2/9 VL-SNR</name>
- <key>C2_9_VLSNR</key>
- <opt>val:dtv.C2_9_VLSNR</opt>
- </option>
- <option>
<name>1/4</name>
<key>C1_4</key>
<opt>val:dtv.C1_4</opt>
@@ -249,6 +244,11 @@ $rate5.val, #slurp
<opt>val:dtv.C9_10</opt>
</option>
<option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
<name>13/45</name>
<key>C13_45</key>
<opt>val:dtv.C13_45</opt>
diff --git a/gr-dtv/grc/dtv_dvb_ldpc_bb.xml b/gr-dtv/grc/dtv_dvb_ldpc_bb.xml
index ec5de0c..f1cff16 100644
--- a/gr-dtv/grc/dtv_dvb_ldpc_bb.xml
+++ b/gr-dtv/grc/dtv_dvb_ldpc_bb.xml
@@ -189,11 +189,6 @@ $constellation.val)</make>
<type>enum</type>
<hide>#if str($standard) == 'STANDARD_DVBS2' then $framesize2.hide_normal
else 'all'</hide>
<option>
- <name>2/9 VL-SNR</name>
- <key>C2_9_VLSNR</key>
- <opt>val:dtv.C2_9_VLSNR</opt>
- </option>
- <option>
<name>1/4</name>
<key>C1_4</key>
<opt>val:dtv.C1_4</opt>
@@ -249,6 +244,11 @@ $constellation.val)</make>
<opt>val:dtv.C9_10</opt>
</option>
<option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
<name>13/45</name>
<key>C13_45</key>
<opt>val:dtv.C13_45</opt>
diff --git a/gr-dtv/grc/dtv_dvbs2_interleaver_bb.xml
b/gr-dtv/grc/dtv_dvbs2_interleaver_bb.xml
index 9a6d2ef..675f70d 100644
--- a/gr-dtv/grc/dtv_dvbs2_interleaver_bb.xml
+++ b/gr-dtv/grc/dtv_dvbs2_interleaver_bb.xml
@@ -8,7 +8,15 @@
<name>Interleaver</name>
<key>dtv_dvbs2_interleaver_bb</key>
<import>from gnuradio import dtv</import>
- <make>dtv.dvbs2_interleaver_bb($framesize.val, $rate.val,
$constellation.val)</make>
+ <make>dtv.dvbs2_interleaver_bb($framesize.val, #slurp
+#if str($framesize) == 'FECFRAME_NORMAL'
+$rate1.val, #slurp
+#else if str($framesize) == 'FECFRAME_MEDIUM'
+$rate2.val, #slurp
+#else
+$rate3.val, #slurp
+#end if
+$constellation.val)</make>
<param>
<name>FECFRAME size</name>
<key>framesize</key>
@@ -17,21 +25,51 @@
<name>Normal</name>
<key>FECFRAME_NORMAL</key>
<opt>val:dtv.FECFRAME_NORMAL</opt>
+ <opt>hide_normal:</opt>
+ <opt>hide_medium:all</opt>
+ <opt>hide_short:all</opt>
+ </option>
+ <option>
+ <name>Medium</name>
+ <key>FECFRAME_MEDIUM</key>
+ <opt>val:dtv.FECFRAME_MEDIUM</opt>
+ <opt>hide_normal:all</opt>
+ <opt>hide_medium:</opt>
+ <opt>hide_short:all</opt>
</option>
<option>
<name>Short</name>
<key>FECFRAME_SHORT</key>
<opt>val:dtv.FECFRAME_SHORT</opt>
+ <opt>hide_normal:all</opt>
+ <opt>hide_medium:all</opt>
+ <opt>hide_short:</opt>
</option>
</param>
<param>
<name>Code rate</name>
- <key>rate</key>
+ <key>rate1</key>
<type>enum</type>
+ <hide>$framesize.hide_normal</hide>
+ <option>
+ <name>1/4</name>
+ <key>C1_4</key>
+ <opt>val:dtv.C1_4</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3</key>
+ <opt>val:dtv.C1_3</opt>
+ </option>
+ <option>
+ <name>2/5</name>
+ <key>C2_5</key>
+ <opt>val:dtv.C2_5</opt>
+ </option>
<option>
- <name>Other</name>
- <key>C_OTHER</key>
- <opt>val:dtv.C_OTHER</opt>
+ <name>1/2</name>
+ <key>C1_2</key>
+ <opt>val:dtv.C1_2</opt>
</option>
<option>
<name>3/5</name>
@@ -44,6 +82,11 @@
<opt>val:dtv.C2_3</opt>
</option>
<option>
+ <name>3/4</name>
+ <key>C3_4</key>
+ <opt>val:dtv.C3_4</opt>
+ </option>
+ <option>
<name>4/5</name>
<key>C4_5</key>
<opt>val:dtv.C4_5</opt>
@@ -54,6 +97,31 @@
<opt>val:dtv.C5_6</opt>
</option>
<option>
+ <name>8/9</name>
+ <key>C8_9</key>
+ <opt>val:dtv.C8_9</opt>
+ </option>
+ <option>
+ <name>9/10</name>
+ <key>C9_10</key>
+ <opt>val:dtv.C9_10</opt>
+ </option>
+ <option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
+ <name>13/45</name>
+ <key>C13_45</key>
+ <opt>val:dtv.C13_45</opt>
+ </option>
+ <option>
+ <name>9/20</name>
+ <key>C9_20</key>
+ <opt>val:dtv.C9_20</opt>
+ </option>
+ <option>
<name>90/180</name>
<key>C90_180</key>
<opt>val:dtv.C90_180</opt>
@@ -64,16 +132,31 @@
<opt>val:dtv.C96_180</opt>
</option>
<option>
+ <name>11/20</name>
+ <key>C11_20</key>
+ <opt>val:dtv.C11_20</opt>
+ </option>
+ <option>
<name>100/180</name>
<key>C100_180</key>
<opt>val:dtv.C100_180</opt>
</option>
<option>
+ <name>104/180</name>
+ <key>C104_180</key>
+ <opt>val:dtv.C104_180</opt>
+ </option>
+ <option>
<name>26/45</name>
<key>C26_45</key>
<opt>val:dtv.C26_45</opt>
</option>
<option>
+ <name>18/30</name>
+ <key>C18_30</key>
+ <opt>val:dtv.C18_30</opt>
+ </option>
+ <option>
<name>28/45</name>
<key>C28_45</key>
<opt>val:dtv.C28_45</opt>
@@ -89,6 +172,11 @@
<opt>val:dtv.C116_180</opt>
</option>
<option>
+ <name>20/30</name>
+ <key>C20_30</key>
+ <opt>val:dtv.C20_30</opt>
+ </option>
+ <option>
<name>124/180</name>
<key>C124_180</key>
<opt>val:dtv.C124_180</opt>
@@ -109,6 +197,16 @@
<opt>val:dtv.C13_18</opt>
</option>
<option>
+ <name>132/180</name>
+ <key>C132_180</key>
+ <opt>val:dtv.C132_180</opt>
+ </option>
+ <option>
+ <name>22/30</name>
+ <key>C22_30</key>
+ <opt>val:dtv.C22_30</opt>
+ </option>
+ <option>
<name>135/180</name>
<key>C135_180</key>
<opt>val:dtv.C135_180</opt>
@@ -124,6 +222,103 @@
<opt>val:dtv.C7_9</opt>
</option>
<option>
+ <name>154/180</name>
+ <key>C154_180</key>
+ <opt>val:dtv.C154_180</opt>
+ </option>
+ </param>
+ <param>
+ <name>Code rate</name>
+ <key>rate2</key>
+ <type>enum</type>
+ <hide>$framesize.hide_medium</hide>
+ <option>
+ <name>1/5</name>
+ <key>C1_5_MEDIUM</key>
+ <opt>val:dtv.C1_5_MEDIUM</opt>
+ </option>
+ <option>
+ <name>11/45</name>
+ <key>C11_45_MEDIUM</key>
+ <opt>val:dtv.C11_45_MEDIUM</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3_MEDIUM</key>
+ <opt>val:dtv.C1_3_MEDIUM</opt>
+ </option>
+ </param>
+ <param>
+ <name>Code rate</name>
+ <key>rate3</key>
+ <type>enum</type>
+ <hide>$framesize.hide_short</hide>
+ <option>
+ <name>1/4</name>
+ <key>C1_4</key>
+ <opt>val:dtv.C1_4</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3</key>
+ <opt>val:dtv.C1_3</opt>
+ </option>
+ <option>
+ <name>2/5</name>
+ <key>C2_5</key>
+ <opt>val:dtv.C2_5</opt>
+ </option>
+ <option>
+ <name>1/2</name>
+ <key>C1_2</key>
+ <opt>val:dtv.C1_2</opt>
+ </option>
+ <option>
+ <name>3/5</name>
+ <key>C3_5</key>
+ <opt>val:dtv.C3_5</opt>
+ </option>
+ <option>
+ <name>2/3</name>
+ <key>C2_3</key>
+ <opt>val:dtv.C2_3</opt>
+ </option>
+ <option>
+ <name>3/4</name>
+ <key>C3_4</key>
+ <opt>val:dtv.C3_4</opt>
+ </option>
+ <option>
+ <name>4/5</name>
+ <key>C4_5</key>
+ <opt>val:dtv.C4_5</opt>
+ </option>
+ <option>
+ <name>5/6</name>
+ <key>C5_6</key>
+ <opt>val:dtv.C5_6</opt>
+ </option>
+ <option>
+ <name>8/9</name>
+ <key>C8_9</key>
+ <opt>val:dtv.C8_9</opt>
+ </option>
+ <option>
+ <name>11/45</name>
+ <key>C11_45</key>
+ <opt>val:dtv.C11_45</opt>
+ </option>
+ <option>
+ <name>4/15</name>
+ <key>C4_15</key>
+ <opt>val:dtv.C4_15</opt>
+ </option>
+ <option>
+ <name>14/45</name>
+ <key>C14_45</key>
+ <opt>val:dtv.C14_45</opt>
+ </option>
+ <option>
<name>7/15</name>
<key>C7_15</key>
<opt>val:dtv.C7_15</opt>
@@ -134,10 +329,40 @@
<opt>val:dtv.C8_15</opt>
</option>
<option>
+ <name>26/45</name>
+ <key>C26_45</key>
+ <opt>val:dtv.C26_45</opt>
+ </option>
+ <option>
<name>32/45</name>
<key>C32_45</key>
<opt>val:dtv.C32_45</opt>
</option>
+ <option>
+ <name>1/5 VL-SNR SF2</name>
+ <key>C1_5_VLSNR_SF2</key>
+ <opt>val:dtv.C1_5_VLSNR_SF2</opt>
+ </option>
+ <option>
+ <name>11/45 VL-SNR SF2</name>
+ <key>C11_45_VLSNR_SF2</key>
+ <opt>val:dtv.C11_45_VLSNR_SF2</opt>
+ </option>
+ <option>
+ <name>1/5 VL-SNR</name>
+ <key>C1_5_VLSNR</key>
+ <opt>val:dtv.C1_5_VLSNR</opt>
+ </option>
+ <option>
+ <name>4/15 VL-SNR</name>
+ <key>C4_15_VLSNR</key>
+ <opt>val:dtv.C4_15_VLSNR</opt>
+ </option>
+ <option>
+ <name>1/3 VL-SNR</name>
+ <key>C1_3_VLSNR</key>
+ <opt>val:dtv.C1_3_VLSNR</opt>
+ </option>
</param>
<param>
<name>Constellation</name>
@@ -208,6 +433,16 @@
<key>MOD_256APSK</key>
<opt>val:dtv.MOD_256APSK</opt>
</option>
+ <option>
+ <name>PI/2 BPSK</name>
+ <key>MOD_BPSK</key>
+ <opt>val:dtv.MOD_BPSK</opt>
+ </option>
+ <option>
+ <name>PI/2 BPSK-SF2</name>
+ <key>MOD_BPSK_SF2</key>
+ <opt>val:dtv.MOD_BPSK_SF2</opt>
+ </option>
</param>
<sink>
<name>in</name>
diff --git a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
index 8de645d..5f848ec 100644
--- a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
+++ b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
@@ -8,7 +8,15 @@
<name>DVB-S2X Modulator</name>
<key>dtv_dvbs2_modulator_bc</key>
<import>from gnuradio import dtv</import>
- <make>dtv.dvbs2_modulator_bc($framesize.val, $rate.val, $constellation.val,
$interpolation.val)</make>
+ <make>dtv.dvbs2_modulator_bc($framesize.val,
+#if str($framesize) == 'FECFRAME_NORMAL'
+$rate1.val, #slurp
+#else if str($framesize) == 'FECFRAME_MEDIUM'
+$rate2.val, #slurp
+#else
+$rate3.val, #slurp
+#end if
+$constellation.val, $interpolation.val)</make>
<param>
<name>FECFRAME size</name>
<key>framesize</key>
@@ -17,21 +25,51 @@
<name>Normal</name>
<key>FECFRAME_NORMAL</key>
<opt>val:dtv.FECFRAME_NORMAL</opt>
+ <opt>hide_normal:</opt>
+ <opt>hide_medium:all</opt>
+ <opt>hide_short:all</opt>
+ </option>
+ <option>
+ <name>Medium</name>
+ <key>FECFRAME_MEDIUM</key>
+ <opt>val:dtv.FECFRAME_MEDIUM</opt>
+ <opt>hide_normal:all</opt>
+ <opt>hide_medium:</opt>
+ <opt>hide_short:all</opt>
</option>
<option>
<name>Short</name>
<key>FECFRAME_SHORT</key>
<opt>val:dtv.FECFRAME_SHORT</opt>
+ <opt>hide_normal:all</opt>
+ <opt>hide_medium:all</opt>
+ <opt>hide_short:</opt>
</option>
</param>
<param>
<name>Code rate</name>
- <key>rate</key>
+ <key>rate1</key>
<type>enum</type>
+ <hide>$framesize.hide_normal</hide>
+ <option>
+ <name>1/4</name>
+ <key>C1_4</key>
+ <opt>val:dtv.C1_4</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3</key>
+ <opt>val:dtv.C1_3</opt>
+ </option>
<option>
- <name>Other</name>
- <key>C_OTHER</key>
- <opt>val:dtv.C_OTHER</opt>
+ <name>2/5</name>
+ <key>C2_5</key>
+ <opt>val:dtv.C2_5</opt>
+ </option>
+ <option>
+ <name>1/2</name>
+ <key>C1_2</key>
+ <opt>val:dtv.C1_2</opt>
</option>
<option>
<name>3/5</name>
@@ -69,6 +107,21 @@
<opt>val:dtv.C9_10</opt>
</option>
<option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
+ <name>13/45</name>
+ <key>C13_45</key>
+ <opt>val:dtv.C13_45</opt>
+ </option>
+ <option>
+ <name>9/20</name>
+ <key>C9_20</key>
+ <opt>val:dtv.C9_20</opt>
+ </option>
+ <option>
<name>90/180</name>
<key>C90_180</key>
<opt>val:dtv.C90_180</opt>
@@ -79,6 +132,11 @@
<opt>val:dtv.C96_180</opt>
</option>
<option>
+ <name>11/20</name>
+ <key>C11_20</key>
+ <opt>val:dtv.C11_20</opt>
+ </option>
+ <option>
<name>100/180</name>
<key>C100_180</key>
<opt>val:dtv.C100_180</opt>
@@ -168,6 +226,98 @@
<key>C154_180</key>
<opt>val:dtv.C154_180</opt>
</option>
+ </param>
+ <param>
+ <name>Code rate</name>
+ <key>rate2</key>
+ <type>enum</type>
+ <hide>$framesize.hide_medium</hide>
+ <option>
+ <name>1/5</name>
+ <key>C1_5_MEDIUM</key>
+ <opt>val:dtv.C1_5_MEDIUM</opt>
+ </option>
+ <option>
+ <name>11/45</name>
+ <key>C11_45_MEDIUM</key>
+ <opt>val:dtv.C11_45_MEDIUM</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3_MEDIUM</key>
+ <opt>val:dtv.C1_3_MEDIUM</opt>
+ </option>
+ </param>
+ <param>
+ <name>Code rate</name>
+ <key>rate3</key>
+ <type>enum</type>
+ <hide>$framesize.hide_short</hide>
+ <option>
+ <name>1/4</name>
+ <key>C1_4</key>
+ <opt>val:dtv.C1_4</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3</key>
+ <opt>val:dtv.C1_3</opt>
+ </option>
+ <option>
+ <name>2/5</name>
+ <key>C2_5</key>
+ <opt>val:dtv.C2_5</opt>
+ </option>
+ <option>
+ <name>1/2</name>
+ <key>C1_2</key>
+ <opt>val:dtv.C1_2</opt>
+ </option>
+ <option>
+ <name>3/5</name>
+ <key>C3_5</key>
+ <opt>val:dtv.C3_5</opt>
+ </option>
+ <option>
+ <name>2/3</name>
+ <key>C2_3</key>
+ <opt>val:dtv.C2_3</opt>
+ </option>
+ <option>
+ <name>3/4</name>
+ <key>C3_4</key>
+ <opt>val:dtv.C3_4</opt>
+ </option>
+ <option>
+ <name>4/5</name>
+ <key>C4_5</key>
+ <opt>val:dtv.C4_5</opt>
+ </option>
+ <option>
+ <name>5/6</name>
+ <key>C5_6</key>
+ <opt>val:dtv.C5_6</opt>
+ </option>
+ <option>
+ <name>8/9</name>
+ <key>C8_9</key>
+ <opt>val:dtv.C8_9</opt>
+ </option>
+ <option>
+ <name>11/45</name>
+ <key>C11_45</key>
+ <opt>val:dtv.C11_45</opt>
+ </option>
+ <option>
+ <name>4/15</name>
+ <key>C4_15</key>
+ <opt>val:dtv.C4_15</opt>
+ </option>
+ <option>
+ <name>14/45</name>
+ <key>C14_45</key>
+ <opt>val:dtv.C14_45</opt>
+ </option>
<option>
<name>7/15</name>
<key>C7_15</key>
@@ -179,10 +329,40 @@
<opt>val:dtv.C8_15</opt>
</option>
<option>
+ <name>26/45</name>
+ <key>C26_45</key>
+ <opt>val:dtv.C26_45</opt>
+ </option>
+ <option>
<name>32/45</name>
<key>C32_45</key>
<opt>val:dtv.C32_45</opt>
</option>
+ <option>
+ <name>1/5 VL-SNR SF2</name>
+ <key>C1_5_VLSNR_SF2</key>
+ <opt>val:dtv.C1_5_VLSNR_SF2</opt>
+ </option>
+ <option>
+ <name>11/45 VL-SNR SF2</name>
+ <key>C11_45_VLSNR_SF2</key>
+ <opt>val:dtv.C11_45_VLSNR_SF2</opt>
+ </option>
+ <option>
+ <name>1/5 VL-SNR</name>
+ <key>C1_5_VLSNR</key>
+ <opt>val:dtv.C1_5_VLSNR</opt>
+ </option>
+ <option>
+ <name>4/15 VL-SNR</name>
+ <key>C4_15_VLSNR</key>
+ <opt>val:dtv.C4_15_VLSNR</opt>
+ </option>
+ <option>
+ <name>1/3 VL-SNR</name>
+ <key>C1_3_VLSNR</key>
+ <opt>val:dtv.C1_3_VLSNR</opt>
+ </option>
</param>
<param>
<name>Constellation</name>
@@ -234,7 +414,7 @@
<opt>val:dtv.MOD_64APSK</opt>
</option>
<option>
- <name>8+6+20+20APSK</name>
+ <name>8+16+20+20APSK</name>
<key>MOD_8_16_20_20APSK</key>
<opt>val:dtv.MOD_8_16_20_20APSK</opt>
</option>
@@ -254,10 +434,20 @@
<opt>val:dtv.MOD_256APSK</opt>
</option>
<option>
- <name>64QAM</name>
+ <name>64QAM (ITU-T J.83B)</name>
<key>MOD_64QAM</key>
<opt>val:dtv.MOD_64QAM</opt>
</option>
+ <option>
+ <name>PI/2 BPSK</name>
+ <key>MOD_BPSK</key>
+ <opt>val:dtv.MOD_BPSK</opt>
+ </option>
+ <option>
+ <name>PI/2 BPSK-SF2</name>
+ <key>MOD_BPSK_SF2</key>
+ <opt>val:dtv.MOD_BPSK_SF2</opt>
+ </option>
</param>
<param>
<name>2X Interpolation</name>
diff --git a/gr-dtv/grc/dtv_dvbs2_physical_cc.xml
b/gr-dtv/grc/dtv_dvbs2_physical_cc.xml
index ad9eb9a..91d03ae 100644
--- a/gr-dtv/grc/dtv_dvbs2_physical_cc.xml
+++ b/gr-dtv/grc/dtv_dvbs2_physical_cc.xml
@@ -8,7 +8,15 @@
<name>Physical Layer Framer</name>
<key>dtv_dvbs2_physical_cc</key>
<import>from gnuradio import dtv</import>
- <make>dtv.dvbs2_physical_cc($framesize.val, $rate.val, $constellation.val,
$pilots.val, $goldcode)</make>
+ <make>dtv.dvbs2_physical_cc($framesize.val, #slurp
+#if str($framesize) == 'FECFRAME_NORMAL'
+$rate1.val, #slurp
+#else if str($framesize) == 'FECFRAME_MEDIUM'
+$rate2.val, #slurp
+#else
+$rate3.val, #slurp
+#end if
+$constellation.val, $pilots.val, $goldcode)</make>
<param>
<name>FECFRAME size</name>
<key>framesize</key>
@@ -17,17 +25,32 @@
<name>Normal</name>
<key>FECFRAME_NORMAL</key>
<opt>val:dtv.FECFRAME_NORMAL</opt>
+ <opt>hide_normal:</opt>
+ <opt>hide_medium:all</opt>
+ <opt>hide_short:all</opt>
+ </option>
+ <option>
+ <name>Medium</name>
+ <key>FECFRAME_MEDIUM</key>
+ <opt>val:dtv.FECFRAME_MEDIUM</opt>
+ <opt>hide_normal:all</opt>
+ <opt>hide_medium:</opt>
+ <opt>hide_short:all</opt>
</option>
<option>
<name>Short</name>
<key>FECFRAME_SHORT</key>
<opt>val:dtv.FECFRAME_SHORT</opt>
+ <opt>hide_normal:all</opt>
+ <opt>hide_medium:all</opt>
+ <opt>hide_short:</opt>
</option>
</param>
<param>
<name>Code rate</name>
- <key>rate</key>
+ <key>rate1</key>
<type>enum</type>
+ <hide>$framesize.hide_normal</hide>
<option>
<name>1/4</name>
<key>C1_4</key>
@@ -84,6 +107,11 @@
<opt>val:dtv.C9_10</opt>
</option>
<option>
+ <name>2/9 VL-SNR</name>
+ <key>C2_9_VLSNR</key>
+ <opt>val:dtv.C2_9_VLSNR</opt>
+ </option>
+ <option>
<name>13/45</name>
<key>C13_45</key>
<opt>val:dtv.C13_45</opt>
@@ -198,6 +226,83 @@
<key>C154_180</key>
<opt>val:dtv.C154_180</opt>
</option>
+ </param>
+ <param>
+ <name>Code rate</name>
+ <key>rate2</key>
+ <type>enum</type>
+ <hide>$framesize.hide_medium</hide>
+ <option>
+ <name>1/5</name>
+ <key>C1_5_MEDIUM</key>
+ <opt>val:dtv.C1_5_MEDIUM</opt>
+ </option>
+ <option>
+ <name>11/45</name>
+ <key>C11_45_MEDIUM</key>
+ <opt>val:dtv.C11_45_MEDIUM</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3_MEDIUM</key>
+ <opt>val:dtv.C1_3_MEDIUM</opt>
+ </option>
+ </param>
+ <param>
+ <name>Code rate</name>
+ <key>rate3</key>
+ <type>enum</type>
+ <hide>$framesize.hide_short</hide>
+ <option>
+ <name>1/4</name>
+ <key>C1_4</key>
+ <opt>val:dtv.C1_4</opt>
+ </option>
+ <option>
+ <name>1/3</name>
+ <key>C1_3</key>
+ <opt>val:dtv.C1_3</opt>
+ </option>
+ <option>
+ <name>2/5</name>
+ <key>C2_5</key>
+ <opt>val:dtv.C2_5</opt>
+ </option>
+ <option>
+ <name>1/2</name>
+ <key>C1_2</key>
+ <opt>val:dtv.C1_2</opt>
+ </option>
+ <option>
+ <name>3/5</name>
+ <key>C3_5</key>
+ <opt>val:dtv.C3_5</opt>
+ </option>
+ <option>
+ <name>2/3</name>
+ <key>C2_3</key>
+ <opt>val:dtv.C2_3</opt>
+ </option>
+ <option>
+ <name>3/4</name>
+ <key>C3_4</key>
+ <opt>val:dtv.C3_4</opt>
+ </option>
+ <option>
+ <name>4/5</name>
+ <key>C4_5</key>
+ <opt>val:dtv.C4_5</opt>
+ </option>
+ <option>
+ <name>5/6</name>
+ <key>C5_6</key>
+ <opt>val:dtv.C5_6</opt>
+ </option>
+ <option>
+ <name>8/9</name>
+ <key>C8_9</key>
+ <opt>val:dtv.C8_9</opt>
+ </option>
<option>
<name>11/45</name>
<key>C11_45</key>
@@ -224,10 +329,40 @@
<opt>val:dtv.C8_15</opt>
</option>
<option>
+ <name>26/45</name>
+ <key>C26_45</key>
+ <opt>val:dtv.C26_45</opt>
+ </option>
+ <option>
<name>32/45</name>
<key>C32_45</key>
<opt>val:dtv.C32_45</opt>
</option>
+ <option>
+ <name>1/5 VL-SNR SF2</name>
+ <key>C1_5_VLSNR_SF2</key>
+ <opt>val:dtv.C1_5_VLSNR_SF2</opt>
+ </option>
+ <option>
+ <name>11/45 VL-SNR SF2</name>
+ <key>C11_45_VLSNR_SF2</key>
+ <opt>val:dtv.C11_45_VLSNR_SF2</opt>
+ </option>
+ <option>
+ <name>1/5 VL-SNR</name>
+ <key>C1_5_VLSNR</key>
+ <opt>val:dtv.C1_5_VLSNR</opt>
+ </option>
+ <option>
+ <name>4/15 VL-SNR</name>
+ <key>C4_15_VLSNR</key>
+ <opt>val:dtv.C4_15_VLSNR</opt>
+ </option>
+ <option>
+ <name>1/3 VL-SNR</name>
+ <key>C1_3_VLSNR</key>
+ <opt>val:dtv.C1_3_VLSNR</opt>
+ </option>
</param>
<param>
<name>Constellation</name>
@@ -279,7 +414,7 @@
<opt>val:dtv.MOD_64APSK</opt>
</option>
<option>
- <name>8+6+20+20APSK</name>
+ <name>8+16+20+20APSK</name>
<key>MOD_8_16_20_20APSK</key>
<opt>val:dtv.MOD_8_16_20_20APSK</opt>
</option>
@@ -298,6 +433,16 @@
<key>MOD_256APSK</key>
<opt>val:dtv.MOD_256APSK</opt>
</option>
+ <option>
+ <name>PI/2 BPSK</name>
+ <key>MOD_BPSK</key>
+ <opt>val:dtv.MOD_BPSK</opt>
+ </option>
+ <option>
+ <name>PI/2 BPSK-SF2</name>
+ <key>MOD_BPSK_SF2</key>
+ <opt>val:dtv.MOD_BPSK_SF2</opt>
+ </option>
</param>
<param>
<name>Pilots</name>
diff --git a/gr-dtv/include/gnuradio/dtv/dvb_config.h
b/gr-dtv/include/gnuradio/dtv/dvb_config.h
index ad26789..601fd5c 100644
--- a/gr-dtv/include/gnuradio/dtv/dvb_config.h
+++ b/gr-dtv/include/gnuradio/dtv/dvb_config.h
@@ -105,6 +105,8 @@ namespace gr {
MOD_4_12_20_28APSK,
MOD_128APSK,
MOD_256APSK,
+ MOD_BPSK,
+ MOD_BPSK_SF2,
MOD_OTHER,
};
diff --git a/gr-dtv/lib/dvb/dvb_defines.h b/gr-dtv/lib/dvb/dvb_defines.h
index 885d640..97be4d0 100644
--- a/gr-dtv/lib/dvb/dvb_defines.h
+++ b/gr-dtv/lib/dvb/dvb_defines.h
@@ -57,5 +57,17 @@
#define LDPC_ENCODE_TABLE_LENGTH (FRAME_SIZE_NORMAL * 10)
+#define NORMAL_PUNCTURING 3240
+#define MEDIUM_PUNCTURING 1620
+#define SHORT_PUNCTURING_SET1 810
+#define SHORT_PUNCTURING_SET2 1224
+
+#define VLSNR_OFF 0
+#define VLSNR_SET1 1
+#define VLSNR_SET2 2
+
+#define EXTRA_PILOT_SYMBOLS_SET1 ((18 * 34) + (3 * 36))
+#define EXTRA_PILOT_SYMBOLS_SET2 ((9 * 32) + 36)
+
#endif /* INCLUDED_DTV_DVB_DEFINES_H */
diff --git a/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc
b/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc
index b5b9065..568aac9 100644
--- a/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc
+++ b/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc
@@ -98,10 +98,10 @@ namespace gr {
case C2_9_VLSNR:
nbch = 14400;
q_val = 140;
- frame_size -= 3240;
- frame_size_real -= 3240;
+ frame_size -= NORMAL_PUNCTURING;
+ frame_size_real -= NORMAL_PUNCTURING;
P = 15;
- Xp = 3240;
+ Xp = NORMAL_PUNCTURING;
break;
case C13_45:
nbch = 18720;
@@ -276,8 +276,8 @@ namespace gr {
case C1_5_VLSNR_SF2:
nbch = 2680;
q_val = 135;
- frame_size -= 810;
- frame_size_real -= 810;
+ frame_size -= SHORT_PUNCTURING_SET1;
+ frame_size_real -= SHORT_PUNCTURING_SET1;
Xs = 560;
P = 30;
Xp = 250;
@@ -285,34 +285,34 @@ namespace gr {
case C11_45_VLSNR_SF2:
nbch = 3960;
q_val = 34;
- frame_size -= 810;
- frame_size_real -= 810;
+ frame_size -= SHORT_PUNCTURING_SET1;
+ frame_size_real -= SHORT_PUNCTURING_SET1;
P = 15;
- Xp = 810;
+ Xp = SHORT_PUNCTURING_SET1;
break;
case C1_5_VLSNR:
nbch = 3240;
q_val = 135;
- frame_size -= 1224;
- frame_size_real -= 1224;
+ frame_size -= SHORT_PUNCTURING_SET2;
+ frame_size_real -= SHORT_PUNCTURING_SET2;
P = 10;
- Xp = 1224;
+ Xp = SHORT_PUNCTURING_SET2;
break;
case C4_15_VLSNR:
nbch = 4320;
q_val = 33;
- frame_size -= 1224;
- frame_size_real -= 1224;
+ frame_size -= SHORT_PUNCTURING_SET2;
+ frame_size_real -= SHORT_PUNCTURING_SET2;
P = 8;
- Xp = 1224;
+ Xp = SHORT_PUNCTURING_SET2;
break;
case C1_3_VLSNR:
nbch = 5400;
q_val = 120;
- frame_size -= 1224;
- frame_size_real -= 1224;
+ frame_size -= SHORT_PUNCTURING_SET2;
+ frame_size_real -= SHORT_PUNCTURING_SET2;
P = 8;
- Xp = 1224;
+ Xp = SHORT_PUNCTURING_SET2;
break;
default:
nbch = 0;
@@ -321,8 +321,8 @@ namespace gr {
}
}
else {
- frame_size = FRAME_SIZE_MEDIUM - 1620;
- frame_size_real = FRAME_SIZE_MEDIUM - 1620;
+ frame_size = FRAME_SIZE_MEDIUM - MEDIUM_PUNCTURING;
+ frame_size_real = FRAME_SIZE_MEDIUM - MEDIUM_PUNCTURING;
switch (rate) {
case C1_5_MEDIUM:
nbch = 5840;
@@ -335,13 +335,13 @@ namespace gr {
nbch = 7920;
q_val = 68;
P = 15;
- Xp = 1620;
+ Xp = MEDIUM_PUNCTURING;
break;
case C1_3_MEDIUM:
nbch = 10800;
q_val = 60;
P = 13;
- Xp = 1620;
+ Xp = MEDIUM_PUNCTURING;
break;
default:
nbch = 0;
diff --git a/gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc
b/gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc
index 7abfbe3..35e2973 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;
diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
index d1f3b4a..8443593 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
+++ b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
@@ -47,6 +47,12 @@ namespace gr {
double m = 1.0;
r1 = m;
switch (constellation) {
+ case MOD_BPSK:
+ case MOD_BPSK_SF2:
+ m_bpsk[0][0] = gr_complex((r1 * cos(M_PI / 4.0)), (r1 * sin(M_PI /
4.0)));
+ m_bpsk[0][1] = gr_complex((r1 * cos(5.0 * M_PI / 4.0)), (r1 *
sin(5.0 * M_PI / 4.0)));
+ m_bpsk[1][0] = gr_complex((r1 * cos(5.0 * M_PI / 4.0)), (r1 *
sin(M_PI / 4.0)));
+ m_bpsk[1][1] = gr_complex((r1 * cos(M_PI / 4.0)), (r1 * sin(5.0 *
M_PI /4.0)));
case MOD_QPSK:
m_qpsk[0] = gr_complex((r1 * cos(M_PI / 4.0)), (r1 * sin(M_PI /
4.0)));
m_qpsk[1] = gr_complex((r1 * cos(7 * M_PI / 4.0)), (r1 * sin(7 *
M_PI / 4.0)));
@@ -1771,6 +1777,13 @@ namespace gr {
if (signal_interpolation == INTERPOLATION_OFF) {
switch (signal_constellation) {
+ case MOD_BPSK:
+ case MOD_BPSK_SF2:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_bpsk[i & 1][index & 0x1];
+ }
+ break;
case MOD_QPSK:
for (int i = 0; i < noutput_items; i++) {
index = *in++;
@@ -1830,6 +1843,14 @@ namespace gr {
}
else {
switch (signal_constellation) {
+ case MOD_BPSK:
+ case MOD_BPSK_SF2:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_bpsk[i & 1][index & 0x1];
+ *out++ = zero;
+ }
+ break;
case MOD_QPSK:
for (int i = 0; i < noutput_items / 2; i++) {
index = *in++;
diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
index 4fdbb14..ca042c2 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
+++ b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
@@ -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
@@ -32,6 +32,7 @@ namespace gr {
private:
int signal_constellation;
int signal_interpolation;
+ gr_complex m_bpsk[2][2];
gr_complex m_qpsk[4];
gr_complex m_8psk[8];
gr_complex m_16apsk[16];
diff --git a/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc
b/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc
index 4a0472a..4f38581 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc
+++ b/gr-dtv/lib/dvbs2/dvbs2_physical_cc_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
@@ -47,14 +47,32 @@ namespace gr {
int type, modcod;
double r0 = 1.0;
+ signal_constellation = constellation;
modcod = 0;
if (framesize == FECFRAME_NORMAL) {
frame_size = FRAME_SIZE_NORMAL;
type = 0;
+ if (rate == C2_9_VLSNR) {
+ frame_size = (FRAME_SIZE_NORMAL - NORMAL_PUNCTURING) +
(EXTRA_PILOT_SYMBOLS_SET1 * 2);
+ type = 1; /* force pilots on for VL-SNR */
+ }
}
- else {
+
+ else if (framesize == FECFRAME_SHORT) {
frame_size = FRAME_SIZE_SHORT;
type = 2;
+ if (rate == C1_5_VLSNR_SF2 || rate == C11_45_VLSNR_SF2) {
+ frame_size = ((FRAME_SIZE_SHORT - SHORT_PUNCTURING_SET1) * 2) +
EXTRA_PILOT_SYMBOLS_SET1;
+ type = 1; /* force pilots on for VL-SNR */
+ }
+ if (rate == C1_5_VLSNR || rate == C4_15_VLSNR || rate == C1_3_VLSNR) {
+ frame_size = (FRAME_SIZE_SHORT - SHORT_PUNCTURING_SET2) +
EXTRA_PILOT_SYMBOLS_SET2;
+ type = 1; /* force pilots on for VL-SNR */
+ }
+ }
+ else {
+ frame_size = FRAME_SIZE_MEDIUM - MEDIUM_PUNCTURING +
EXTRA_PILOT_SYMBOLS_SET1;
+ type = 1; /* force pilots on for VL-SNR */
}
pilot_mode = pilots;
@@ -68,6 +86,49 @@ namespace gr {
}
gold_code = goldcode;
+ vlsnr_set = VLSNR_OFF;
+ switch (rate) {
+ case C2_9_VLSNR:
+ vlsnr_header = 0;
+ vlsnr_set = VLSNR_SET1;
+ break;
+ case C1_5_MEDIUM:
+ vlsnr_header = 1;
+ vlsnr_set = VLSNR_SET1;
+ break;
+ case C11_45_MEDIUM:
+ vlsnr_header = 2;
+ vlsnr_set = VLSNR_SET1;
+ break;
+ case C1_3_MEDIUM:
+ vlsnr_header = 3;
+ vlsnr_set = VLSNR_SET1;
+ break;
+ case C1_5_VLSNR_SF2:
+ vlsnr_header = 4;
+ vlsnr_set = VLSNR_SET1;
+ break;
+ case C11_45_VLSNR_SF2:
+ vlsnr_header = 5;
+ vlsnr_set = VLSNR_SET1;
+ break;
+ case C1_5_VLSNR:
+ vlsnr_header = 9;
+ vlsnr_set = VLSNR_SET2;
+ break;
+ case C4_15_VLSNR:
+ vlsnr_header = 10;
+ vlsnr_set = VLSNR_SET2;
+ break;
+ case C1_3_VLSNR:
+ vlsnr_header = 11;
+ vlsnr_set = VLSNR_SET2;
+ break;
+ default:
+ vlsnr_header = 12;
+ break;
+ }
+
m_bpsk[0][0] = gr_complex((r0 * cos(M_PI / 4.0)), (r0 * sin(M_PI /
4.0)));
m_bpsk[0][1] = gr_complex((r0 * cos(5.0 * M_PI / 4.0)), (r0 * sin(5.0 *
M_PI / 4.0)));
m_bpsk[1][0] = gr_complex((r0 * cos(5.0 * M_PI / 4.0)), (r0 * sin(M_PI /
4.0)));
@@ -80,6 +141,46 @@ namespace gr {
m_zero = gr_complex(0.0, 0.0);
// Mode and code rate
+ if (constellation == MOD_BPSK) {
+ slots = (frame_size / 1) / 90;
+ pilot_symbols = (slots / 16) * 36;
+ if (!(slots % 16)) {
+ pilot_symbols -= 36;
+ }
+ switch (rate) {
+ case C1_5_MEDIUM:
+ case C11_45_MEDIUM:
+ case C1_3_MEDIUM:
+ modcod = 128;
+ break;
+ case C1_5_VLSNR:
+ case C4_15_VLSNR:
+ case C1_3_VLSNR:
+ modcod = 130;
+ break;
+ default:
+ modcod = 0;
+ break;
+ }
+ }
+
+ if (constellation == MOD_BPSK_SF2) {
+ slots = (frame_size / 1) / 90;
+ pilot_symbols = (slots / 16) * 36;
+ if (!(slots % 16)) {
+ pilot_symbols -= 36;
+ }
+ switch (rate) {
+ case C1_5_VLSNR_SF2:
+ case C11_45_VLSNR_SF2:
+ modcod = 128;
+ break;
+ default:
+ modcod = 0;
+ break;
+ }
+ }
+
if (constellation == MOD_QPSK) {
slots = (frame_size / 2) / 90;
pilot_symbols = (slots / 16) * 36;
@@ -87,6 +188,9 @@ namespace gr {
pilot_symbols -= 36;
}
switch (rate) {
+ case C2_9_VLSNR:
+ modcod = 128;
+ break;
case C1_4:
modcod = 1;
break;
@@ -506,7 +610,6 @@ namespace gr {
}
// Now create the PL header.
- int b[90];
// Add the sync sequence SOF
for (int i = 0; i < 26; i++) {
b[i] = ph_sync_seq[i];
@@ -516,23 +619,46 @@ namespace gr {
// BPSK modulate and create the header
for (int i = 0; i < 26; i++) {
- m_pl[i] = m_bpsk[i & 1][b[i]];
+ m_pl[i] = m_bpsk[i & 1][b[i]];
}
if (modcod & 0x80) {
for (int i = 26; i < 90; i++) {
- m_pl[i] = m_bpsk[(i & 1) + 2][b[i]];
+ m_pl[i] = m_bpsk[(i & 1) + 2][b[i]];
}
}
else {
for (int i = 26; i < 90; i++) {
- m_pl[i] = m_bpsk[i & 1][b[i]];
+ m_pl[i] = m_bpsk[i & 1][b[i]];
}
}
+
+ // Create the VL-SNR header.
+ // Add leading zeroes
+ for (int i = 0; i < 2; i++) {
+ b[i] = 0;
+ }
+ for (int i = 2; i < 898; i++) {
+ b[i] = ph_vlsnr_seq[vlsnr_header][i - 2];
+ }
+ // Add trailing zeroes
+ for (int i = 898; i < VLSNR_HEADER_LENGTH; i++) {
+ b[i] = 0;
+ }
+ // BPSK modulate and create the VL-SNR header
+ for (int i = 0; i < VLSNR_HEADER_LENGTH; i++) {
+ m_vlsnr_header[i] = m_bpsk[i & 1][b[i]];
+ }
+
build_symbol_scrambler_table();
if (!pilot_mode) {
pilot_symbols = 0;
}
- set_output_multiple((((slots * 90) + 90) + pilot_symbols) * 2);
+ if (vlsnr_set == VLSNR_OFF) {
+ set_output_multiple((((slots * 90) + 90) + pilot_symbols) * 2);
+ }
+ else {
+ set_output_multiple((((slots * 90) + 90) + (pilot_symbols + 36) +
VLSNR_HEADER_LENGTH) * 2);
+ }
}
/*
@@ -545,7 +671,15 @@ namespace gr {
void
dvbs2_physical_cc_impl::forecast (int noutput_items, gr_vector_int
&ninput_items_required)
{
- ninput_items_required[0] = (noutput_items / ((((slots * 90) + 90) +
pilot_symbols) * 2)) * (slots * 90);
+ if (vlsnr_set == VLSNR_OFF) {
+ ninput_items_required[0] = (noutput_items / ((((slots * 90) + 90) +
pilot_symbols) * 2)) * (slots * 90);
+ }
+ else if (vlsnr_set == VLSNR_SET1) {
+ ninput_items_required[0] = (noutput_items / ((((slots * 90) + 90) +
(pilot_symbols + 36) + VLSNR_HEADER_LENGTH) * 2)) * ((slots * 90) -
EXTRA_PILOT_SYMBOLS_SET1);
+ }
+ else {
+ ninput_items_required[0] = (noutput_items / ((((slots * 90) + 90) +
(pilot_symbols + 36) + VLSNR_HEADER_LENGTH) * 2)) * ((slots * 90) -
EXTRA_PILOT_SYMBOLS_SET2);
+ }
}
void
@@ -595,7 +729,7 @@ namespace gr {
unsigned char code;
if (modcod & 0x80) {
- code = modcod | type;
+ code = modcod | (type & 0x1);
}
else {
code = (modcod << 2) | type;
@@ -673,42 +807,84 @@ namespace gr {
gr_complex *out = (gr_complex *) output_items[0];
int consumed = 0;
int produced = 0;
- int slot_count = 0;
- int n;
+ int slot_count, n;
+ int group;
+ int symbols = 0;
gr_complex tempin, tempout;
- for (int i = 0; i < noutput_items / 2; i += (((slots * 90) + 90) +
pilot_symbols)) {
- n = 0;
- for (int plh = 0; plh < 90; plh++) {
- out[produced++] = m_pl[plh];
- out[produced++] = m_zero;
- }
- for (int j = 0; j < slots; j++) {
- for (int k = 0; k < 90; k++) {
- tempin = in[consumed++];
- switch (m_cscram[n++]) {
- case 0:
- tempout = tempin;
- break;
- case 1:
- tempout = gr_complex(-tempin.imag(), tempin.real());
- break;
- case 2:
- tempout = -tempin;
- break;
- case 3:
- tempout = gr_complex( tempin.imag(), -tempin.real());
- break;
+ if (vlsnr_set == VLSNR_OFF) {
+ for (int i = 0; i < noutput_items / 2; i += (((slots * 90) + 90) +
pilot_symbols)) {
+ n = 0;
+ slot_count = 0;
+ for (int plh = 0; plh < 90; plh++) {
+ out[produced++] = m_pl[plh];
+ out[produced++] = m_zero;
+ }
+ for (int j = 0; j < slots; j++) {
+ for (int k = 0; k < 90; k++) {
+ tempin = in[consumed++];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
}
- out[produced++] = tempout;
+ slot_count = (slot_count + 1) % 16;
+ if ((slot_count == 0) && (j < slots - 1)) {
+ if (pilot_mode) {
+ // Add pilots if needed
+ for (int p = 0; p < 36; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
+ }
+ }
+ }
+ }
+ }
+ else if (vlsnr_set == VLSNR_SET1) {
+ for (int i = 0; i < noutput_items / 2; i += (((slots * 90) + 90) +
pilot_symbols + VLSNR_HEADER_LENGTH + 36)) {
+ n = 0;
+ slot_count = 10;
+ group = 0;
+ for (int plh = 0; plh < 90; plh++) {
+ out[produced++] = m_pl[plh];
+ out[produced++] = m_zero;
+ }
+ for (int vlh = 0; vlh < VLSNR_HEADER_LENGTH; vlh++) {
+ out[produced++] = m_vlsnr_header[vlh];
out[produced++] = m_zero;
}
- slot_count = (slot_count + 1) % 16;
- if ((slot_count == 0) && (j < slots - 1)) {
- if (pilot_mode) {
- // Add pilots if needed
- for (int p = 0; p < 36; p++) {
- tempin = m_bpsk[0][0];
+ for (int j = 0; j < slots; j++) {
+ for (int k = 0; k < 90; k++) {
+ tempin = in[consumed++];
+ if (signal_constellation == MOD_QPSK) {
switch (m_cscram[n++]) {
case 0:
tempout = tempin;
@@ -719,12 +895,332 @@ namespace gr {
case 2:
tempout = -tempin;
break;
- case 03:
+ case 3:
tempout = gr_complex( tempin.imag(), -tempin.real());
break;
}
- out[produced++] = tempout;
- out[produced++] = m_zero;
+ }
+ else {
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = -tempin;
+ break;
+ case 2:
+ tempout = tempin;
+ break;
+ case 3:
+ tempout = -tempin;
+ break;
+ }
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ symbols++;
+ if (group <= 18 && symbols == 703) {
+ for (int p = 0; p < 34; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
+ for (int x = (k + 1 + 34) - 90; x < 90; x++) {
+ tempin = in[consumed++];
+ if (signal_constellation == MOD_QPSK) {
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ }
+ else {
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = -tempin;
+ break;
+ case 2:
+ tempout = tempin;
+ break;
+ case 3:
+ tempout = -tempin;
+ break;
+ }
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ symbols++;
+ }
+ slot_count = (slot_count + 1) % 16;
+ j++;
+ break;
+ }
+ else if ((group > 18 && group <= 21) && symbols == 702) {
+ for (int p = 0; p < 36; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
+ for (int x = (k + 1 + 36) - 90; x < 90; x++) {
+ tempin = in[consumed++];
+ if (signal_constellation == MOD_QPSK) {
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ }
+ else {
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = -tempin;
+ break;
+ case 2:
+ tempout = tempin;
+ break;
+ case 3:
+ tempout = -tempin;
+ break;
+ }
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ symbols++;
+ }
+ slot_count = (slot_count + 1) % 16;
+ j++;
+ break;
+ }
+ }
+ slot_count = (slot_count + 1) % 16;
+ if ((slot_count == 0) && (j < slots - 1)) {
+ if (pilot_mode) {
+ // Add pilots if needed
+ group++;
+ symbols = 0;
+ for (int p = 0; p < 36; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
+ }
+ }
+ }
+ }
+ }
+ else { /* VL-SNR set 2 */
+ for (int i = 0; i < noutput_items / 2; i += (((slots * 90) + 90) +
pilot_symbols + VLSNR_HEADER_LENGTH + 36)) {
+ n = 0;
+ slot_count = 10;
+ group = 0;
+ for (int plh = 0; plh < 90; plh++) {
+ out[produced++] = m_pl[plh];
+ out[produced++] = m_zero;
+ }
+ for (int vlh = 0; vlh < VLSNR_HEADER_LENGTH; vlh++) {
+ out[produced++] = m_vlsnr_header[vlh];
+ out[produced++] = m_zero;
+ }
+ for (int j = 0; j < slots; j++) {
+ for (int k = 0; k < 90; k++) {
+ tempin = in[consumed++];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = -tempin;
+ break;
+ case 2:
+ tempout = tempin;
+ break;
+ case 3:
+ tempout = -tempin;
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ symbols++;
+ if (group <= 9 && symbols == 704) {
+ for (int p = 0; p < 32; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
+ for (int x = (k + 1 + 32) - 90; x < 90; x++) {
+ tempin = in[consumed++];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = -tempin;
+ break;
+ case 2:
+ tempout = tempin;
+ break;
+ case 3:
+ tempout = -tempin;
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ symbols++;
+ }
+ slot_count = (slot_count + 1) % 16;
+ j++;
+ break;
+ }
+ else if ((group == 10) && symbols == 702) {
+ for (int p = 0; p < 36; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
+ for (int x = (k + 1 + 36) - 90; x < 90; x++) {
+ tempin = in[consumed++];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = -tempin;
+ break;
+ case 2:
+ tempout = tempin;
+ break;
+ case 3:
+ tempout = -tempin;
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ symbols++;
+ }
+ slot_count = (slot_count + 1) % 16;
+ j++;
+ break;
+ }
+ }
+ slot_count = (slot_count + 1) % 16;
+ if ((slot_count == 0) && (j < slots - 1)) {
+ if (pilot_mode) {
+ // Add pilots if needed
+ group++;
+ symbols = 0;
+ for (int p = 0; p < 36; p++) {
+ tempin = m_bpsk[0][0];
+ switch (m_cscram[n++]) {
+ case 0:
+ tempout = tempin;
+ break;
+ case 1:
+ tempout = gr_complex(-tempin.imag(), tempin.real());
+ break;
+ case 2:
+ tempout = -tempin;
+ break;
+ case 3:
+ tempout = gr_complex( tempin.imag(), -tempin.real());
+ break;
+ }
+ out[produced++] = tempout;
+ out[produced++] = m_zero;
+ }
}
}
}
@@ -755,25 +1251,279 @@ namespace gr {
0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0,
1, 0
};
- /* for future implementation */
- const int dvbs2_physical_cc_impl::ph_vlsnr_seq[896] =
+ const int dvbs2_physical_cc_impl::ph_vlsnr_seq[16][896] =
{
-
1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
-
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
-
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
-
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
-
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
-
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
-
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
-
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
-
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
-
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
-
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
-
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
-
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
-
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
-
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
-
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
1,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
1,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
1,0,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
1,0,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
1,0,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
1,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,
+
1,0,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
1,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
1,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,
+
1,0,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,1,0,1,1,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
1,0,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,1,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
1,0,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,1,1,1,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
+
1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,1,1,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
1,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
1,0,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
0,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
1,1,1,0,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,0},
+
+
{1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,
+
0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,
+
0,0,0,0,1,0,0,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,1,0,0,0,
+
1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,1,1,1,0,1,0,
+
1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,1,
+
0,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,
+
0,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,
+
1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,
+
0,1,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,
+
0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1,
+
0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,
+
1,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,
+
0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,0,
+
0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,
+
1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,
+
0,0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1}
};
} /* namespace dtv */
diff --git a/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.h
b/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.h
index 6910776..47a0a3e 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.h
+++ b/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.h
@@ -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
@@ -24,6 +24,8 @@
#include <gnuradio/dtv/dvbs2_physical_cc.h>
#include "dvb/dvb_defines.h"
+#define VLSNR_HEADER_LENGTH 900
+
namespace gr {
namespace dtv {
@@ -31,12 +33,17 @@ namespace gr {
{
private:
int frame_size;
+ int signal_constellation;
int slots;
int pilot_mode;
int pilot_symbols;
int gold_code;
+ int vlsnr_header;
+ int vlsnr_set;
+ int b[VLSNR_HEADER_LENGTH];
gr_complex m_bpsk[4][2];
gr_complex m_pl[90];
+ gr_complex m_vlsnr_header[VLSNR_HEADER_LENGTH];
gr_complex m_zero;
int m_cscram[FRAME_SIZE_NORMAL];
void b_64_8_code(unsigned char, int *);
@@ -47,7 +54,7 @@ namespace gr {
const static unsigned long g[7];
const static int ph_scram_tab[64];
const static int ph_sync_seq[26];
- const static int ph_vlsnr_seq[896];
+ const static int ph_vlsnr_seq[16][VLSNR_HEADER_LENGTH - 4];
public:
dvbs2_physical_cc_impl(dvb_framesize_t framesize, dvb_code_rate_t rate,
dvb_constellation_t constellation, dvbs2_pilots_t pilots, int goldcode);
- [Commit-gnuradio] [gnuradio] branch master updated (d56f675 -> 3b25661), git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 06/08: Merge remote-tracking branch 'drmpeg/phy-vlsnr', git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 04/08: Merge branch 'maint', git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 02/08: qtgui: remote debug print, remove check for start tag, tags assumped to be burst sample relative incoming to plot, git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 05/08: Merge remote-tracking branch 'osh/qtgui_msg_tags', git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 07/08: digital: cleanup and installation of examples, git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 01/08: qtgui: allow plotting of tags on message based plots based on PDU metadata 'tags' field, git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 08/08: Merge remote-tracking branch 'github/packet3', git, 2016/06/25
- [Commit-gnuradio] [gnuradio] 03/08: gr-dtv: Add DVB-S2X VL-SNR modulation and framing for AMSAT.,
git <=