diff options
Diffstat (limited to 'gr-vocoder')
-rw-r--r-- | gr-vocoder/examples/loopback-codec2.grc | 1184 | ||||
-rw-r--r-- | gr-vocoder/grc/vocoder_codec2_decode_ps.xml | 1 | ||||
-rw-r--r-- | gr-vocoder/grc/vocoder_codec2_encode_sp.xml | 2 | ||||
-rw-r--r-- | gr-vocoder/include/gnuradio/vocoder/codec2_decode_ps.h | 10 | ||||
-rw-r--r-- | gr-vocoder/include/gnuradio/vocoder/codec2_encode_sp.h | 15 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2/codec2.h | 1 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_decode_ps_impl.cc | 23 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_decode_ps_impl.h | 7 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_encode_sp_impl.cc | 23 | ||||
-rw-r--r-- | gr-vocoder/lib/codec2_encode_sp_impl.h | 7 | ||||
-rwxr-xr-x | gr-vocoder/python/vocoder/qa_codec2_vocoder.py | 4 |
11 files changed, 1261 insertions, 16 deletions
diff --git a/gr-vocoder/examples/loopback-codec2.grc b/gr-vocoder/examples/loopback-codec2.grc new file mode 100644 index 0000000000..4d22c8fc74 --- /dev/null +++ b/gr-vocoder/examples/loopback-codec2.grc @@ -0,0 +1,1184 @@ +<?xml version='1.0' encoding='ASCII'?> +<flow_graph> + <timestamp>Fri Mar 7 18:08:43 2014</timestamp> + <block> + <key>options</key> + <param> + <key>id</key> + <value>loopback_codec2</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>title</key> + <value>Codec2 Looback Test</value> + </param> + <param> + <key>author</key> + <value>Martin Braun</value> + </param> + <param> + <key>description</key> + <value>An example how to use the Codec2 Vocoder</value> + </param> + <param> + <key>window_size</key> + <value>1280, 1024</value> + </param> + <param> + <key>generate_options</key> + <value>qt_gui</value> + </param> + <param> + <key>category</key> + <value>Custom</value> + </param> + <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(0, -1)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>scale</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>2**13</value> + </param> + <param> + <key>_coordinate</key> + <value>(301, -1)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>id</key> + <value>samp_rate</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>value</key> + <value>48000</value> + </param> + <param> + <key>_coordinate</key> + <value>(186, 0)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_float_to_short</key> + <param> + <key>id</key> + <value>blocks_float_to_short_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + <param> + <key>scale</key> + <value>scale</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>(417, 119)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>qtgui_time_sink_x</key> + <param> + <key>id</key> + <value>qtgui_time_sink_x_0_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>float</value> + </param> + <param> + <key>name</key> + <value>Audio Pre-Encoding</value> + </param> + <param> + <key>size</key> + <value>1024</value> + </param> + <param> + <key>srate</key> + <value>8000</value> + </param> + <param> + <key>ymin</key> + <value>-1</value> + </param> + <param> + <key>ymax</key> + <value>1</value> + </param> + <param> + <key>nconnections</key> + <value>1</value> + </param> + <param> + <key>update_time</key> + <value>0.10</value> + </param> + <param> + <key>tr_mode</key> + <value>qtgui.TRIG_MODE_FREE</value> + </param> + <param> + <key>tr_slope</key> + <value>qtgui.TRIG_SLOPE_POS</value> + </param> + <param> + <key>tr_level</key> + <value>0.0</value> + </param> + <param> + <key>tr_delay</key> + <value>0</value> + </param> + <param> + <key>tr_chan</key> + <value>0</value> + </param> + <param> + <key>tr_tag</key> + <value>""</value> + </param> + <param> + <key>entags</key> + <value>True</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(434, 202)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>rational_resampler_xxx</key> + <param> + <key>id</key> + <value>rational_resampler_xxx_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>fff</value> + </param> + <param> + <key>interp</key> + <value>1</value> + </param> + <param> + <key>decim</key> + <value>6</value> + </param> + <param> + <key>taps</key> + <value></value> + </param> + <param> + <key>fbw</key> + <value>0</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>(204, 94)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_source</key> + <param> + <key>id</key> + <value>virtual_source_1_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>Decoded Speech</value> + </param> + <param> + <key>_coordinate</key> + <value>(3, 449)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>variable_qtgui_check_box</key> + <param> + <key>id</key> + <value>play_encoded</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>label</key> + <value>Encode Audio</value> + </param> + <param> + <key>type</key> + <value>int</value> + </param> + <param> + <key>value</key> + <value>True</value> + </param> + <param> + <key>true</key> + <value>1</value> + </param> + <param> + <key>false</key> + <value>0</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(834, 0)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blks2_selector</key> + <param> + <key>id</key> + <value>blks2_selector_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>float</value> + </param> + <param> + <key>num_inputs</key> + <value>2</value> + </param> + <param> + <key>num_outputs</key> + <value>1</value> + </param> + <param> + <key>input_index</key> + <value>play_encoded</value> + </param> + <param> + <key>output_index</key> + <value>0</value> + </param> + <param> + <key>vlen</key> + <value>1</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>(280, 411)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>rational_resampler_xxx</key> + <param> + <key>id</key> + <value>rational_resampler_xxx_1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>fff</value> + </param> + <param> + <key>interp</key> + <value>6</value> + </param> + <param> + <key>decim</key> + <value>1</value> + </param> + <param> + <key>taps</key> + <value></value> + </param> + <param> + <key>fbw</key> + <value>0</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>(478, 400)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>audio_sink</key> + <param> + <key>id</key> + <value>audio_sink_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>samp_rate</key> + <value>48000</value> + </param> + <param> + <key>device_name</key> + <value></value> + </param> + <param> + <key>ok_to_block</key> + <value>True</value> + </param> + <param> + <key>num_inputs</key> + <value>1</value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(706, 424)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>vocoder_codec2_encode_sp</key> + <param> + <key>id</key> + <value>vocoder_codec2_encode_sp_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</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>(590, 123)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_vector_to_stream</key> + <param> + <key>id</key> + <value>blocks_vector_to_stream_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>num_items</key> + <value>50</value> + </param> + <param> + <key>vlen</key> + <value>1</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>(822, 119)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_source</key> + <param> + <key>id</key> + <value>virtual_source_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>Encoded Speech</value> + </param> + <param> + <key>_coordinate</key> + <value>(0, 298)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_stream_to_vector</key> + <param> + <key>id</key> + <value>blocks_stream_to_vector_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>num_items</key> + <value>50</value> + </param> + <param> + <key>vlen</key> + <value>1</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>(444, 298)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>vocoder_codec2_decode_ps</key> + <param> + <key>id</key> + <value>vocoder_codec2_decode_ps_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</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>(641, 302)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_short_to_float</key> + <param> + <key>id</key> + <value>blocks_short_to_float_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + <param> + <key>scale</key> + <value>scale</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>(735, 361)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_sink</key> + <param> + <key>id</key> + <value>virtual_sink_2</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>Decoded Speech</value> + </param> + <param> + <key>_coordinate</key> + <value>(960, 393)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>qtgui_time_sink_x</key> + <param> + <key>id</key> + <value>qtgui_time_sink_x_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>float</value> + </param> + <param> + <key>name</key> + <value>Audio Post-Encoding</value> + </param> + <param> + <key>size</key> + <value>1024</value> + </param> + <param> + <key>srate</key> + <value>8000</value> + </param> + <param> + <key>ymin</key> + <value>-1</value> + </param> + <param> + <key>ymax</key> + <value>1</value> + </param> + <param> + <key>nconnections</key> + <value>1</value> + </param> + <param> + <key>update_time</key> + <value>0.10</value> + </param> + <param> + <key>tr_mode</key> + <value>qtgui.TRIG_MODE_FREE</value> + </param> + <param> + <key>tr_slope</key> + <value>qtgui.TRIG_SLOPE_POS</value> + </param> + <param> + <key>tr_level</key> + <value>0.0</value> + </param> + <param> + <key>tr_delay</key> + <value>0</value> + </param> + <param> + <key>tr_chan</key> + <value>0</value> + </param> + <param> + <key>tr_tag</key> + <value>""</value> + </param> + <param> + <key>entags</key> + <value>True</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_coordinate</key> + <value>(960, 283)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>audio_source</key> + <param> + <key>id</key> + <value>audio_source_0</value> + </param> + <param> + <key>_enabled</key> + <value>False</value> + </param> + <param> + <key>samp_rate</key> + <value>48000</value> + </param> + <param> + <key>device_name</key> + <value></value> + </param> + <param> + <key>ok_to_block</key> + <value>True</value> + </param> + <param> + <key>num_outputs</key> + <value>1</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>(0, 117)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_wavfile_source</key> + <param> + <key>id</key> + <value>blocks_wavfile_source_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>file</key> + <value>/home/mbr0wn/12345.wav</value> + </param> + <param> + <key>repeat</key> + <value>True</value> + </param> + <param> + <key>nchan</key> + <value>1</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>(-1, 225)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_packed_to_unpacked_xx</key> + <param> + <key>id</key> + <value>blocks_packed_to_unpacked_xx_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>bits_per_chunk</key> + <value>1</value> + </param> + <param> + <key>endianness</key> + <value>gr.GR_LSB_FIRST</value> + </param> + <param> + <key>num_ports</key> + <value>1</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>(229, 290)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_sink</key> + <param> + <key>id</key> + <value>virtual_sink_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>Encoded Speech</value> + </param> + <param> + <key>_coordinate</key> + <value>(908, 207)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>blocks_unpacked_to_packed_xx</key> + <param> + <key>id</key> + <value>blocks_unpacked_to_packed_xx_0</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>bits_per_chunk</key> + <value>1</value> + </param> + <param> + <key>endianness</key> + <value>gr.GR_LSB_FIRST</value> + </param> + <param> + <key>num_ports</key> + <value>1</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>(694, 199)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_sink</key> + <param> + <key>id</key> + <value>virtual_sink_1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>Raw Audio</value> + </param> + <param> + <key>_coordinate</key> + <value>(508, 25)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <block> + <key>virtual_source</key> + <param> + <key>id</key> + <value>virtual_source_1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>stream_id</key> + <value>Raw Audio</value> + </param> + <param> + <key>_coordinate</key> + <value>(-1, 389)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + </block> + <connection> + <source_block_id>audio_source_0</source_block_id> + <sink_block_id>rational_resampler_xxx_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>rational_resampler_xxx_0</source_block_id> + <sink_block_id>blocks_float_to_short_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_float_to_short_0</source_block_id> + <sink_block_id>vocoder_codec2_encode_sp_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_wavfile_source_0</source_block_id> + <sink_block_id>rational_resampler_xxx_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>rational_resampler_xxx_0</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> + <connection> + <source_block_id>rational_resampler_xxx_0</source_block_id> + <sink_block_id>virtual_sink_1</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>virtual_source_1</source_block_id> + <sink_block_id>blks2_selector_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>virtual_source_1_0</source_block_id> + <sink_block_id>blks2_selector_0</sink_block_id> + <source_key>0</source_key> + <sink_key>1</sink_key> + </connection> + <connection> + <source_block_id>rational_resampler_xxx_1</source_block_id> + <sink_block_id>audio_sink_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blks2_selector_0</source_block_id> + <sink_block_id>rational_resampler_xxx_1</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>vocoder_codec2_encode_sp_0</source_block_id> + <sink_block_id>blocks_vector_to_stream_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_vector_to_stream_0</source_block_id> + <sink_block_id>blocks_unpacked_to_packed_xx_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_unpacked_to_packed_xx_0</source_block_id> + <sink_block_id>virtual_sink_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_short_to_float_0</source_block_id> + <sink_block_id>virtual_sink_2</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_short_to_float_0</source_block_id> + <sink_block_id>qtgui_time_sink_x_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>vocoder_codec2_decode_ps_0</source_block_id> + <sink_block_id>blocks_short_to_float_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_stream_to_vector_0</source_block_id> + <sink_block_id>vocoder_codec2_decode_ps_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>virtual_source_0</source_block_id> + <sink_block_id>blocks_packed_to_unpacked_xx_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_packed_to_unpacked_xx_0</source_block_id> + <sink_block_id>blocks_stream_to_vector_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> +</flow_graph> diff --git a/gr-vocoder/grc/vocoder_codec2_decode_ps.xml b/gr-vocoder/grc/vocoder_codec2_decode_ps.xml index 708882151b..8b5f348671 100644 --- a/gr-vocoder/grc/vocoder_codec2_decode_ps.xml +++ b/gr-vocoder/grc/vocoder_codec2_decode_ps.xml @@ -12,6 +12,7 @@ <sink> <name>in</name> <type>byte</type> + <vlen>50</vlen> </sink> <source> <name>out</name> diff --git a/gr-vocoder/grc/vocoder_codec2_encode_sp.xml b/gr-vocoder/grc/vocoder_codec2_encode_sp.xml index 7a56ac6332..0fb0ecc2ff 100644 --- a/gr-vocoder/grc/vocoder_codec2_encode_sp.xml +++ b/gr-vocoder/grc/vocoder_codec2_encode_sp.xml @@ -16,7 +16,7 @@ <source> <name>out</name> <type>byte</type> + <vlen>50</vlen> </source> </block> - diff --git a/gr-vocoder/include/gnuradio/vocoder/codec2_decode_ps.h b/gr-vocoder/include/gnuradio/vocoder/codec2_decode_ps.h index e90e7b9560..041877174b 100644 --- a/gr-vocoder/include/gnuradio/vocoder/codec2_decode_ps.h +++ b/gr-vocoder/include/gnuradio/vocoder/codec2_decode_ps.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011,2013 Free Software Foundation, Inc. + * Copyright 2011,2013,2014 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -32,13 +32,19 @@ namespace gr { /*! * \brief CODEC2 Vocoder Decoder * \ingroup audio_blk + * + * Input: A vector of 50 unpacked bits forming a Codec2 frame. + * + * Output: 16-bit short values of an audio signal with sampling rate 8 kHz. + * + * See also gr::vocoder::codec2_encode_sp. */ class VOCODER_API codec2_decode_ps : virtual public sync_interpolator { public: // gr::vocoder::codec2_decode_ps::sptr typedef boost::shared_ptr<codec2_decode_ps> sptr; - + /*! * \brief Make Codec2 decoder block. */ diff --git a/gr-vocoder/include/gnuradio/vocoder/codec2_encode_sp.h b/gr-vocoder/include/gnuradio/vocoder/codec2_encode_sp.h index 9fe1c2dd43..12b91b0428 100644 --- a/gr-vocoder/include/gnuradio/vocoder/codec2_encode_sp.h +++ b/gr-vocoder/include/gnuradio/vocoder/codec2_encode_sp.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2005,2013 Free Software Foundation, Inc. + * Copyright 2005,2013,2014 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -32,13 +32,24 @@ namespace gr { /*! * \brief CODEC2 Vocoder Encoder * \ingroup audio_blk + * + * Input: Speech (audio) signal as 16-bit shorts, sampling rate 8 kHz. + * + * Output: Vector of 50 unpacked bits, forming one Codec2 frame, per 160 input samples. + * + * Note that the Codec2 library produces 7 bytes with a total of 50 bits + * per frame. The bits are MSB-first on these 7 bytes, so the first item + * of the output vector is the MSB of the first byte of the frame. + * If this block is combined with the gr::vocoder::codec2_decode_ps block, + * this will work out of the box. + * */ class VOCODER_API codec2_encode_sp : virtual public sync_decimator { public: // gr::vocoder::codec2_encode_sp::sptr typedef boost::shared_ptr<codec2_encode_sp> sptr; - + /*! * \brief Make Codec2 encoder block. */ diff --git a/gr-vocoder/lib/codec2/codec2.h b/gr-vocoder/lib/codec2/codec2.h index 88e68814fa..f812a05983 100644 --- a/gr-vocoder/lib/codec2/codec2.h +++ b/gr-vocoder/lib/codec2/codec2.h @@ -31,6 +31,7 @@ #define CODEC2_SAMPLES_PER_FRAME 160 #define CODEC2_BITS_PER_FRAME 50 +#define CODEC2_BYTES_PER_FRAME ((CODEC2_BITS_PER_FRAME + 7) / 8) // == 8 bytes when packing the 50 bits void *codec2_create(); void codec2_destroy(void *codec2_state); diff --git a/gr-vocoder/lib/codec2_decode_ps_impl.cc b/gr-vocoder/lib/codec2_decode_ps_impl.cc index 57ab62422e..a4f7cccf82 100644 --- a/gr-vocoder/lib/codec2_decode_ps_impl.cc +++ b/gr-vocoder/lib/codec2_decode_ps_impl.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2005,2011,2013 Free Software Foundation, Inc. + * Copyright 2005,2011,2013,2014 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -49,7 +49,8 @@ namespace gr { : sync_interpolator("vocoder_codec2_decode_ps", io_signature::make(1, 1, CODEC2_BITS_PER_FRAME * sizeof(char)), io_signature::make (1, 1, sizeof(short)), - CODEC2_SAMPLES_PER_FRAME) + CODEC2_SAMPLES_PER_FRAME), + d_frame_buf(CODEC2_BYTES_PER_FRAME, 0) { if((d_codec2 = codec2_create()) == 0) throw std::runtime_error("codec2_decode_ps_impl: codec2_create failed"); @@ -71,7 +72,8 @@ namespace gr { assert((noutput_items % CODEC2_SAMPLES_PER_FRAME) == 0); for(int i = 0; i < noutput_items; i += CODEC2_SAMPLES_PER_FRAME) { - codec2_decode (d_codec2, out, const_cast<unsigned char*>(in)); + pack_frame(in, &d_frame_buf[0]); + codec2_decode (d_codec2, out, const_cast<unsigned char*>(&d_frame_buf[0])); in += CODEC2_BITS_PER_FRAME * sizeof (char); out += CODEC2_SAMPLES_PER_FRAME; } @@ -79,5 +81,20 @@ namespace gr { return noutput_items; } + void + codec2_decode_ps_impl::pack_frame(const unsigned char *in_unpacked, unsigned char *out_packed) + { + memset((void *) &d_frame_buf[0], 0x00, CODEC2_BYTES_PER_FRAME); + + int byte_idx = 0, bit_idx = 0; + for(int k = 0; k < CODEC2_BITS_PER_FRAME; k++) { + out_packed[byte_idx] |= ((in_unpacked[k] & 0x01) << (7-bit_idx)); + bit_idx = (bit_idx + 1) % 8; + if (bit_idx == 0) { + byte_idx++; + } + } + } + } /* namespace vocoder */ } /* namespace gr */ diff --git a/gr-vocoder/lib/codec2_decode_ps_impl.h b/gr-vocoder/lib/codec2_decode_ps_impl.h index 54b3744adf..b9591dce74 100644 --- a/gr-vocoder/lib/codec2_decode_ps_impl.h +++ b/gr-vocoder/lib/codec2_decode_ps_impl.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011,2013 Free Software Foundation, Inc. + * Copyright 2011,2013,2014 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -32,6 +32,9 @@ namespace gr { { private: void *d_codec2; + std::vector<unsigned char> d_frame_buf; //!< Store 1 packed frame for decoding + + void pack_frame(const unsigned char *in_unpacked, unsigned char *out_packed); //!< Pack the bytes from unpacked bits for codec2 public: codec2_decode_ps_impl(); @@ -43,6 +46,6 @@ namespace gr { }; } /* namespace vocoder */ -} /* namespace gr */ +} /* namespace gr */ #endif /* INCLUDED_VOCODER_CODEC2_DECODE_PS_IMPL_H */ diff --git a/gr-vocoder/lib/codec2_encode_sp_impl.cc b/gr-vocoder/lib/codec2_encode_sp_impl.cc index 3f79e06409..fc0b3eee19 100644 --- a/gr-vocoder/lib/codec2_encode_sp_impl.cc +++ b/gr-vocoder/lib/codec2_encode_sp_impl.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2005,2011 Free Software Foundation, Inc. + * Copyright 2005,2011,2014 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -32,6 +32,8 @@ extern "C" { #include <gnuradio/io_signature.h> #include <stdexcept> +#include <iostream> +#include <iomanip> namespace gr { namespace vocoder { @@ -47,7 +49,8 @@ namespace gr { : sync_decimator("vocoder_codec2_encode_sp", io_signature::make(1, 1, sizeof(short)), io_signature::make(1, 1, CODEC2_BITS_PER_FRAME * sizeof(char)), - CODEC2_SAMPLES_PER_FRAME) + CODEC2_SAMPLES_PER_FRAME), + d_frame_buf(CODEC2_BYTES_PER_FRAME, 0) { if((d_codec2 = codec2_create()) == 0) throw std::runtime_error("codec2_encode_sp_impl: codec2_create failed"); @@ -67,7 +70,8 @@ namespace gr { unsigned char *out = (unsigned char*)output_items[0]; for(int i = 0; i < noutput_items; i++) { - codec2_encode(d_codec2, out, const_cast<short*>(in)); + codec2_encode(d_codec2, &d_frame_buf[0], const_cast<short*>(in)); + unpack_frame((const unsigned char *) &d_frame_buf[0], out); in += CODEC2_SAMPLES_PER_FRAME; out += CODEC2_BITS_PER_FRAME * sizeof(char); } @@ -75,5 +79,18 @@ namespace gr { return noutput_items; } + void + codec2_encode_sp_impl::unpack_frame(const unsigned char *packed, unsigned char *out) + { + int byte_idx = 0, bit_idx = 0; + for(int k = 0; k < CODEC2_BITS_PER_FRAME; k++) { + out[k] = (packed[byte_idx] >> (7-bit_idx)) & 0x01; + bit_idx = (bit_idx + 1) % 8; + if (bit_idx == 0) { + byte_idx++; + } + } + } + } /* namespace vocoder */ } /* namespace gr */ diff --git a/gr-vocoder/lib/codec2_encode_sp_impl.h b/gr-vocoder/lib/codec2_encode_sp_impl.h index 354bcc4718..7402d09f90 100644 --- a/gr-vocoder/lib/codec2_encode_sp_impl.h +++ b/gr-vocoder/lib/codec2_encode_sp_impl.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2005,2013 Free Software Foundation, Inc. + * Copyright 2005,2013,2014 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -32,6 +32,9 @@ namespace gr { { private: void *d_codec2; + std::vector<unsigned char> d_frame_buf; //!< Save 1 CODEC2 frame + + void unpack_frame(const unsigned char *packed, unsigned char *out); //!< Unpack the bytes from codec2 into unpacked bits public: codec2_encode_sp_impl(); @@ -43,6 +46,6 @@ namespace gr { }; } /* namespace vocoder */ -} /* namespace gr */ +} /* namespace gr */ #endif /* INCLUDED_VOCODER_CODEC2_ENCODE_SP_IMPL_H */ diff --git a/gr-vocoder/python/vocoder/qa_codec2_vocoder.py b/gr-vocoder/python/vocoder/qa_codec2_vocoder.py index b2ed734888..0e29401c7a 100755 --- a/gr-vocoder/python/vocoder/qa_codec2_vocoder.py +++ b/gr-vocoder/python/vocoder/qa_codec2_vocoder.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2011,2013 Free Software Foundation, Inc. +# Copyright 2011,2013,2014 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -54,4 +54,6 @@ class test_codec2_vocoder (gr_unittest.TestCase): self.assertEqual(expected_data, actual_result) if __name__ == '__main__': + # Note: The Vocoder is stateful, which means this test will produce failure when removing the xml option. + # Perhaps this is not the best way to test such a vocoder. gr_unittest.run(test_codec2_vocoder, "test_codec2_vocoder.xml") |