diff options
author | Ron Economos <w6rz@comcast.net> | 2016-06-24 15:23:55 -0700 |
---|---|---|
committer | Ron Economos <w6rz@comcast.net> | 2016-06-24 15:23:55 -0700 |
commit | 7abec697352c4db9700b42a336774d63b6b62bab (patch) | |
tree | be8c2c9120e1d660368d445878b39de0c78e02c9 /gr-dtv | |
parent | 7a1403796abd4f9df1483482ce06b169a3212be8 (diff) |
gr-dtv: Add DVB-S2X VL-SNR modulation and framing for AMSAT.
Diffstat (limited to 'gr-dtv')
-rw-r--r-- | gr-dtv/examples/dvbs2_tx.grc | 108 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvb_bbheader_bb.xml | 10 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvb_bbscrambler_bb.xml | 10 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvb_bch_bb.xml | 10 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvb_ldpc_bb.xml | 10 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvbs2_interleaver_bb.xml | 245 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvbs2_modulator_bc.xml | 204 | ||||
-rw-r--r-- | gr-dtv/grc/dtv_dvbs2_physical_cc.xml | 151 | ||||
-rw-r--r-- | gr-dtv/include/gnuradio/dtv/dvb_config.h | 2 | ||||
-rw-r--r-- | gr-dtv/lib/dvb/dvb_defines.h | 12 | ||||
-rw-r--r-- | gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc | 42 | ||||
-rw-r--r-- | gr-dtv/lib/dvbs2/dvbs2_interleaver_bb_impl.cc | 64 | ||||
-rw-r--r-- | gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc | 21 | ||||
-rw-r--r-- | gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h | 3 | ||||
-rw-r--r-- | gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc | 872 | ||||
-rw-r--r-- | 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 c6de308ae3..99c797d066 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 c3b78bfa47..b18b87b604 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 34f96d33c7..1dbf39611e 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 99fa6aa926..12ac8c6cbb 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 ec5de0cf73..f1cff16091 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 9a6d2ef378..675f70d26a 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 8de645d585..5f848ec82d 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 ad9eb9ae01..91d03ae9ab 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 ad26789e28..601fd5c569 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 885d6402dd..97be4d04a3 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 b5b9065f93..568aac940a 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 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; diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc index d1f3b4aa27..844359333d 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 4fdbb149df..ca042c25dc 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 4a0472a5c1..4f38581e5b 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 69107765a5..47a0a3e19b 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); |