diff options
author | Tom Rondeau <tom@trondeau.com> | 2014-05-17 19:23:44 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2014-05-17 19:23:44 -0400 |
commit | 91b5f380b6c511624064f1b64ae3ebfd710d7272 (patch) | |
tree | 5c157b11cebf25e110d26f8829287f0b97fb0bfd /gr-fec | |
parent | 3245fde378417687db10f7cdeb274c9fa126d4e8 (diff) |
fec: wip: adding concept of padding for CC encoder/decoder.
When using terminated mode, the CC encoder adds K-1 bits to the output, which doesn't fit a full byte and will throw off the book-keeping in PDU or tagged mode. Padding to fill a byte tells both encoder and decoder to handle the extra bits.
Diffstat (limited to 'gr-fec')
-rw-r--r-- | gr-fec/examples/fecapi_async_to_stream.grc | 719 | ||||
-rw-r--r-- | gr-fec/examples/fecapi_tagged_decoders.grc | 270 | ||||
-rw-r--r-- | gr-fec/grc/variable_cc_decoder_def_list.xml | 21 | ||||
-rw-r--r-- | gr-fec/grc/variable_cc_encoder_def_list.xml | 23 | ||||
-rw-r--r-- | gr-fec/include/gnuradio/fec/cc_decoder.h | 7 | ||||
-rw-r--r-- | gr-fec/include/gnuradio/fec/cc_encoder.h | 4 | ||||
-rw-r--r-- | gr-fec/lib/async_encoder_impl.cc | 2 | ||||
-rw-r--r-- | gr-fec/lib/cc_decoder_impl.cc | 29 | ||||
-rw-r--r-- | gr-fec/lib/cc_decoder_impl.h | 3 | ||||
-rw-r--r-- | gr-fec/lib/cc_encoder_impl.cc | 16 | ||||
-rw-r--r-- | gr-fec/lib/cc_encoder_impl.h | 3 | ||||
-rw-r--r-- | gr-fec/lib/tagged_decoder_impl.cc | 3 | ||||
-rw-r--r-- | gr-fec/lib/tagged_encoder_impl.cc | 3 |
13 files changed, 749 insertions, 354 deletions
diff --git a/gr-fec/examples/fecapi_async_to_stream.grc b/gr-fec/examples/fecapi_async_to_stream.grc index 417df878d8..0692573ac1 100644 --- a/gr-fec/examples/fecapi_async_to_stream.grc +++ b/gr-fec/examples/fecapi_async_to_stream.grc @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='ASCII'?> <flow_graph> - <timestamp>Sat May 17 16:48:27 2014</timestamp> + <timestamp>Sat May 17 19:23:33 2014</timestamp> <block> <key>options</key> <param> @@ -709,42 +709,85 @@ </param> </block> <block> - <key>blocks_char_to_float</key> + <key>variable_dummy_encoder_def</key> <param> <key>id</key> - <value>blocks_char_to_float_0_0_0_0</value> + <value>enc_dummy</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>vlen</key> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>0</value> + </param> + <param> + <key>dim1</key> <value>1</value> </param> <param> - <key>scale</key> + <key>dim2</key> <value>1</value> </param> <param> + <key>framebits</key> + <value>8000</value> + </param> + <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> - <value></value> + <key>_coordinate</key> + <value>(598, 509)</value> </param> <param> - <key>minoutbuf</key> + <key>_rotation</key> <value>0</value> </param> + </block> + <block> + <key>variable_dummy_decoder_def</key> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>id</key> + <value>dec_dummy</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>1</value> + </param> + <param> + <key>dim1</key> + <value>1</value> + </param> + <param> + <key>dim2</key> + <value>1</value> + </param> + <param> + <key>framebits</key> + <value>8000</value> + </param> + <param> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(1200, 191)</value> + <value>(598, 588)</value> </param> <param> <key>_rotation</key> @@ -752,42 +795,97 @@ </param> </block> <block> - <key>digital_crc32_bb</key> + <key>variable_repetition_encoder_def</key> <param> <key>id</key> - <value>digital_crc32_bb_0</value> + <value>enc_rep</value> </param> <param> <key>_enabled</key> - <value>False</value> + <value>True</value> </param> <param> - <key>check</key> - <value>True</value> + <key>value</key> + <value>"ok"</value> </param> <param> - <key>lengthtagname</key> - <value>pkt_len</value> + <key>ndim</key> + <value>0</value> + </param> + <param> + <key>dim1</key> + <value>4</value> + </param> + <param> + <key>dim2</key> + <value>1</value> + </param> + <param> + <key>framebits</key> + <value>8000</value> + </param> + <param> + <key>rep</key> + <value>3</value> </param> <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> - <value></value> + <key>_coordinate</key> + <value>(780, 509)</value> </param> <param> - <key>minoutbuf</key> + <key>_rotation</key> <value>0</value> </param> + </block> + <block> + <key>variable_repetition_decoder_def</key> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>id</key> + <value>dec_rep</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>1</value> + </param> + <param> + <key>dim1</key> + <value>1</value> + </param> + <param> + <key>dim2</key> + <value>1</value> + </param> + <param> + <key>framebits</key> + <value>8000</value> + </param> + <param> + <key>rep</key> + <value>3</value> + </param> + <param> + <key>prob</key> + <value>0.5</value> + </param> + <param> + <key>alias</key> + <value></value> </param> <param> <key>_coordinate</key> - <value>(1214, 332)</value> + <value>(782, 603)</value> </param> <param> <key>_rotation</key> @@ -1130,26 +1228,22 @@ </param> </block> <block> - <key>fec_async_encoder</key> + <key>blocks_char_to_float</key> <param> <key>id</key> - <value>fec_async_encoder_0</value> + <value>blocks_char_to_float_0_1</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>encoder</key> - <value>enc_cc</value> - </param> - <param> - <key>rev_unpack</key> - <value>True</value> + <key>vlen</key> + <value>1</value> </param> <param> - <key>rev_pack</key> - <value>True</value> + <key>scale</key> + <value>1</value> </param> <param> <key>alias</key> @@ -1169,7 +1263,7 @@ </param> <param> <key>_coordinate</key> - <value>(429, 148)</value> + <value>(707, 188)</value> </param> <param> <key>_rotation</key> @@ -1177,313 +1271,334 @@ </param> </block> <block> - <key>variable_cc_encoder_def</key> + <key>qtgui_time_sink_x</key> <param> <key>id</key> - <value>enc_cc</value> + <value>qtgui_time_sink_x_0_0</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>value</key> - <value>"ok"</value> + <key>type</key> + <value>float</value> </param> <param> - <key>ndim</key> - <value>0</value> + <key>name</key> + <value>QT GUI Plot</value> </param> <param> - <key>dim1</key> - <value>1</value> + <key>size</key> + <value>5120</value> </param> <param> - <key>dim2</key> - <value>1</value> + <key>srate</key> + <value>samp_rate</value> </param> <param> - <key>framebits</key> - <value>8000</value> + <key>autoscale</key> + <value>False</value> </param> <param> - <key>k</key> - <value>k</value> + <key>ymin</key> + <value>-2</value> </param> <param> - <key>rate</key> - <value>rate</value> + <key>ymax</key> + <value>2</value> </param> <param> - <key>polys</key> - <value>polys</value> + <key>nconnections</key> + <value>1</value> </param> <param> - <key>state_start</key> - <value>0</value> + <key>update_time</key> + <value>0.01</value> </param> <param> - <key>mode</key> - <value>fec.CC_TAILBITING</value> + <key>entags</key> + <value>True</value> </param> <param> - <key>alias</key> + <key>gui_hint</key> <value></value> </param> <param> - <key>_coordinate</key> - <value>(401, 510)</value> + <key>tr_mode</key> + <value>qtgui.TRIG_MODE_FREE</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>tr_slope</key> + <value>qtgui.TRIG_SLOPE_POS</value> </param> - </block> - <block> - <key>variable_dummy_encoder_def</key> <param> - <key>id</key> - <value>enc_dummy</value> + <key>tr_level</key> + <value>0.0</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>tr_delay</key> + <value>0</value> </param> <param> - <key>value</key> - <value>"ok"</value> + <key>tr_chan</key> + <value>0</value> </param> <param> - <key>ndim</key> - <value>0</value> + <key>tr_tag</key> + <value>""</value> </param> <param> - <key>dim1</key> - <value>1</value> + <key>label1</key> + <value>Input</value> </param> <param> - <key>dim2</key> + <key>width1</key> <value>1</value> </param> <param> - <key>framebits</key> - <value>8000</value> + <key>color1</key> + <value>"blue"</value> </param> <param> - <key>alias</key> - <value></value> + <key>style1</key> + <value>1</value> </param> <param> - <key>_coordinate</key> - <value>(598, 509)</value> + <key>marker1</key> + <value>-1</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>alpha1</key> + <value>1.0</value> </param> - </block> - <block> - <key>variable_dummy_decoder_def</key> <param> - <key>id</key> - <value>dec_dummy</value> + <key>label2</key> + <value>Dummy</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>width2</key> + <value>1</value> </param> <param> - <key>value</key> - <value>"ok"</value> + <key>color2</key> + <value>"red"</value> </param> <param> - <key>ndim</key> + <key>style2</key> <value>1</value> </param> <param> - <key>dim1</key> + <key>marker2</key> + <value>-1</value> + </param> + <param> + <key>alpha2</key> + <value>0.6</value> + </param> + <param> + <key>label3</key> + <value>Rep. (Rate=3)</value> + </param> + <param> + <key>width3</key> <value>1</value> </param> <param> - <key>dim2</key> + <key>color3</key> + <value>"green"</value> + </param> + <param> + <key>style3</key> <value>1</value> </param> <param> - <key>framebits</key> - <value>8000</value> + <key>marker3</key> + <value>-1</value> </param> <param> - <key>alias</key> - <value></value> + <key>alpha3</key> + <value>1.0</value> </param> <param> - <key>_coordinate</key> - <value>(598, 588)</value> + <key>label4</key> + <value>CC (K=7, Rate=2)</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>width4</key> + <value>1</value> </param> - </block> - <block> - <key>variable_repetition_encoder_def</key> <param> - <key>id</key> - <value>enc_rep</value> + <key>color4</key> + <value>"black"</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>style4</key> + <value>1</value> </param> <param> - <key>value</key> - <value>"ok"</value> + <key>marker4</key> + <value>-1</value> </param> <param> - <key>ndim</key> - <value>0</value> + <key>alpha4</key> + <value>1.0</value> </param> <param> - <key>dim1</key> - <value>4</value> + <key>label5</key> + <value>CCSDS</value> </param> <param> - <key>dim2</key> + <key>width5</key> <value>1</value> </param> <param> - <key>framebits</key> - <value>8000</value> + <key>color5</key> + <value>"cyan"</value> </param> <param> - <key>rep</key> - <value>3</value> + <key>style5</key> + <value>1</value> </param> <param> - <key>alias</key> + <key>marker5</key> + <value>-1</value> + </param> + <param> + <key>alpha5</key> + <value>1.0</value> + </param> + <param> + <key>label6</key> <value></value> </param> <param> - <key>_coordinate</key> - <value>(780, 509)</value> + <key>width6</key> + <value>1</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>color6</key> + <value>"magenta"</value> </param> - </block> - <block> - <key>variable_repetition_decoder_def</key> <param> - <key>id</key> - <value>dec_rep</value> + <key>style6</key> + <value>1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>marker6</key> + <value>-1</value> </param> <param> - <key>value</key> - <value>"ok"</value> + <key>alpha6</key> + <value>1.0</value> </param> <param> - <key>ndim</key> - <value>1</value> + <key>label7</key> + <value></value> </param> <param> - <key>dim1</key> + <key>width7</key> <value>1</value> </param> <param> - <key>dim2</key> - <value>1</value> + <key>color7</key> + <value>"yellow"</value> </param> <param> - <key>framebits</key> - <value>8000</value> + <key>style7</key> + <value>1</value> </param> <param> - <key>rep</key> - <value>3</value> + <key>marker7</key> + <value>-1</value> </param> <param> - <key>prob</key> - <value>0.5</value> + <key>alpha7</key> + <value>1.0</value> </param> <param> - <key>alias</key> + <key>label8</key> <value></value> </param> <param> - <key>_coordinate</key> - <value>(782, 603)</value> + <key>width8</key> + <value>1</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>color8</key> + <value>"dark red"</value> </param> - </block> - <block> - <key>variable_cc_decoder_def</key> <param> - <key>id</key> - <value>dec_cc</value> + <key>style8</key> + <value>1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>marker8</key> + <value>-1</value> </param> <param> - <key>value</key> - <value>"ok"</value> + <key>alpha8</key> + <value>1.0</value> </param> <param> - <key>ndim</key> - <value>0</value> + <key>label9</key> + <value></value> </param> <param> - <key>dim1</key> + <key>width9</key> <value>1</value> </param> <param> - <key>dim2</key> - <value>4</value> + <key>color9</key> + <value>"dark green"</value> </param> <param> - <key>framebits</key> - <value>8000</value> + <key>style9</key> + <value>1</value> </param> <param> - <key>k</key> - <value>k</value> + <key>marker9</key> + <value>-1</value> </param> <param> - <key>rate</key> - <value>rate</value> + <key>alpha9</key> + <value>1.0</value> </param> <param> - <key>polys</key> - <value>polys</value> + <key>label10</key> + <value></value> </param> <param> - <key>state_start</key> - <value>0</value> + <key>width10</key> + <value>1</value> </param> <param> - <key>state_end</key> + <key>color10</key> + <value>"blue"</value> + </param> + <param> + <key>style10</key> + <value>1</value> + </param> + <param> + <key>marker10</key> <value>-1</value> </param> <param> - <key>mode</key> - <value>fec.CC_TAILBITING</value> + <key>alpha10</key> + <value>1.0</value> </param> <param> <key>alias</key> <value></value> </param> <param> + <key>affinity</key> + <value></value> + </param> + <param> <key>_coordinate</key> - <value>(400, 668)</value> + <value>(865, 58)</value> </param> <param> <key>_rotation</key> @@ -1494,7 +1609,7 @@ <key>blocks_char_to_float</key> <param> <key>id</key> - <value>blocks_char_to_float_0_1</value> + <value>blocks_char_to_float_0_0_0_0</value> </param> <param> <key>_enabled</key> @@ -1526,7 +1641,7 @@ </param> <param> <key>_coordinate</key> - <value>(707, 188)</value> + <value>(1200, 191)</value> </param> <param> <key>_rotation</key> @@ -1589,6 +1704,96 @@ </param> </block> <block> + <key>digital_crc32_bb</key> + <param> + <key>id</key> + <value>digital_crc32_bb_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>check</key> + <value>True</value> + </param> + <param> + <key>lengthtagname</key> + <value>pkt_len</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>_coordinate</key> + <value>(1214, 332)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>fec_async_encoder</key> + <param> + <key>id</key> + <value>fec_async_encoder_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>encoder</key> + <value>enc_cc</value> + </param> + <param> + <key>rev_unpack</key> + <value>True</value> + </param> + <param> + <key>rev_pack</key> + <value>True</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>_coordinate</key> + <value>(429, 148)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> <key>fec_extended_tagged_decoder</key> <param> <key>id</key> @@ -1643,6 +1848,144 @@ <value>0</value> </param> </block> + <block> + <key>variable_cc_decoder_def</key> + <param> + <key>id</key> + <value>dec_cc</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>0</value> + </param> + <param> + <key>dim1</key> + <value>1</value> + </param> + <param> + <key>dim2</key> + <value>4</value> + </param> + <param> + <key>framebits</key> + <value>8000</value> + </param> + <param> + <key>k</key> + <value>k</value> + </param> + <param> + <key>rate</key> + <value>rate</value> + </param> + <param> + <key>polys</key> + <value>polys</value> + </param> + <param> + <key>state_start</key> + <value>0</value> + </param> + <param> + <key>state_end</key> + <value>-1</value> + </param> + <param> + <key>mode</key> + <value>fec.CC_TERMINATED</value> + </param> + <param> + <key>padding</key> + <value>True</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(400, 684)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_cc_encoder_def</key> + <param> + <key>id</key> + <value>enc_cc</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>0</value> + </param> + <param> + <key>dim1</key> + <value>1</value> + </param> + <param> + <key>dim2</key> + <value>1</value> + </param> + <param> + <key>framebits</key> + <value>8000</value> + </param> + <param> + <key>k</key> + <value>k</value> + </param> + <param> + <key>rate</key> + <value>rate</value> + </param> + <param> + <key>polys</key> + <value>polys</value> + </param> + <param> + <key>state_start</key> + <value>0</value> + </param> + <param> + <key>mode</key> + <value>fec.CC_TERMINATED</value> + </param> + <param> + <key>padding</key> + <value>True</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(401, 510)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> <connection> <source_block_id>blocks_vector_source_x_0_1_0</source_block_id> <sink_block_id>blocks_throttle_0</sink_block_id> @@ -1722,12 +2065,6 @@ <sink_key>0</sink_key> </connection> <connection> - <source_block_id>blocks_repack_bits_bb_0_0</source_block_id> - <sink_block_id>blocks_char_to_float_0_0_0_0</sink_block_id> - <source_key>0</source_key> - <sink_key>0</sink_key> - </connection> - <connection> <source_block_id>blocks_char_to_float_0_1</source_block_id> <sink_block_id>fec_extended_tagged_decoder_0</sink_block_id> <source_key>0</source_key> @@ -1739,4 +2076,10 @@ <source_key>0</source_key> <sink_key>0</sink_key> </connection> + <connection> + <source_block_id>blocks_char_to_float_0_1</source_block_id> + <sink_block_id>qtgui_time_sink_x_0_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> </flow_graph> diff --git a/gr-fec/examples/fecapi_tagged_decoders.grc b/gr-fec/examples/fecapi_tagged_decoders.grc index a2e521deb3..2c9279fc3e 100644 --- a/gr-fec/examples/fecapi_tagged_decoders.grc +++ b/gr-fec/examples/fecapi_tagged_decoders.grc @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='ASCII'?> <flow_graph> - <timestamp>Sat May 17 17:05:02 2014</timestamp> + <timestamp>Sat May 17 19:22:20 2014</timestamp> <block> <key>options</key> <param> @@ -583,136 +583,6 @@ </param> </block> <block> - <key>variable_cc_encoder_def</key> - <param> - <key>id</key> - <value>enc_cc</value> - </param> - <param> - <key>_enabled</key> - <value>True</value> - </param> - <param> - <key>value</key> - <value>"ok"</value> - </param> - <param> - <key>ndim</key> - <value>0</value> - </param> - <param> - <key>dim1</key> - <value>1</value> - </param> - <param> - <key>dim2</key> - <value>1</value> - </param> - <param> - <key>framebits</key> - <value>MTU*8</value> - </param> - <param> - <key>k</key> - <value>k</value> - </param> - <param> - <key>rate</key> - <value>rate</value> - </param> - <param> - <key>polys</key> - <value>polys</value> - </param> - <param> - <key>state_start</key> - <value>0</value> - </param> - <param> - <key>mode</key> - <value>fec.CC_STREAMING</value> - </param> - <param> - <key>alias</key> - <value></value> - </param> - <param> - <key>_coordinate</key> - <value>(166, 519)</value> - </param> - <param> - <key>_rotation</key> - <value>0</value> - </param> - </block> - <block> - <key>variable_cc_decoder_def</key> - <param> - <key>id</key> - <value>dec_cc</value> - </param> - <param> - <key>_enabled</key> - <value>True</value> - </param> - <param> - <key>value</key> - <value>"ok"</value> - </param> - <param> - <key>ndim</key> - <value>1</value> - </param> - <param> - <key>dim1</key> - <value>1</value> - </param> - <param> - <key>dim2</key> - <value>4</value> - </param> - <param> - <key>framebits</key> - <value>MTU*8</value> - </param> - <param> - <key>k</key> - <value>k</value> - </param> - <param> - <key>rate</key> - <value>rate</value> - </param> - <param> - <key>polys</key> - <value>polys</value> - </param> - <param> - <key>state_start</key> - <value>0</value> - </param> - <param> - <key>state_end</key> - <value>-1</value> - </param> - <param> - <key>mode</key> - <value>fec.CC_STREAMING</value> - </param> - <param> - <key>alias</key> - <value></value> - </param> - <param> - <key>_coordinate</key> - <value>(166, 678)</value> - </param> - <param> - <key>_rotation</key> - <value>0</value> - </param> - </block> - <block> <key>variable_dummy_decoder_def</key> <param> <key>id</key> @@ -1917,6 +1787,73 @@ </param> </block> <block> + <key>variable_cc_encoder_def</key> + <param> + <key>id</key> + <value>enc_cc</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>0</value> + </param> + <param> + <key>dim1</key> + <value>1</value> + </param> + <param> + <key>dim2</key> + <value>1</value> + </param> + <param> + <key>framebits</key> + <value>MTU*8</value> + </param> + <param> + <key>k</key> + <value>k</value> + </param> + <param> + <key>rate</key> + <value>rate</value> + </param> + <param> + <key>polys</key> + <value>polys</value> + </param> + <param> + <key>state_start</key> + <value>0</value> + </param> + <param> + <key>mode</key> + <value>fec.CC_TERMINATED</value> + </param> + <param> + <key>padding</key> + <value>True</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(166, 519)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> <key>variable_repetition_decoder_def</key> <param> <key>id</key> @@ -1967,6 +1904,77 @@ <value>0</value> </param> </block> + <block> + <key>variable_cc_decoder_def</key> + <param> + <key>id</key> + <value>dec_cc</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>"ok"</value> + </param> + <param> + <key>ndim</key> + <value>1</value> + </param> + <param> + <key>dim1</key> + <value>1</value> + </param> + <param> + <key>dim2</key> + <value>4</value> + </param> + <param> + <key>framebits</key> + <value>MTU*8</value> + </param> + <param> + <key>k</key> + <value>k</value> + </param> + <param> + <key>rate</key> + <value>rate</value> + </param> + <param> + <key>polys</key> + <value>polys</value> + </param> + <param> + <key>state_start</key> + <value>0</value> + </param> + <param> + <key>state_end</key> + <value>-1</value> + </param> + <param> + <key>mode</key> + <value>fec.CC_TERMINATED</value> + </param> + <param> + <key>padding</key> + <value>True</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(166, 693)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> <connection> <source_block_id>blocks_vector_source_x_0_1_0</source_block_id> <sink_block_id>blocks_throttle_0</sink_block_id> diff --git a/gr-fec/grc/variable_cc_decoder_def_list.xml b/gr-fec/grc/variable_cc_decoder_def_list.xml index 87f88a02fb..7c72757868 100644 --- a/gr-fec/grc/variable_cc_decoder_def_list.xml +++ b/gr-fec/grc/variable_cc_decoder_def_list.xml @@ -10,11 +10,11 @@ <import>from gnuradio import fec</import> <var_make> #if int($ndim())==0 # -self.$(id) = $(id) = fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end, $mode) +self.$(id) = $(id) = fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end, $mode, $padding) #else if int($ndim())==1 # -self.$(id) = $(id) = map( (lambda a: fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end, $mode)), range(0,$dim1) ); #slurp +self.$(id) = $(id) = map( (lambda a: fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end, $mode, $padding)), range(0,$dim1) ); #slurp #else -self.$(id) = $(id) = map( (lambda b: map( ( lambda a: fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end, $mode)), range(0,$dim2) ) ), range(0,$dim1)); #slurp +self.$(id) = $(id) = map( (lambda b: map( ( lambda a: fec.cc_decoder.make($framebits, $k, $rate, $polys, $state_start, $state_end, $mode, $padding)), range(0,$dim2) ) ), range(0,$dim1)); #slurp #end if</var_make> <make></make> @@ -126,6 +126,21 @@ self.$(id) = $(id) = map( (lambda b: map( ( lambda a: fec.cc_decoder.make($frame </option> </param> + <param> + <name>Byte Padding</name> + <key>padding</key> + <value>False</value> + <type>enum</type> + <option> + <name>No</name> + <key>False</key> + </option> + <option> + <name>Yes</name> + <key>True</key> + </option> + </param> + <doc> </doc> </block> diff --git a/gr-fec/grc/variable_cc_encoder_def_list.xml b/gr-fec/grc/variable_cc_encoder_def_list.xml index 14c8f12e0f..1e7aa8ad71 100644 --- a/gr-fec/grc/variable_cc_encoder_def_list.xml +++ b/gr-fec/grc/variable_cc_encoder_def_list.xml @@ -10,11 +10,11 @@ <import>from gnuradio import fec</import> <var_make> #if int($ndim())==0 # -self.$(id) = $(id) = fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode) +self.$(id) = $(id) = fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode, $padding) #else if int($ndim())==1 # -self.$(id) = $(id) = map( (lambda a: fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode)), range(0,$dim1) ); #slurp +self.$(id) = $(id) = map( (lambda a: fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode, $padding)), range(0,$dim1) ); #slurp #else -self.$(id) = $(id) = map( (lambda b: map( ( lambda a: fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode)), range(0,$dim2) ) ), range(0,$dim1)); #slurp +self.$(id) = $(id) = map( (lambda b: map( ( lambda a: fec.cc_encoder_make($framebits, $k, $rate, $polys, $state_start, $mode, $padding)), range(0,$dim2) ) ), range(0,$dim1)); #slurp #end if</var_make> <make></make> @@ -119,8 +119,21 @@ self.$(id) = $(id) = map( (lambda b: map( ( lambda a: fec.cc_encoder_make($frame </option> </param> + <param> + <name>Byte Padding</name> + <key>padding</key> + <value>False</value> + <type>enum</type> + <option> + <name>No</name> + <key>False</key> + </option> + <option> + <name>Yes</name> + <key>True</key> + </option> + </param> + <doc> - This instantiates a 1-dim array of encoders or a 2-dim array of encoders - See Nick if things break. </doc> </block> diff --git a/gr-fec/include/gnuradio/fec/cc_decoder.h b/gr-fec/include/gnuradio/fec/cc_decoder.h index 8aad32846a..0d0f51bc48 100644 --- a/gr-fec/include/gnuradio/fec/cc_decoder.h +++ b/gr-fec/include/gnuradio/fec/cc_decoder.h @@ -36,7 +36,7 @@ namespace gr { typedef void(*conv_kernel)(unsigned char *Y, unsigned char *X, unsigned char *syms, unsigned char *dec, unsigned int framebits, unsigned int excess, - unsigned char *Branchtab); + unsigned char *Branchtab); /*! * \brief Convolutional Code Decoding class. @@ -83,12 +83,15 @@ namespace gr { * \param start_state Initialization state of the shift register. * \param end_state Ending state of the shift register. * \param mode cc_mode_t mode of the encoding. + * \param padded true if the encoded frame is padded + * to the nearest byte. */ static generic_decoder::sptr make (int frame_size, int k, int rate, std::vector<int> polys, int start_state=0, int end_state=-1, - cc_mode_t mode=CC_STREAMING); + cc_mode_t mode=CC_STREAMING, + bool padded=false); /*! * Sets the uncoded frame size to \p frame_size. If \p diff --git a/gr-fec/include/gnuradio/fec/cc_encoder.h b/gr-fec/include/gnuradio/fec/cc_encoder.h index 28dd5f4db2..b8ab0c199b 100644 --- a/gr-fec/include/gnuradio/fec/cc_encoder.h +++ b/gr-fec/include/gnuradio/fec/cc_encoder.h @@ -110,11 +110,13 @@ namespace gr { * \param polys Vector of polynomials as integers. * \param start_state Initialization state of the shift register. * \param mode cc_mode_t mode of the encoding. + * \param padded true if the encoded frame should be padded + * to the nearest byte. */ static generic_encoder::sptr make (int frame_size, int k, int rate, std::vector<int> polys, int start_state = 0, - cc_mode_t mode=CC_STREAMING); + cc_mode_t mode=CC_STREAMING, bool padded=false); /*! * Sets the uncoded frame size to \p frame_size. If \p diff --git a/gr-fec/lib/async_encoder_impl.cc b/gr-fec/lib/async_encoder_impl.cc index 4856dfd564..ff7480f00a 100644 --- a/gr-fec/lib/async_encoder_impl.cc +++ b/gr-fec/lib/async_encoder_impl.cc @@ -92,7 +92,7 @@ namespace gr { d_encoder->set_frame_size(nbits); int nbits_out = d_encoder->get_output_size(); - int nbytes_out = ceilf(static_cast<float>(nbits_out)/8.0f); + int nbytes_out = nbits_out/8; // buffers for bits/bytes to go to uint8_t* bits_out = (uint8_t*)volk_malloc(nbits_out*sizeof(uint8_t), diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc index 6b7daaf4b2..6739f7bf3d 100644 --- a/gr-fec/lib/cc_decoder_impl.cc +++ b/gr-fec/lib/cc_decoder_impl.cc @@ -40,23 +40,24 @@ namespace gr { cc_decoder::make(int frame_size, int k, int rate, std::vector<int> polys, int start_state, int end_state, - cc_mode_t mode) + cc_mode_t mode, bool padded) { return generic_decoder::sptr (new cc_decoder_impl(frame_size, k, rate, polys, - start_state, end_state, mode)); + start_state, end_state, mode, padded)); } cc_decoder_impl::cc_decoder_impl(int frame_size, int k, int rate, std::vector<int> polys, int start_state, int end_state, - cc_mode_t mode) + cc_mode_t mode, bool padded) : generic_decoder("cc_decoder"), d_k(k), d_rate(rate), d_partial_rate(rate), d_polys(polys), d_mode(mode), + d_padding(0), d_start_state_chaining(start_state), d_start_state_nonchaining(start_state), d_end_state_nonchaining(end_state) @@ -65,7 +66,12 @@ namespace gr { // based on this value. d_max_frame_size = frame_size; d_frame_size = frame_size; - //set_frame_size(frame_size); + + // set up a padding factor. If padding, the encoded frame was exteded + // by this many bits to fit into a full byte. + if(padded && (mode == CC_TERMINATED)) { + d_padding = static_cast<int>(8.0f*ceilf(d_rate*(d_k-1)/8.0f) - (d_rate*(d_k-1))); + } d_vp = new struct v; @@ -170,7 +176,7 @@ namespace gr { cc_decoder_impl::get_input_size() { if(d_mode == CC_TERMINATED) { - return d_rate * (d_frame_size + d_k - 1); + return d_rate * (d_frame_size + d_k - 1) + d_padding; } else { return d_rate * d_frame_size; @@ -365,7 +371,6 @@ namespace gr { d += tailsize * d_decision_t_size ; /* Look past tail */ int retval; int dif = tailsize - (d_k - 1); - //printf("break, %d, %d\n", dif, (nbits+dif)%d_frame_size); decision_t dec; while(nbits-- > d_frame_size - (d_k - 1)) { int k; @@ -373,8 +378,6 @@ namespace gr { k = (dec.w[(endstate>>d_ADDSHIFT)/32] >> ((endstate>>d_ADDSHIFT)%32)) & 1; endstate = (endstate >> 1) | (k << (d_k-2+d_ADDSHIFT)); - //data[((nbits+dif)%nbits)>>3] = endstate>>d_SUBSHIFT; - //printf("%d, %d\n", k, (nbits+dif)%d_frame_size); data[((nbits+dif)%d_frame_size)] = k; retval = endstate; @@ -400,7 +403,7 @@ namespace gr { { bool ret = true; if(frame_size > d_max_frame_size) { - GR_LOG_INFO(d_logger, boost::format("tried to set frame to %1%; max possible is %2%") \ + GR_LOG_INFO(d_logger, boost::format("cc_decoder: tried to set frame to %1%; max possible is %2%") \ % frame_size % d_max_frame_size); frame_size = d_max_frame_size; ret = false; @@ -412,7 +415,7 @@ namespace gr { case(CC_TAILBITING): d_veclen = d_frame_size + (6 * (d_k - 1)); if(d_veclen * d_rate > d_managed_in_size) { - throw std::runtime_error("attempt to resize beyond d_managed_in buffer size!\n"); + throw std::runtime_error("cc_decoder: attempt to resize beyond d_managed_in buffer size!\n"); } break; @@ -421,7 +424,13 @@ namespace gr { break; case(CC_STREAMING): + d_veclen = d_frame_size + d_k - 1; + break; + case(CC_TERMINATED): + // If the input is being padded out to a byte, we know the + // real frame size is without the padding. + d_frame_size -= d_padding * d_rate; d_veclen = d_frame_size + d_k - 1; break; diff --git a/gr-fec/lib/cc_decoder_impl.h b/gr-fec/lib/cc_decoder_impl.h index d0b1af35a3..33ced0250c 100644 --- a/gr-fec/lib/cc_decoder_impl.h +++ b/gr-fec/lib/cc_decoder_impl.h @@ -67,6 +67,7 @@ namespace gr { unsigned int d_partial_rate; std::vector<int> d_polys; cc_mode_t d_mode; + int d_padding; struct v* d_vp; unsigned char* d_managed_in; @@ -90,7 +91,7 @@ namespace gr { cc_decoder_impl(int frame_size, int k, int rate, std::vector<int> polys, int start_state = 0, int end_state = -1, - cc_mode_t mode=CC_STREAMING); + cc_mode_t mode=CC_STREAMING, bool padded=false); ~cc_decoder_impl(); void generic_work(void *inbuffer, void *outbuffer); diff --git a/gr-fec/lib/cc_encoder_impl.cc b/gr-fec/lib/cc_encoder_impl.cc index abbf1a8f1b..90d2ee4c1c 100644 --- a/gr-fec/lib/cc_encoder_impl.cc +++ b/gr-fec/lib/cc_encoder_impl.cc @@ -42,21 +42,21 @@ namespace gr { generic_encoder::sptr cc_encoder::make(int frame_size, int k, int rate, std::vector<int> polys, int start_state, - cc_mode_t mode) + cc_mode_t mode, bool padded) { return generic_encoder::sptr (new cc_encoder_impl(frame_size, k, rate, polys, start_state, - mode)); + mode, padded)); } cc_encoder_impl::cc_encoder_impl(int frame_size, int k, int rate, std::vector<int> polys, int start_state, - cc_mode_t mode) + cc_mode_t mode, bool padded) : generic_encoder("cc_encoder"), d_rate(rate), d_k(k), d_polys(polys), d_start_state(start_state), - d_mode(mode) + d_mode(mode), d_padding(0) { if(static_cast<size_t>(d_rate) != d_polys.size()) { throw std::runtime_error("cc_encoder: Number of polynomials must be the same as the value of rate"); @@ -64,6 +64,12 @@ namespace gr { partab_init(); + // set up a padding factor. If padding, extends the encoding + // by this many bits to fit into a full byte. + if(padded && (mode == CC_TERMINATED)) { + d_padding = static_cast<int>(8.0f*ceilf(d_rate*(d_k-1)/8.0f) - (d_rate*(d_k-1))); + } + d_max_frame_size = frame_size; set_frame_size(frame_size); } @@ -98,7 +104,7 @@ namespace gr { d_frame_size = frame_size; if(d_mode == CC_TERMINATED) { - d_output_size = d_rate * (d_frame_size + d_k - 1); + d_output_size = d_rate * (d_frame_size + d_k - 1) + d_padding; } /* else if(d_trunc_intrinsic) { diff --git a/gr-fec/lib/cc_encoder_impl.h b/gr-fec/lib/cc_encoder_impl.h index 008887559b..77d5f42462 100644 --- a/gr-fec/lib/cc_encoder_impl.h +++ b/gr-fec/lib/cc_encoder_impl.h @@ -51,6 +51,7 @@ namespace gr { int d_decision_t_size; int d_start_state; cc_mode_t d_mode; + int d_padding; int d_output_size; int parity(int x); @@ -60,7 +61,7 @@ namespace gr { public: cc_encoder_impl(int frame_size, int k, int rate, std::vector<int> polys, int start_state = 0, - cc_mode_t mode=CC_STREAMING); + cc_mode_t mode=CC_STREAMING, bool padded=false); ~cc_encoder_impl(); bool set_frame_size(unsigned int frame_size); diff --git a/gr-fec/lib/tagged_decoder_impl.cc b/gr-fec/lib/tagged_decoder_impl.cc index bccf5147ff..2841b5f57f 100644 --- a/gr-fec/lib/tagged_decoder_impl.cc +++ b/gr-fec/lib/tagged_decoder_impl.cc @@ -85,9 +85,6 @@ namespace gr { d_decoder->generic_work((void*)in, (void*)out); - add_item_tag(0, nitems_written(0) + d_decoder->get_output_size()*d_output_item_size, - pmt::intern(d_decoder->alias()), pmt::PMT_T, pmt::intern(alias())); - return d_decoder->get_output_size(); } diff --git a/gr-fec/lib/tagged_encoder_impl.cc b/gr-fec/lib/tagged_encoder_impl.cc index 4d19e4c668..8461a56ef7 100644 --- a/gr-fec/lib/tagged_encoder_impl.cc +++ b/gr-fec/lib/tagged_encoder_impl.cc @@ -86,9 +86,6 @@ namespace gr { d_encoder->generic_work((void*)(inbuffer), (void*)(outbuffer)); - add_item_tag(0, nitems_written(0) + (d_encoder->get_output_size()*d_output_item_size), - pmt::intern(d_encoder->alias()), pmt::PMT_T, pmt::intern(alias())); - return d_encoder->get_output_size(); } |