diff options
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) { |