summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt28
-rw-r--r--docs/doxygen/Doxyfile.in22
-rw-r--r--gnuradio-runtime/include/gnuradio/flowgraph.h6
-rw-r--r--gnuradio-runtime/include/gnuradio/hier_block2.h7
-rw-r--r--gnuradio-runtime/lib/flowgraph.cc33
-rw-r--r--gnuradio-runtime/lib/hier_block2.cc7
-rw-r--r--gnuradio-runtime/python/gnuradio/gr/hier_block2.py6
-rw-r--r--gnuradio-runtime/python/gnuradio/gr/top_block.py28
-rw-r--r--gnuradio-runtime/swig/hier_block2.i2
-rw-r--r--gnuradio-runtime/swig/top_block.i9
-rw-r--r--gr-analog/python/analog/fm_demod.py61
-rw-r--r--gr-analog/python/analog/fm_emph.py24
-rw-r--r--gr-digital/python/digital/bpsk.py47
-rw-r--r--gr-digital/python/digital/qpsk.py48
-rw-r--r--gr-fec/lib/reed-solomon/char.h1
-rw-r--r--gr-fec/lib/reed-solomon/encode_rs.c14
-rw-r--r--gr-fec/lib/reed-solomon/init_rs.c23
-rw-r--r--gr-vocoder/doc/vocoder.dox10
-rw-r--r--gr-vocoder/examples/loopback-codec2.grc1184
-rw-r--r--gr-vocoder/examples/loopback-gsmfr.grc1078
-rw-r--r--gr-vocoder/grc/vocoder_codec2_decode_ps.xml1
-rw-r--r--gr-vocoder/grc/vocoder_codec2_encode_sp.xml2
-rw-r--r--gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml1
-rw-r--r--gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml1
-rw-r--r--gr-vocoder/include/gnuradio/vocoder/codec2_decode_ps.h10
-rw-r--r--gr-vocoder/include/gnuradio/vocoder/codec2_encode_sp.h15
-rw-r--r--gr-vocoder/include/gnuradio/vocoder/cvsd_decode_bs.h5
-rw-r--r--gr-vocoder/include/gnuradio/vocoder/cvsd_encode_sb.h6
-rw-r--r--gr-vocoder/include/gnuradio/vocoder/gsm_fr_decode_ps.h5
-rw-r--r--gr-vocoder/include/gnuradio/vocoder/gsm_fr_encode_sp.h9
-rw-r--r--gr-vocoder/lib/codec2/codec2.h1
-rw-r--r--gr-vocoder/lib/codec2_decode_ps_impl.cc23
-rw-r--r--gr-vocoder/lib/codec2_decode_ps_impl.h7
-rw-r--r--gr-vocoder/lib/codec2_encode_sp_impl.cc23
-rw-r--r--gr-vocoder/lib/codec2_encode_sp_impl.h7
-rw-r--r--gr-vocoder/lib/gsm_fr_encode_sp_impl.cc2
-rwxr-xr-xgr-vocoder/python/vocoder/qa_codec2_vocoder.py4
-rw-r--r--gr-wxgui/grc/CMakeLists.txt4
-rw-r--r--volk/lib/CMakeLists.txt19
-rw-r--r--volk/lib/volk_malloc.c8
40 files changed, 2644 insertions, 147 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f4d1862dc7..7e8688be6a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2010-2012 Free Software Foundation, Inc.
+# Copyright 2010-2012,2014 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -107,10 +107,26 @@ endif(MSVC)
# Record Compiler Info for record
STRING(TOUPPER ${CMAKE_BUILD_TYPE} GRCBTU)
set(COMPILER_INFO "")
-execute_process(COMMAND ${CMAKE_C_COMPILER} --version
- OUTPUT_VARIABLE cmake_c_compiler_version)
-execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
- OUTPUT_VARIABLE cmake_cxx_compiler_version)
+IF(MSVC)
+ IF(MSVC90) #Visual Studio 9
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 9.0")
+ SET(cmake_cxx_compiler_version "Microsoft Visual Studio 9.0")
+ ELSE(MSVC10) #Visual Studio 10
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 10.0")
+ SET(cmake_cxx_compiler_version "Microsoft Visual Studio 10.0")
+ ELSE(MSVC11) #Visual Studio 11
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 11.0")
+ SET(cmake_cxx_compiler_version "Microsoft Visual Studio 11.0")
+ ELSE(MSVC12) #Visual Studio 12
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 12.0")
+ SET(cmake_cxx_compiler_version "Microsoft Visual Studio 12.0")
+ ENDIF()
+ELSE()
+ execute_process(COMMAND ${CMAKE_C_COMPILER} --version
+ OUTPUT_VARIABLE cmake_c_compiler_version)
+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
+ OUTPUT_VARIABLE cmake_cxx_compiler_version)
+ENDIF(MSVC)
set(COMPILER_INFO "${CMAKE_C_COMPILER}:::${CMAKE_C_FLAGS_${GRCBTU}} ${CMAKE_C_FLAGS}\n${CMAKE_CXX_COMPILER}:::${CMAKE_CXX_FLAGS_${GRCBTU}} ${CMAKE_CXX_FLAGS}\n" )
# Convert to a C string to compile and display properly
@@ -292,7 +308,6 @@ list(APPEND GR_TEST_PYTHON_DIRS
########################################################################
# Add subdirectories (in order of deps)
########################################################################
-add_subdirectory(docs)
add_subdirectory(gnuradio-runtime)
add_subdirectory(gr-blocks)
add_subdirectory(grc)
@@ -316,6 +331,7 @@ add_subdirectory(gr-vocoder)
add_subdirectory(gr-fcd)
add_subdirectory(gr-wavelet)
add_subdirectory(gr-wxgui)
+add_subdirectory(docs)
# Install our Cmake modules into $prefix/lib/cmake/gnuradio
# See "Package Configuration Files" on page:
diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in
index f87efd031d..3dc58bfaf4 100644
--- a/docs/doxygen/Doxyfile.in
+++ b/docs/doxygen/Doxyfile.in
@@ -123,7 +123,27 @@ STRIP_FROM_PATH =
# definition is used. Otherwise one should specify the include paths that
# are normally passed to the compiler using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH = @CMAKE_SOURCE_DIR@/gnuradio-runtime/include \
+ @CMAKE_SOURCE_DIR@/gr-analog/include \
+ @CMAKE_SOURCE_DIR@/gr-atsc/include \
+ @CMAKE_SOURCE_DIR@/gr-audio/include \
+ @CMAKE_SOURCE_DIR@/gr-blocks/include \
+ @CMAKE_SOURCE_DIR@/gr-channels/include \
+ @CMAKE_SOURCE_DIR@/gr-comedi/include \
+ @CMAKE_SOURCE_DIR@/gr-digital/include \
+ @CMAKE_SOURCE_DIR@/gr-fcd/include \
+ @CMAKE_SOURCE_DIR@/gr-fec/include \
+ @CMAKE_SOURCE_DIR@/gr-fft/include \
+ @CMAKE_SOURCE_DIR@/gr-filter/include \
+ @CMAKE_SOURCE_DIR@/gr-noaa/include \
+ @CMAKE_SOURCE_DIR@/gr-pager/include \
+ @CMAKE_SOURCE_DIR@/gr-qtgui/include \
+ @CMAKE_SOURCE_DIR@/gr-trellis/include \
+ @CMAKE_SOURCE_DIR@/gr-uhd/include \
+ @CMAKE_SOURCE_DIR@/gr-video-sdl/include \
+ @CMAKE_SOURCE_DIR@/gr-vocoder/include \
+ @CMAKE_SOURCE_DIR@/gr-wxgui/include \
+ @CMAKE_SOURCE_DIR@/volk/include
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
diff --git a/gnuradio-runtime/include/gnuradio/flowgraph.h b/gnuradio-runtime/include/gnuradio/flowgraph.h
index 1271c2d60e..1c04a5f21d 100644
--- a/gnuradio-runtime/include/gnuradio/flowgraph.h
+++ b/gnuradio-runtime/include/gnuradio/flowgraph.h
@@ -165,7 +165,7 @@ namespace gr {
// Connect two msg endpoints
void connect(const msg_endpoint &src, const msg_endpoint &dst);
-
+
// Disconnect two msg endpoints
void disconnect(const msg_endpoint &src, const msg_endpoint &dst);
@@ -177,7 +177,7 @@ namespace gr {
// Return vector of edges
const edge_vector_t &edges() const { return d_edges; }
-
+
// Return vector of msg edges
const msg_edge_vector_t &msg_edges() const { return d_msg_edges; }
@@ -265,6 +265,8 @@ namespace gr {
return os;
}
+ std::string dot_graph_fg (flowgraph_sptr fg);
+
} /* namespace gr */
#endif /* INCLUDED_GR_RUNTIME_FLOWGRAPH_H */
diff --git a/gnuradio-runtime/include/gnuradio/hier_block2.h b/gnuradio-runtime/include/gnuradio/hier_block2.h
index 3f41930d16..1bf8dddc1a 100644
--- a/gnuradio-runtime/include/gnuradio/hier_block2.h
+++ b/gnuradio-runtime/include/gnuradio/hier_block2.h
@@ -179,7 +179,7 @@ namespace gr {
bool has_msg_port(pmt::pmt_t which_port) {
return message_port_is_hier(which_port) || basic_block::has_msg_port(which_port);
}
-
+
bool message_port_is_hier(pmt::pmt_t port_id) {
return message_port_is_hier_in(port_id) || message_port_is_hier_out(port_id);
}
@@ -235,6 +235,11 @@ namespace gr {
std::vector<int> processor_affinity();
};
+ /*!
+ * \brief Return hierarchical block's flow graph represented in dot language
+ */
+ GR_RUNTIME_API std::string dot_graph(hier_block2_sptr hierblock2);
+
inline hier_block2_sptr cast_to_hier_block2_sptr(basic_block_sptr block) {
return boost::dynamic_pointer_cast<hier_block2, basic_block>(block);
}
diff --git a/gnuradio-runtime/lib/flowgraph.cc b/gnuradio-runtime/lib/flowgraph.cc
index 634236dea0..3d8dfea65a 100644
--- a/gnuradio-runtime/lib/flowgraph.cc
+++ b/gnuradio-runtime/lib/flowgraph.cc
@@ -149,7 +149,7 @@ namespace gr {
}
}
- void
+ void
flowgraph::check_valid_port(const msg_endpoint &e)
{
if(FLOWGRAPH_DEBUG)
@@ -496,7 +496,7 @@ namespace gr {
check_valid_port(src);
check_valid_port(dst);
for(msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) {
- if(p->src() == src && p->dst() == dst){
+ if(p->src() == src && p->dst() == dst){
throw std::runtime_error("connect called on already connected edge!");
}
}
@@ -517,4 +517,33 @@ namespace gr {
throw std::runtime_error("disconnect called on non-connected edge!");
}
+ std::string
+ dot_graph_fg(flowgraph_sptr fg)
+ {
+ basic_block_vector_t blocks = fg->calc_used_blocks();
+ edge_vector_t edges = fg->edges();
+
+ std::stringstream out;
+
+ out << "digraph flowgraph {" << std::endl;
+
+ // Define nodes and set labels
+ for(basic_block_viter_t block = blocks.begin(); block != blocks.end(); ++block) {
+ out << (*block)->unique_id()
+ << " [ label=\"" << (*block)->name() << "\" ]"
+ << std::endl;
+ }
+
+ // Define edges
+ for(edge_viter_t edge = edges.begin(); edge != edges.end(); ++edge) {
+ out << edge->src().block()->unique_id()
+ << " -> "
+ << edge->dst().block()->unique_id() << std::endl;
+ }
+
+ out << "}" << std::endl;
+
+ return out.str();
+ }
+
} /* namespace gr */
diff --git a/gnuradio-runtime/lib/hier_block2.cc b/gnuradio-runtime/lib/hier_block2.cc
index e0acba30a0..f145b9344b 100644
--- a/gnuradio-runtime/lib/hier_block2.cc
+++ b/gnuradio-runtime/lib/hier_block2.cc
@@ -26,6 +26,7 @@
#include <gnuradio/hier_block2.h>
#include <gnuradio/io_signature.h>
+#include <gnuradio/flowgraph.h>
#include "hier_block2_detail.h"
#include <iostream>
@@ -175,4 +176,10 @@ namespace gr {
return d_detail->processor_affinity();
}
+ std::string
+ dot_graph(hier_block2_sptr hierblock2)
+ {
+ return dot_graph_fg(hierblock2->flatten());
+ }
+
} /* namespace gr */
diff --git a/gnuradio-runtime/python/gnuradio/gr/hier_block2.py b/gnuradio-runtime/python/gnuradio/gr/hier_block2.py
index a254a58c72..d7cea3a9a3 100644
--- a/gnuradio-runtime/python/gnuradio/gr/hier_block2.py
+++ b/gnuradio-runtime/python/gnuradio/gr/hier_block2.py
@@ -19,7 +19,7 @@
# Boston, MA 02110-1301, USA.
#
-from runtime_swig import hier_block2_swig
+from runtime_swig import hier_block2_swig, dot_graph
import pmt
#
@@ -126,3 +126,7 @@ class hier_block2(object):
def message_port_register_hier_out(self, portname):
self.primitive_message_port_register_hier_out(pmt.intern(portname));
+ def dot_graph(self):
+ '''Return graph representation in dot language'''
+ return dot_graph(self._hb)
+
diff --git a/gnuradio-runtime/python/gnuradio/gr/top_block.py b/gnuradio-runtime/python/gnuradio/gr/top_block.py
index e4d1f4194a..58332c3421 100644
--- a/gnuradio-runtime/python/gnuradio/gr/top_block.py
+++ b/gnuradio-runtime/python/gnuradio/gr/top_block.py
@@ -21,7 +21,8 @@
from runtime_swig import top_block_swig, \
top_block_wait_unlocked, top_block_run_unlocked, \
- top_block_start_unlocked, top_block_stop_unlocked
+ top_block_start_unlocked, top_block_stop_unlocked, \
+ dot_graph_tb
#import gnuradio.gr.gr_threading as _threading
import gr_threading as _threading
@@ -92,18 +93,18 @@ class top_block(object):
python subclassing.
"""
def __init__(self, name="top_block"):
- self._tb = top_block_swig(name)
+ self._tb = top_block_swig(name)
def __getattr__(self, name):
if not hasattr(self, "_tb"):
raise RuntimeError("top_block: invalid state--did you forget to call gr.top_block.__init__ in a derived class?")
- return getattr(self._tb, name)
+ return getattr(self._tb, name)
def start(self, max_noutput_items=10000000):
- top_block_start_unlocked(self._tb, max_noutput_items)
+ top_block_start_unlocked(self._tb, max_noutput_items)
def stop(self):
- top_block_stop_unlocked(self._tb)
+ top_block_stop_unlocked(self._tb)
def run(self, max_noutput_items=10000000):
self.start(max_noutput_items)
@@ -122,16 +123,16 @@ class top_block(object):
'''
if len (points) < 1:
raise ValueError, ("connect requires at least one endpoint; %d provided." % (len (points),))
- else:
- if len(points) == 1:
- self._tb.primitive_connect(points[0].to_basic_block())
- else:
- for i in range (1, len (points)):
- self._connect(points[i-1], points[i])
+ else:
+ if len(points) == 1:
+ self._tb.primitive_connect(points[0].to_basic_block())
+ else:
+ for i in range (1, len (points)):
+ self._connect(points[i-1], points[i])
def msg_connect(self, src, srcport, dst, dstport):
self.primitive_msg_connect(src.to_basic_block(), srcport, dst.to_basic_block(), dstport);
-
+
def msg_disconnect(self, src, srcport, dst, dstport):
self.primitive_msg_disconnect(src.to_basic_block(), srcport, dst.to_basic_block(), dstport);
@@ -169,3 +170,6 @@ class top_block(object):
self._tb.primitive_disconnect(src_block.to_basic_block(), src_port,
dst_block.to_basic_block(), dst_port)
+ def dot_graph(self):
+ '''Return graph representation in dot language'''
+ return dot_graph_tb(self._tb)
diff --git a/gnuradio-runtime/swig/hier_block2.i b/gnuradio-runtime/swig/hier_block2.i
index 87c936544a..053f24721d 100644
--- a/gnuradio-runtime/swig/hier_block2.i
+++ b/gnuradio-runtime/swig/hier_block2.i
@@ -93,4 +93,6 @@ namespace gr {
gr::hier_block2_sptr to_hier_block2(); // Needed for Python type coercion
};
+
+ std::string dot_graph(hier_block2_sptr hierblock2);
}
diff --git a/gnuradio-runtime/swig/top_block.i b/gnuradio-runtime/swig/top_block.i
index 485159972b..60c9e1a232 100644
--- a/gnuradio-runtime/swig/top_block.i
+++ b/gnuradio-runtime/swig/top_block.i
@@ -53,7 +53,7 @@ namespace gr {
gr::top_block_sptr to_top_block(); // Needed for Python type coercion
};
}
-
+
#ifdef SWIGPYTHON
%inline %{
@@ -88,6 +88,13 @@ void top_block_stop_unlocked(gr::top_block_sptr r) throw (std::runtime_error)
r->stop();
)
}
+
+std::string
+dot_graph_tb(gr::top_block_sptr r)
+{
+ return dot_graph(r);
+}
+
%}
#endif
diff --git a/gr-analog/python/analog/fm_demod.py b/gr-analog/python/analog/fm_demod.py
index 1976a076ca..4e3c01d194 100644
--- a/gr-analog/python/analog/fm_demod.py
+++ b/gr-analog/python/analog/fm_demod.py
@@ -28,6 +28,7 @@ try:
except ImportError:
import analog_swig as analog
+
class fm_demod_cf(gr.hier_block2):
"""
Generalized FM demodulation block with deemphasis and audio
@@ -36,7 +37,7 @@ class fm_demod_cf(gr.hier_block2):
This block demodulates a band-limited, complex down-converted FM
channel into the the original baseband signal, optionally applying
deemphasis. Low pass filtering is done on the resultant signal. It
- produces an output float strem in the range of [-1.0, +1.0].
+ produces an output float stream in the range of [-1.0, +1.0].
Args:
channel_rate: incoming sample rate of the FM baseband (integer)
@@ -45,31 +46,34 @@ class fm_demod_cf(gr.hier_block2):
audio_pass: audio low pass filter passband frequency (float)
audio_stop: audio low pass filter stop frequency (float)
gain: gain applied to audio output (default = 1.0) (float)
- tau: deemphasis time constant (default = 75e-6), specify 'None' to prevent deemphasis
+ tau: deemphasis time constant (default = 75e-6), specify tau=0.0 to prevent deemphasis (float)
"""
def __init__(self, channel_rate, audio_decim, deviation,
audio_pass, audio_stop, gain=1.0, tau=75e-6):
- gr.hier_block2.__init__(self, "fm_demod_cf",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- k = channel_rate/(2*pi*deviation)
- QUAD = analog.quadrature_demod_cf(k)
-
- audio_taps = filter.optfir.low_pass(gain, # Filter gain
- channel_rate, # Sample rate
- audio_pass, # Audio passband
- audio_stop, # Audio stopband
- 0.1, # Passband ripple
- 60) # Stopband attenuation
- LPF = filter.fir_filter_fff(audio_decim, audio_taps)
-
- if tau is not None:
- DEEMPH = fm_deemph(channel_rate, tau)
- self.connect(self, QUAD, DEEMPH, LPF, self)
+ gr.hier_block2.__init__(self, "fm_demod_cf",
+ gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
+
+ k = channel_rate/(2*pi*deviation)
+ QUAD = analog.quadrature_demod_cf(k)
+
+ audio_taps = filter.optfir.low_pass(
+ gain, # Filter gain
+ channel_rate, # Sample rate
+ audio_pass, # Audio passband
+ audio_stop, # Audio stopband
+ 0.1, # Passband ripple
+ 60 # Stopband attenuation
+ )
+ LPF = filter.fir_filter_fff(audio_decim, audio_taps)
+
+ if tau is not None and tau > 0.0: # None should be deprecated someday
+ DEEMPH = fm_deemph(channel_rate, tau)
+ self.connect(self, QUAD, DEEMPH, LPF, self)
else:
self.connect(self, QUAD, LPF, self)
+
class demod_20k0f3e_cf(fm_demod_cf):
"""
NBFM demodulation block, 20 KHz channels
@@ -84,9 +88,10 @@ class demod_20k0f3e_cf(fm_demod_cf):
"""
def __init__(self, channel_rate, audio_decim):
fm_demod_cf.__init__(self, channel_rate, audio_decim,
- 5000, # Deviation
- 3000, # Audio passband frequency
- 4500) # Audio stopband frequency
+ 5000, # Deviation
+ 3000, # Audio passband frequency
+ 4500) # Audio stopband frequency
+
class demod_200kf3e_cf(fm_demod_cf):
"""
@@ -101,8 +106,8 @@ class demod_200kf3e_cf(fm_demod_cf):
audio_decim: input to output decimation rate (integer)
"""
def __init__(self, channel_rate, audio_decim):
- fm_demod_cf.__init__(self, channel_rate, audio_decim,
- 75000, # Deviation
- 15000, # Audio passband
- 16000, # Audio stopband
- 20.0) # Audio gain
+ fm_demod_cf.__init__(self, channel_rate, audio_decim,
+ 75000, # Deviation
+ 15000, # Audio passband
+ 16000, # Audio stopband
+ 20.0) # Audio gain
diff --git a/gr-analog/python/analog/fm_emph.py b/gr-analog/python/analog/fm_emph.py
index 2821f6e3cd..d2a38d4aff 100644
--- a/gr-analog/python/analog/fm_emph.py
+++ b/gr-analog/python/analog/fm_emph.py
@@ -34,25 +34,25 @@ import math
# See "Digital Signal Processing: A Practical Approach" by Ifeachor and Jervis
#
+
class fm_deemph(gr.hier_block2):
"""
FM Deemphasis IIR filter.
"""
-
def __init__(self, fs, tau=75e-6):
"""
-
+
Args:
fs: sampling frequency in Hz (float)
tau: Time constant in seconds (75us in US, 50us in EUR) (float)
"""
gr.hier_block2.__init__(self, "fm_deemph",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
+ gr.io_signature(1, 1, gr.sizeof_float), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
w_p = 1/tau
- w_pp = math.tan(w_p / (fs * 2)) # prewarped analog freq
+ w_pp = math.tan(w_p / (fs * 2)) # prewarped analog freq
a1 = (w_pp - 1)/(w_pp + 1)
b0 = w_pp/(1 + w_pp)
@@ -68,7 +68,7 @@ class fm_deemph(gr.hier_block2):
plot1 = gru.gnuplot_freqz(gru.freqz(btaps, ataps), fs, True)
deemph = filter.iir_filter_ffd(btaps, ataps)
- self.connect(self, deemph, self)
+ self.connect(self, deemph, self)
#
# 1 + s*t1
@@ -119,21 +119,21 @@ class fm_deemph(gr.hier_block2):
# See "Digital Signal Processing: A Practical Approach" by Ifeachor and Jervis
#
+
class fm_preemph(gr.hier_block2):
"""
FM Preemphasis IIR filter.
"""
def __init__(self, fs, tau=75e-6):
"""
-
+
Args:
fs: sampling frequency in Hz (float)
tau: Time constant in seconds (75us in US, 50us in EUR) (float)
"""
-
- gr.hier_block2.__init__(self, "fm_deemph",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
+ gr.hier_block2.__init__(self, "fm_deemph",
+ gr.io_signature(1, 1, gr.sizeof_float), # Input signature
+ gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
# FIXME make this compute the right answer
@@ -147,4 +147,4 @@ class fm_preemph(gr.hier_block2):
plot2 = gru.gnuplot_freqz(gru.freqz(btaps, ataps), fs, True)
preemph = filter.iir_filter_ffd(btaps, ataps)
- self.connect(self, preemph, self)
+ self.connect(self, preemph, self)
diff --git a/gr-digital/python/digital/bpsk.py b/gr-digital/python/digital/bpsk.py
index 92f3254933..2ecaac3386 100644
--- a/gr-digital/python/digital/bpsk.py
+++ b/gr-digital/python/digital/bpsk.py
@@ -1,23 +1,23 @@
#
# Copyright 2005,2006,2011 Free Software Foundation, Inc.
-#
+#
# This file is part of GNU Radio
-#
+#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
-#
+#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
-#
+#
"""
BPSK modulation and demodulation.
@@ -46,12 +46,11 @@ def bpsk_constellation():
class bpsk_mod(generic_mod):
"""
Hierarchical block for RRC-filtered BPSK modulation.
-
+
The input is a byte stream (unsigned char) and the
output is the complex modulated signal at baseband.
-
-
- Args:
+
+ Args:
mod_code: Argument is not used. It exists purely to simplify generation of the block in grc.
differential: Whether to use differential encoding (boolean).
"""
@@ -72,14 +71,14 @@ class bpsk_mod(generic_mod):
class bpsk_demod(generic_demod):
"""
- Hierarchical block for RRC-filtered BPSK modulation.
-
- The input is a byte stream (unsigned char) and the
- output is the complex modulated signal at baseband.
+ Hierarchical block for RRC-filtered BPSK demodulation.
+
+ The input is the complex modulated signal at baseband and the
+ output is a stream of bits packed 1 bit per byte (LSB)
- Args:
+ Args:
mod_code: Argument is not used. It exists purely to simplify generation of the block in grc.
- differential: whether to use differential encoding (boolean)
+ differential: whether to use differential encoding (boolean)
"""
# See generic_demod for additional arguments
__doc__ += shared_demod_args
@@ -105,11 +104,11 @@ def dbpsk_constellation():
class dbpsk_mod(bpsk_mod):
"""
Hierarchical block for RRC-filtered DBPSK modulation.
-
+
The input is a byte stream (unsigned char) and the
output is the complex modulated signal at baseband.
-
- Args:
+
+ Args:
mod_code: Argument is not used. It exists purely to simplify generation of the block in grc.
"""
# See generic_mod for additional arguments
@@ -126,12 +125,12 @@ class dbpsk_mod(bpsk_mod):
class dbpsk_demod(bpsk_demod):
"""
- Hierarchical block for RRC-filtered DBPSK modulation.
-
- The input is a byte stream (unsigned char) and the
- output is the complex modulated signal at baseband.
-
- Args:
+ Hierarchical block for RRC-filtered DBPSK demodulation.
+
+ The input is the complex modulated signal at baseband and the
+ output is a stream of bits packed 1 bit per byte (LSB)
+
+ Args:
mod_code: Argument is not used. It exists purely to simplify generation of the block in grc.
"""
# See generic_demod for additional arguments
diff --git a/gr-digital/python/digital/qpsk.py b/gr-digital/python/digital/qpsk.py
index 1ed3357bef..c5230ef24d 100644
--- a/gr-digital/python/digital/qpsk.py
+++ b/gr-digital/python/digital/qpsk.py
@@ -1,23 +1,23 @@
#
# Copyright 2005,2006,2011 Free Software Foundation, Inc.
-#
+#
# This file is part of GNU Radio
-#
+#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
-#
+#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
-#
+#
"""
QPSK modulation.
@@ -39,7 +39,7 @@ _def_mod_code = mod_codes.GRAY_CODE
# QPSK constellation
# /////////////////////////////////////////////////////////////////////////////
-def qpsk_constellation(mod_code=_def_mod_code):
+def qpsk_constellation(mod_code=_def_mod_code):
"""
Creates a QPSK constellation.
"""
@@ -54,17 +54,17 @@ def qpsk_constellation(mod_code=_def_mod_code):
class qpsk_mod(generic_mod):
"""
Hierarchical block for RRC-filtered QPSK modulation.
-
+
The input is a byte stream (unsigned char) and the
output is the complex modulated signal at baseband.
-
+
Args:
mod_code: Whether to use a gray_code (digital.mod_codes.GRAY_CODE) or not (digital.mod_codes.NO_CODE).
differential: Whether to use differential encoding (boolean).
"""
# See generic_mod for additional arguments
__doc__ += shared_mod_args
-
+
def __init__(self, mod_code=_def_mod_code, differential=False, *args, **kwargs):
pre_diff_code = True
if not differential:
@@ -77,8 +77,9 @@ class qpsk_mod(generic_mod):
raise ValueError("That mod_code is not supported for DQPSK mod/demod.")
if mod_code == mod_codes.NO_CODE:
pre_diff_code = False
-
+
super(qpsk_mod, self).__init__(constellation=constellation,
+ differential=differential,
pre_diff_code=pre_diff_code,
*args, **kwargs)
@@ -90,11 +91,11 @@ class qpsk_mod(generic_mod):
class qpsk_demod(generic_demod):
"""
- Hierarchical block for RRC-filtered QPSK modulation.
-
- The input is a byte stream (unsigned char) and the
- output is the complex modulated signal at baseband.
-
+ Hierarchical block for RRC-filtered QPSK demodulation.
+
+ The input is the complex modulated signal at baseband and the
+ output is a stream of bits packed 1 bit per byte (LSB)
+
Args:
mod_code: Whether to use a gray_code (digital.mod_codes.GRAY_CODE) or not (digital.mod_codes.NO_CODE).
differential: Whether to use differential encoding (boolean).
@@ -117,6 +118,7 @@ class qpsk_demod(generic_demod):
pre_diff_code = False
super(qpsk_demod, self).__init__(constellation=constellation,
+ differential=differential,
pre_diff_code=pre_diff_code,
*args, **kwargs)
@@ -138,7 +140,7 @@ def dqpsk_constellation(mod_code=_def_mod_code):
class dqpsk_mod(qpsk_mod):
"""
Hierarchical block for RRC-filtered DQPSK modulation.
-
+
The input is a byte stream (unsigned char) and the
output is the complex modulated signal at baseband.
@@ -149,7 +151,8 @@ class dqpsk_mod(qpsk_mod):
__doc__ += shared_mod_args
def __init__(self, mod_code=_def_mod_code, *args, **kwargs):
- super(dqpsk_mod, self).__init__(mod_code, True,
+ super(dqpsk_mod, self).__init__(mod_code=mod_code,
+ differential=True,
*args, **kwargs)
# /////////////////////////////////////////////////////////////////////////////
@@ -159,10 +162,10 @@ class dqpsk_mod(qpsk_mod):
class dqpsk_demod(qpsk_demod):
"""
- Hierarchical block for RRC-filtered DQPSK modulation.
-
- The input is a byte stream (unsigned char) and the
- output is the complex modulated signal at baseband.
+ Hierarchical block for RRC-filtered DQPSK demodulation.
+
+ The input is the complex modulated signal at baseband and the
+ output is a stream of bits packed 1 bit per byte (LSB)
Args:
mod_code: Whether to use a gray_code (digital.mod_codes.GRAY_CODE) or not (digital.mod_codes.NO_CODE).
@@ -171,7 +174,8 @@ class dqpsk_demod(qpsk_demod):
__doc__ += shared_demod_args
def __init__(self, mod_code=_def_mod_code, *args, **kwargs):
- super(dqpsk_demod, self).__init__(mod_code, True,
+ super(dqpsk_demod, self).__init__(mod_code=mod_code,
+ differential=True,
*args, **kwargs)
#
diff --git a/gr-fec/lib/reed-solomon/char.h b/gr-fec/lib/reed-solomon/char.h
index f76ad95cd4..4d3f22e5db 100644
--- a/gr-fec/lib/reed-solomon/char.h
+++ b/gr-fec/lib/reed-solomon/char.h
@@ -19,6 +19,7 @@ struct rs {
unsigned char fcr; /* First consecutive root, index form */
unsigned char prim; /* Primitive element, index form */
unsigned char iprim; /* prim-th root of 1, index form */
+ int *modnn_table; /* modnn lookup table, 512 entries */
};
static inline unsigned int modnn(struct rs *rs, unsigned int x){
diff --git a/gr-fec/lib/reed-solomon/encode_rs.c b/gr-fec/lib/reed-solomon/encode_rs.c
index cd31f32c6e..992aa3f4df 100644
--- a/gr-fec/lib/reed-solomon/encode_rs.c
+++ b/gr-fec/lib/reed-solomon/encode_rs.c
@@ -35,12 +35,26 @@ DTYPE *data, DTYPE *bb){
feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
#endif
for(j=1;j<NROOTS;j++)
+#ifdef FIXED
+ bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
+#elif defined(BIGSYM)
+ // Same as above; keeping as a separate line in case these change.
bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
+#else
+ bb[j] ^= ALPHA_TO[rs->modnn_table[feedback + GENPOLY[NROOTS-j]]];
+#endif
}
/* Shift */
memmove(&bb[0],&bb[1],sizeof(DTYPE)*(NROOTS-1));
if(feedback != A0)
+#ifdef FIXED
+ bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
+#elif defined(BIGSYM)
+ // Same as above; keeping as a separate line in case these change.
bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
+#else
+ bb[NROOTS-1] = ALPHA_TO[rs->modnn_table[feedback + GENPOLY[0]]];
+#endif
else
bb[NROOTS-1] = 0;
}
diff --git a/gr-fec/lib/reed-solomon/init_rs.c b/gr-fec/lib/reed-solomon/init_rs.c
index f50592b55a..c3d8921616 100644
--- a/gr-fec/lib/reed-solomon/init_rs.c
+++ b/gr-fec/lib/reed-solomon/init_rs.c
@@ -23,6 +23,11 @@ void FREE_RS(void *p){
free(rs->alpha_to);
free(rs->index_of);
free(rs->genpoly);
+#ifdef FIXED
+#elif defined(BIGSYM)
+#else
+ free(rs->modnn_table);
+#endif
free(rs);
}
@@ -120,6 +125,24 @@ void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned pri
for (i = 0; i <= nroots; i++)
rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
+#ifdef FIXED
+#elif defined(BIGSYM)
+#else
+ /* Form modnn lookup table */
+ rs->modnn_table = (int *)malloc(sizeof(int)*(2<<((sizeof(unsigned char))*8)));
+ if(rs->modnn_table == NULL){
+ free(rs->genpoly);
+ free(rs->alpha_to);
+ free(rs->index_of);
+ free(rs);
+ return NULL;
+ }
+ for(i = 0; i < (2<<((sizeof(unsigned char))*8)); i++){
+ j = i;
+ rs->modnn_table[i] = modnn(rs,j);
+ }
+#endif
+
#if 0
printf ("genpoly:\n");
for (i = nroots; i >= 0; i--){
diff --git a/gr-vocoder/doc/vocoder.dox b/gr-vocoder/doc/vocoder.dox
index 3973ca56fc..0e12566a80 100644
--- a/gr-vocoder/doc/vocoder.dox
+++ b/gr-vocoder/doc/vocoder.dox
@@ -20,4 +20,14 @@ by using:
help(vocoder)
\endcode
+\section using Using the vocoders
+
+Note that most vocoders use short inputs instead of floats. This means you
+must convert audio signals from float to short by using a type conversion
+and a scaling factor. See the examples.
+
+The format of the encoded audio is different for every encoder. See the
+individual block's documention for the data format. Encoded data is usually
+a vector of fixed length, and can either be packed or unpacked.
+
*/
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/examples/loopback-gsmfr.grc b/gr-vocoder/examples/loopback-gsmfr.grc
new file mode 100644
index 0000000000..f1c0e06bd6
--- /dev/null
+++ b/gr-vocoder/examples/loopback-gsmfr.grc
@@ -0,0 +1,1078 @@
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Fri Mar 7 16:29:26 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>loopback_gsmfr</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>GSM Full-Rate 06.10 Codec Looback Test</value>
+ </param>
+ <param>
+ <key>author</key>
+ <value>Martin Braun</value>
+ </param>
+ <param>
+ <key>description</key>
+ <value>An example how to use the GSM-FR 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>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>variable</key>
+ <param>
+ <key>id</key>
+ <value>scale</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2**12</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(301, -1)</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_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>Unencoded Speech</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_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>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>Unencoded Speech</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(-1, 389)</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>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>audio_source</key>
+ <param>
+ <key>id</key>
+ <value>audio_source_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_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>False</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>speech_audio_at_48_kHz.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>vocoder_gsm_fr_encode_sp</key>
+ <param>
+ <key>id</key>
+ <value>vocoder_gsm_fr_encode_sp_1</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>(592, 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>33</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>(857, 119)</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>(1052, 119)</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>33</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>(272, 312)</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>(-1, 312)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>vocoder_gsm_fr_decode_ps</key>
+ <param>
+ <key>id</key>
+ <value>vocoder_gsm_fr_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>(485, 316)</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>(1012, 364)</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>(1012, 240)</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>(762, 312)</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_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>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>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>blocks_float_to_short_0</source_block_id>
+ <sink_block_id>vocoder_gsm_fr_encode_sp_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>vocoder_gsm_fr_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>vocoder_gsm_fr_encode_sp_1</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>virtual_sink_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_stream_to_vector_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_gsm_fr_decode_ps_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>qtgui_time_sink_x_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/grc/vocoder_gsm_fr_decode_ps.xml b/gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml
index 44290f891e..bef07fb822 100644
--- a/gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml
+++ b/gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml
@@ -12,6 +12,7 @@
<sink>
<name>in</name>
<type>byte</type>
+ <vlen>33</vlen>
</sink>
<source>
<name>out</name>
diff --git a/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml b/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml
index 13f6f3f2d0..4c3eab71a8 100644
--- a/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml
+++ b/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml
@@ -16,6 +16,7 @@
<source>
<name>out</name>
<type>byte</type>
+ <vlen>33</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/include/gnuradio/vocoder/cvsd_decode_bs.h b/gr-vocoder/include/gnuradio/vocoder/cvsd_decode_bs.h
index 324dcea1a1..6e931683c4 100644
--- a/gr-vocoder/include/gnuradio/vocoder/cvsd_decode_bs.h
+++ b/gr-vocoder/include/gnuradio/vocoder/cvsd_decode_bs.h
@@ -75,12 +75,15 @@ namespace gr {
* the CVSD encoder.
*
* References:
+ *
* 1. Continuously Variable Slope Delta Modulation (CVSD) A Tutorial,
* Available: http://www.eetkorea.com/ARTICLES/2003AUG/A/2003AUG29_NTEK_RFD_AN02.PDF.
+ *
* 2. Specification of The Bluetooth System
* Available: http://grouper.ieee.org/groups/802/15/Bluetooth/core_10_b.pdf.
+ *
* 3. McGarrity, S., Bluetooth Full Duplex Voice and Data Transmission. 2002.
- * Bluetooth Voice Simulink� Model, Available:
+ * Bluetooth Voice Simulink Model, Available:
* http://www.mathworks.com/company/newsletters/digest/nov01/bluetooth.html
*/
class VOCODER_API cvsd_decode_bs : virtual public sync_interpolator
diff --git a/gr-vocoder/include/gnuradio/vocoder/cvsd_encode_sb.h b/gr-vocoder/include/gnuradio/vocoder/cvsd_encode_sb.h
index 7b7cea712e..d0b3afaab1 100644
--- a/gr-vocoder/include/gnuradio/vocoder/cvsd_encode_sb.h
+++ b/gr-vocoder/include/gnuradio/vocoder/cvsd_encode_sb.h
@@ -81,7 +81,7 @@ namespace gr {
* Available: http://grouper.ieee.org/groups/802/15/Bluetooth/core_10_b.pdf.
*
* 3. McGarrity, S., Bluetooth Full Duplex Voice and Data Transmission. 2002.
- * Bluetooth Voice Simulink� Model, Available:
+ * Bluetooth Voice Simulink Model, Available:
* http://www.mathworks.com/company/newsletters/digest/nov01/bluetooth.html
*/
class VOCODER_API cvsd_encode_sb : virtual public sync_decimator
@@ -89,7 +89,7 @@ namespace gr {
public:
// gr::vocoder::cvsd_encode_sb::sptr
typedef boost::shared_ptr<cvsd_encode_sb> sptr;
-
+
/*!
* \brief Constructor parameters to initialize the CVSD encoder.
* The default values are modeled after the Bluetooth standard and
@@ -116,7 +116,7 @@ namespace gr {
short pos_accum_max=32767, short neg_accum_max=-32767);
virtual short min_step() = 0;
- virtual short max_step() = 0;
+ virtual short max_step() = 0;
virtual double step_decay() = 0;
virtual double accum_decay() = 0;
virtual int K() = 0;
diff --git a/gr-vocoder/include/gnuradio/vocoder/gsm_fr_decode_ps.h b/gr-vocoder/include/gnuradio/vocoder/gsm_fr_decode_ps.h
index 9979763e60..b9aa664a77 100644
--- a/gr-vocoder/include/gnuradio/vocoder/gsm_fr_decode_ps.h
+++ b/gr-vocoder/include/gnuradio/vocoder/gsm_fr_decode_ps.h
@@ -32,13 +32,16 @@ namespace gr {
/*!
* \brief GSM 06.10 Full Rate Vocoder Decoder
* \ingroup audio_blk
+ *
+ * Input: Vector of 33 bytes per 160 input samples
+ * Output: 16-bit shorts representing speech samples
*/
class VOCODER_API gsm_fr_decode_ps : virtual public sync_interpolator
{
public:
// gr::vocoder::gsm_fr_decode_ps::sptr
typedef boost::shared_ptr<gsm_fr_decode_ps> sptr;
-
+
/*!
* \brief Make GSM decoder block.
*/
diff --git a/gr-vocoder/include/gnuradio/vocoder/gsm_fr_encode_sp.h b/gr-vocoder/include/gnuradio/vocoder/gsm_fr_encode_sp.h
index 98d88bba1f..5cfbc653cd 100644
--- a/gr-vocoder/include/gnuradio/vocoder/gsm_fr_encode_sp.h
+++ b/gr-vocoder/include/gnuradio/vocoder/gsm_fr_encode_sp.h
@@ -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
*
@@ -33,14 +33,15 @@ namespace gr {
* \brief GSM 06.10 Full Rate Vocoder Encoder
* \ingroup audio_blk
*
- * shorts in; 33 byte packets out
+ * Input: 16-bit shorts representing speech samples
+ * Output: Vector of 33 bytes per 160 input samples
*/
class VOCODER_API gsm_fr_encode_sp : virtual public sync_decimator
{
public:
// gr::vocoder::gsm_fr_encode_sp::sptr
typedef boost::shared_ptr<gsm_fr_encode_sp> sptr;
-
+
/*!
* \brief Make GSM encoder block.
*/
@@ -48,6 +49,6 @@ namespace gr {
};
} /* namespace vocoder */
-} /* namespace gr */
+} /* namespace gr */
#endif /* INCLUDED_VOCODER_GSM_FR_ENCODE_SP_H */
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/lib/gsm_fr_encode_sp_impl.cc b/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc
index 143a73bce7..0c3afe8f59 100644
--- a/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc
+++ b/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc
@@ -71,4 +71,4 @@ namespace gr {
}
} /* namespace vocoder */
-} /* namespace gr */
+} /* namespace gr */
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")
diff --git a/gr-wxgui/grc/CMakeLists.txt b/gr-wxgui/grc/CMakeLists.txt
index 51c5647e5b..9ee6e2370e 100644
--- a/gr-wxgui/grc/CMakeLists.txt
+++ b/gr-wxgui/grc/CMakeLists.txt
@@ -19,7 +19,7 @@
########################################################################
file(GLOB xml_files "*.xml")
-install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "wxgui")
+install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "wxgui_python")
########################################################################
#The wxgui module contains a top_block + wxgui frame.
@@ -32,5 +32,5 @@ GR_PYTHON_INSTALL(
panel.py
top_block_gui.py
DESTINATION ${GR_PYTHON_DIR}/grc_gnuradio/wxgui
- COMPONENT "wxgui"
+ COMPONENT "wxgui_python"
)
diff --git a/volk/lib/CMakeLists.txt b/volk/lib/CMakeLists.txt
index dbebac067f..d2e4e62212 100644
--- a/volk/lib/CMakeLists.txt
+++ b/volk/lib/CMakeLists.txt
@@ -1,5 +1,5 @@
#
-# Copyright 2011-2012 Free Software Foundation, Inc.
+# Copyright 2011-2012,2014 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -308,8 +308,21 @@ STRING(TOUPPER ${CMAKE_BUILD_TYPE} CBTU)
MESSAGE(STATUS BUILT TYPE ${CBTU})
MESSAGE(STATUS "Base cflags = ${CMAKE_C_FLAGS_${CBTU}} ${CMAKE_C_FLAGS}")
set(COMPILER_INFO "")
-execute_process(COMMAND ${CMAKE_C_COMPILER} --version
- OUTPUT_VARIABLE cmake_c_compiler_version)
+IF(MSVC)
+ IF(MSVC90) #Visual Studio 9
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 9.0")
+ ELSE(MSVC10) #Visual Studio 10
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 10.0")
+ ELSE(MSVC11) #Visual Studio 11
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 11.0")
+ ELSE(MSVC12) #Visual Studio 12
+ SET(cmake_c_compiler_version "Microsoft Visual Studio 12.0")
+ ENDIF()
+ELSE()
+ execute_process(COMMAND ${CMAKE_C_COMPILER} --version
+ OUTPUT_VARIABLE cmake_c_compiler_version)
+ENDIF(MSVC)
+set(COMPILER_INFO "${CMAKE_C_COMPILER}:::${CMAKE_C_FLAGS_${GRCBTU}} ${CMAKE_C_FLAGS}\n${CMAKE_CXX_COMPILER}:::${CMAKE_CXX_FLAGS_${GRCBTU}} ${CMAKE_CXX_FLAGS}\n" )
foreach(machine_name ${available_machines})
#generate machine source
diff --git a/volk/lib/volk_malloc.c b/volk/lib/volk_malloc.c
index 1333345800..b2b77ddcd7 100644
--- a/volk/lib/volk_malloc.c
+++ b/volk/lib/volk_malloc.c
@@ -24,7 +24,7 @@
#include <stdio.h>
#include <stdlib.h>
-/*
+/*
* For #defines used to determine support for allocation functions,
* see: http://linux.die.net/man/3/aligned_alloc
*/
@@ -111,7 +111,7 @@ volk_malloc(size_t size, size_t alignment)
// Find and return the first aligned boundary of the pointer
void *aptr = ptr;
if((unsigned long)ptr % alignment != 0)
- aptr = ptr + (alignment - ((unsigned long)ptr % alignment));
+ aptr = (void*)((unsigned long)ptr + (alignment - ((unsigned long)ptr % alignment)));
// Store original pointer and aligned pointers
mbuf *n = (mbuf*)malloc(sizeof(mbuf));
@@ -124,7 +124,7 @@ volk_malloc(size_t size, size_t alignment)
else {
volk_last_ptr->next = n;
}
- volk_last_ptr = n;
+ volk_last_ptr = n;
volk_nptrs++;
return aptr;
@@ -135,7 +135,7 @@ void volk_free(void *ptr)
unsigned long aptr = (unsigned long)ptr;
mbuf *prev = volk_first_ptr;
mbuf *p = volk_first_ptr;
-
+
// Look for the aligned pointer until we either find it or have
// walked the entire list of allocated pointers
while(p != NULL) {