summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/Modules/FindCppUnit.cmake2
-rw-r--r--cmake/Modules/FindFFTW3f.cmake16
-rw-r--r--cmake/Modules/FindQwt.cmake17
-rw-r--r--cmake/Modules/FindUHD.cmake2
-rw-r--r--cmake/Modules/GrMiscUtils.cmake2
-rw-r--r--cmake/Modules/GrPackage.cmake2
-rw-r--r--cmake/Modules/GrSwig.cmake13
-rw-r--r--cmake/Packaging/Fedora-15.cmake4
-rw-r--r--config/grc_gr_noaa.m41
-rw-r--r--docs/doxygen/other/group_defs.dox8
-rw-r--r--docs/doxygen/swig_doc.py78
-rw-r--r--gnuradio-core/src/lib/CMakeLists.txt5
-rw-r--r--gnuradio-core/src/lib/filter/gr_fft_filter_ccc.cc35
-rw-r--r--gnuradio-core/src/lib/filter/gr_fft_filter_ccc.h22
-rw-r--r--gnuradio-core/src/lib/filter/gr_fft_filter_ccc.i10
-rw-r--r--gnuradio-core/src/lib/filter/gr_fft_filter_fff.cc33
-rw-r--r--gnuradio-core/src/lib/filter/gr_fft_filter_fff.h24
-rw-r--r--gnuradio-core/src/lib/filter/gr_fft_filter_fff.i9
-rw-r--r--gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h20
-rw-r--r--gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_cc.h20
-rw-r--r--gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_ff.h20
-rw-r--r--gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.cc25
-rw-r--r--gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.h15
-rw-r--r--gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.cc21
-rw-r--r--gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.h15
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_mmse_fir_interpolator_cc.cc1
-rw-r--r--gnuradio-core/src/lib/general/gr_burst_tagger.cc38
-rw-r--r--gnuradio-core/src/lib/general/gr_burst_tagger.h11
-rw-r--r--gnuradio-core/src/lib/general/gr_burst_tagger.i4
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vcc.cc22
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vcc.h13
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vcc.i12
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc38
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h15
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vfc.cc27
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vfc.h17
-rw-r--r--gnuradio-core/src/lib/general/gr_fft_vfc.i12
-rw-r--r--gnuradio-core/src/lib/general/gri_fft.cc70
-rw-r--r--gnuradio-core/src/lib/general/gri_fft.h39
-rw-r--r--gnuradio-core/src/lib/io/gr_oscope_guts.cc64
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_fft.py54
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_fft_filter.py86
-rw-r--r--gnuradio-examples/grc/audio/cvsd_sweep.grc14
-rwxr-xr-xgr-digital/examples/narrowband/digital_bert_rx.py2
-rwxr-xr-xgr-digital/examples/narrowband/digital_bert_tx.py7
-rw-r--r--gr-digital/include/digital_mpsk_receiver_cc.h43
-rw-r--r--gr-digital/lib/digital_mpsk_receiver_cc.cc17
-rw-r--r--gr-digital/swig/digital_mpsk_receiver_cc.i5
-rw-r--r--gr-howto-write-a-block-cmake/CMakeLists.txt14
-rw-r--r--gr-howto-write-a-block-cmake/cmake/Modules/FindGnuradioCore.cmake4
-rw-r--r--gr-howto-write-a-block-cmake/cmake/Modules/FindGruel.cmake4
-rw-r--r--gr-howto-write-a-block-cmake/cmake/cmake_uninstall.cmake.in32
-rw-r--r--gr-howto-write-a-block-cmake/docs/doxygen/swig_doc.py2
-rw-r--r--gr-howto-write-a-block-cmake/swig/CMakeLists.txt2
-rw-r--r--gr-howto-write-a-block/version.sh4
-rw-r--r--gr-noaa/CMakeLists.txt14
-rw-r--r--gr-noaa/Makefile.am2
-rw-r--r--gr-noaa/gnuradio-noaa.pc.in11
-rw-r--r--gr-shd/CMakeLists.txt2
-rwxr-xr-xgr-uhd/apps/uhd_fft.py41
-rwxr-xr-xgr-uhd/apps/uhd_rx_cfile.py17
-rwxr-xr-xgr-uhd/apps/uhd_rx_nogui.py15
-rwxr-xr-xgr-uhd/apps/uhd_siggen.py16
-rw-r--r--gr-uhd/grc/gen_uhd_usrp_blocks.py4
-rw-r--r--gr-uhd/include/gr_uhd_amsg_source.h7
-rw-r--r--gr-uhd/lib/gr_uhd_amsg_source.cc5
-rw-r--r--gr-vocoder/CMakeLists.txt1
-rw-r--r--gr-vocoder/grc/CMakeLists.txt42
-rw-r--r--gr-vocoder/grc/vocoder_alaw_decode_bs.xml20
-rw-r--r--gr-vocoder/grc/vocoder_alaw_encode_sb.xml22
-rw-r--r--gr-vocoder/grc/vocoder_block_tree.xml53
-rw-r--r--gr-vocoder/grc/vocoder_codec2_decode_ps.xml20
-rw-r--r--gr-vocoder/grc/vocoder_codec2_encode_sp.xml22
-rw-r--r--gr-vocoder/grc/vocoder_cvsd_decode.xml (renamed from grc/blocks/blks2_cvsd_decode.xml)6
-rw-r--r--gr-vocoder/grc/vocoder_cvsd_decode_bs.xml21
-rw-r--r--gr-vocoder/grc/vocoder_cvsd_encode.xml (renamed from grc/blocks/blks2_cvsd_encode.xml)6
-rw-r--r--gr-vocoder/grc/vocoder_cvsd_encode_sb.xml22
-rw-r--r--gr-vocoder/grc/vocoder_g721_decode_bs.xml20
-rw-r--r--gr-vocoder/grc/vocoder_g721_encode_sb.xml22
-rw-r--r--gr-vocoder/grc/vocoder_g723_24_decode_bs.xml20
-rw-r--r--gr-vocoder/grc/vocoder_g723_24_encode_sb.xml22
-rw-r--r--gr-vocoder/grc/vocoder_g723_40_decode_bs.xml20
-rw-r--r--gr-vocoder/grc/vocoder_g723_40_encode_sb.xml22
-rw-r--r--gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml20
-rw-r--r--gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml22
-rw-r--r--gr-vocoder/grc/vocoder_ulaw_decode_bs.xml20
-rw-r--r--gr-vocoder/grc/vocoder_ulaw_encode_sb.xml22
-rw-r--r--grc/blocks/Makefile.am1
-rw-r--r--grc/blocks/block_tree.xml6
-rw-r--r--grc/blocks/gr_burst_tagger.xml87
-rw-r--r--grc/blocks/gr_fft_filter_xxx.xml9
-rw-r--r--grc/blocks/gr_fft_vxx.xml11
-rw-r--r--grc/freedesktop/CMakeLists.txt4
-rwxr-xr-xgrc/scripts/gnuradio-companion13
-rw-r--r--gruel/src/include/gruel/high_res_timer.h2
-rw-r--r--version.sh4
-rw-r--r--volk/orc/volk_8i_convert_16i_a_orc_impl.orc5
97 files changed, 1590 insertions, 223 deletions
diff --git a/cmake/Modules/FindCppUnit.cmake b/cmake/Modules/FindCppUnit.cmake
index 29c9ba4ff..9af308f84 100644
--- a/cmake/Modules/FindCppUnit.cmake
+++ b/cmake/Modules/FindCppUnit.cmake
@@ -10,7 +10,7 @@
# CPPUNIT_FOUND, If false, do not try to use CppUnit.
INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(PC_CPPUNIT QUIET "cppunit")
+PKG_CHECK_MODULES(PC_CPPUNIT "cppunit")
FIND_PATH(CPPUNIT_INCLUDE_DIRS
NAMES cppunit/TestCase.h
diff --git a/cmake/Modules/FindFFTW3f.cmake b/cmake/Modules/FindFFTW3f.cmake
index beb5c189e..0ee7e46fe 100644
--- a/cmake/Modules/FindFFTW3f.cmake
+++ b/cmake/Modules/FindFFTW3f.cmake
@@ -4,7 +4,7 @@
# Find single-precision (float) version of FFTW3
INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(PC_FFTW3F QUIET "fftw3f >= 3.0")
+PKG_CHECK_MODULES(PC_FFTW3F "fftw3f >= 3.0")
FIND_PATH(
FFTW3F_INCLUDE_DIRS
@@ -22,8 +22,20 @@ FIND_LIBRARY(
${PC_FFTW3F_LIBDIR}
PATHS /usr/local/lib
/usr/lib
+ /usr/lib64
)
+FIND_LIBRARY(
+ FFTW3F_THREADS_LIBRARIES
+ NAMES fftw3f_threads libfftw3f_threads
+ HINTS $ENV{FFTW3_DIR}/lib
+ ${PC_FFTW3F_LIBDIR}
+ PATHS /usr/local/lib
+ /usr/lib
+ /usr/lib64
+)
+
+
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW3F DEFAULT_MSG FFTW3F_LIBRARIES FFTW3F_INCLUDE_DIRS)
-MARK_AS_ADVANCED(FFTW3F_LIBRARIES FFTW3F_INCLUDE_DIRS)
+MARK_AS_ADVANCED(FFTW3F_LIBRARIES FFTW3F_INCLUDE_DIRS FFTW3F_THREADS_LIBRARIES) \ No newline at end of file
diff --git a/cmake/Modules/FindQwt.cmake b/cmake/Modules/FindQwt.cmake
index bc8683f7d..857020796 100644
--- a/cmake/Modules/FindQwt.cmake
+++ b/cmake/Modules/FindQwt.cmake
@@ -3,11 +3,22 @@
# QWT_LIBRARIES libraries to link against
# QWT_FOUND If false, do not try to use Qwt
-find_path ( QWT_INCLUDE_DIRS qwt_plot.h /usr/include/qwt-qt4 /usr/include/qwt /opt/local/include/qwt )
-
-find_library ( QWT_LIBRARIES NAMES qwt-qt4 qwt)
+find_path (QWT_INCLUDE_DIRS
+ NAMES qwt_plot.h
+ PATHS
+ /usr/local/include/qwt-qt4
+ /usr/local/include/qwt
+ /usr/include/qwt-qt4
+ /usr/include/qwt
+)
+
+find_library (QWT_LIBRARIES
+ NAMES qwt-qt4 qwt
+ PATHS /usr/local/lib /usr/lib
+)
# handle the QUIETLY and REQUIRED arguments and set QWT_FOUND to TRUE if
# all listed variables are TRUE
include ( FindPackageHandleStandardArgs )
find_package_handle_standard_args( Qwt DEFAULT_MSG QWT_LIBRARIES QWT_INCLUDE_DIRS )
+MARK_AS_ADVANCED(QWT_LIBRARIES QWT_INCLUDE_DIRS)
diff --git a/cmake/Modules/FindUHD.cmake b/cmake/Modules/FindUHD.cmake
index 6a7956b2c..b4d12b6d7 100644
--- a/cmake/Modules/FindUHD.cmake
+++ b/cmake/Modules/FindUHD.cmake
@@ -3,7 +3,7 @@
########################################################################
INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(PC_UHD QUIET uhd)
+PKG_CHECK_MODULES(PC_UHD uhd)
FIND_PATH(
UHD_INCLUDE_DIRS
diff --git a/cmake/Modules/GrMiscUtils.cmake b/cmake/Modules/GrMiscUtils.cmake
index 0e1f40027..27003cf59 100644
--- a/cmake/Modules/GrMiscUtils.cmake
+++ b/cmake/Modules/GrMiscUtils.cmake
@@ -155,7 +155,7 @@ function(GR_LIBRARY_FOO target)
GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
#give the library a special name with ultra-zero soversion
- set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
+ set_target_properties(${target} PROPERTIES OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
set(target_name lib${target}-${LIBVER}.so.0.0.0)
#custom command to generate symlinks
diff --git a/cmake/Modules/GrPackage.cmake b/cmake/Modules/GrPackage.cmake
index a36ad9162..a65a2f8a7 100644
--- a/cmake/Modules/GrPackage.cmake
+++ b/cmake/Modules/GrPackage.cmake
@@ -103,7 +103,7 @@ endfunction(CPACK_COMPONENT)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GNU Radio - The GNU Software Radio")
set(CPACK_PACKAGE_VENDOR "Free Software Foundation, Inc.")
set(CPACK_PACKAGE_CONTACT "Discuss GNURadio <discuss-gnuradio@gnu.org>")
-set(CPACK_PACKAGE_VERSION ${VERSION})
+string(REPLACE "v" "" CPACK_PACKAGE_VERSION ${VERSION})
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/README)
set(CPACK_RESOURCE_FILE_README ${CMAKE_SOURCE_DIR}/README)
set(CPACK_RESOURCE_FILE_WELCOME ${CMAKE_SOURCE_DIR}/README)
diff --git a/cmake/Modules/GrSwig.cmake b/cmake/Modules/GrSwig.cmake
index ced8b16c8..4bcd67eb9 100644
--- a/cmake/Modules/GrSwig.cmake
+++ b/cmake/Modules/GrSwig.cmake
@@ -67,23 +67,16 @@ function(GR_SWIG_MAKE_DOCS output_file)
#call doxygen on the Doxyfile + input headers
add_custom_command(
OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
+ ${OUTPUT_DIRECTORY}/xml/combine.xslt
DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
COMMENT "Generating doxygen xml for ${name} docs"
)
- #call sync if we can to flush the doxygen writes to file before python reads
- find_program(SYNC_EXECUTABLE sync)
- unset(sync_command)
- if(SYNC_EXECUTABLE)
- set(sync_command COMMAND ${SYNC_EXECUTABLE})
- endif()
-
#call the swig_doc script on the xml files
add_custom_command(
- OUTPUT ${output_file}
- DEPENDS ${input_files} ${OUTPUT_DIRECTORY}/xml/index.xml
- ${sync_command}
+ OUTPUT ${output_file}
+ DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
${OUTPUT_DIRECTORY}/xml
diff --git a/cmake/Packaging/Fedora-15.cmake b/cmake/Packaging/Fedora-15.cmake
index 1ec017a7a..278d68990 100644
--- a/cmake/Packaging/Fedora-15.cmake
+++ b/cmake/Packaging/Fedora-15.cmake
@@ -1,10 +1,10 @@
SET(PACKAGE_DEPENDS_GRUEL_RUNTIME "boost-python" "glibc")
SET(PACKAGE_DEPENDS_GRUEL_PYTHON "python")
SET(PACKAGE_DEPENDS_CORE_RUNTIME "fftw-libs" "gsl")
-SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "qt" "qwt4")
+SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "qt" "qwt")
SET(PACKAGE_DEPENDS_QTGUI_PYTHON "PyQt4" "PyQwt")
SET(PACKAGE_DEPENDS_GRC "python" "numpy" "gtk2" "python-lxml" "python-cheetah")
-SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python" "numpy")
+SET(PACKAGE_DEPENDS_WXGUI "wxGTK" "python" "numpy")
SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "SDL")
SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd")
SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "pulseaudio" "alsa-lib" "jack-audio-connection-kit")
diff --git a/config/grc_gr_noaa.m4 b/config/grc_gr_noaa.m4
index 54df77503..f750a4645 100644
--- a/config/grc_gr_noaa.m4
+++ b/config/grc_gr_noaa.m4
@@ -33,6 +33,7 @@ AC_DEFUN([GRC_GR_NOAA],[
gr-noaa/oct/Makefile \
gr-noaa/python/Makefile \
gr-noaa/swig/Makefile \
+ gr-noaa/gnuradio-noaa.pc \
gr-noaa/swig/run_guile_tests \
])
diff --git a/docs/doxygen/other/group_defs.dox b/docs/doxygen/other/group_defs.dox
index facdc2338..285fbd1a5 100644
--- a/docs/doxygen/other/group_defs.dox
+++ b/docs/doxygen/other/group_defs.dox
@@ -58,18 +58,10 @@
*/
/*!
- * \defgroup radar Radar
- * Radar Applications...
- */
-
-/*!
* \defgroup pager Pager
* Pager Applications
*/
/*! @} */
-/*! \defgroup usrp USRP */
-/*! \defgroup usrp2 USRP2 */
-
/*! \defgroup hardware Misc Hardware Control */
diff --git a/docs/doxygen/swig_doc.py b/docs/doxygen/swig_doc.py
index 5034099e3..cac784cfe 100644
--- a/docs/doxygen/swig_doc.py
+++ b/docs/doxygen/swig_doc.py
@@ -27,7 +27,7 @@ python docstrings.
"""
-import sys
+import sys, time
try:
from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
@@ -98,6 +98,8 @@ def make_entry(obj, name=None, templ="{description}", description=None):
"""
if name is None:
name=obj.name()
+ if "operator " in name:
+ return ''
if description is None:
description = combine_descriptions(obj)
docstring = templ.format(description=description)
@@ -193,15 +195,49 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
output.append(custom_output)
# Create docstrings for the blocks.
- blocks = di.in_category(Block)
+ tries = 0
+ while(1):
+ try:
+ blocks = di.in_category(Block)
+ except:
+ if(tries < 3):
+ # May not be built just yet; sleep and try again
+ sys.stderr.write("XML parsing problem with file {0}, retrying.\n".format(
+ swigdocfilename))
+ time.sleep(1)
+ tries += 1
+ else:
+ # if we've given it three tries, give up and raise an error
+ sys.stderr.write("XML parsing error with file {0}. giving up.\n".format(
+ swigdocfilename))
+ raise
+ else:
+ break
+
make_funcs = set([])
for block in blocks:
- try:
- make_func = di.get_member(make_name(block.name()), DoxyFunction)
- make_funcs.add(make_func.name())
- output.append(make_block_entry(di, block))
- except block.ParsingError:
- print('Parsing error for block %s' % block.name())
+ tries = 0
+ while(1):
+ try:
+ make_func = di.get_member(make_name(block.name()), DoxyFunction)
+ make_funcs.add(make_func.name())
+ output.append(make_block_entry(di, block))
+ except block.ParsingError:
+ sys.stderr.write('Parsing error for block {0}'.format(block.name()))
+ except:
+ if(tries < 3):
+ # May not be built just yet; sleep and try again
+ sys.stderr.write("XML parsing problem with file {0}, retrying.\n".format(
+ swigdocfilename))
+ time.sleep(1)
+ tries += 1
+ else:
+ # if we've given it three tries, give up and raise an error
+ sys.stderr.write("XML parsing error with file {0}. giving up.\n".format(
+ swigdocfilename))
+ raise
+ else:
+ break
# Create docstrings for functions
# Don't include the make functions since they have already been dealt with.
@@ -210,7 +246,7 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
try:
output.append(make_func_entry(f))
except f.ParsingError:
- print('Parsing error for function %s' % f.name())
+ sys.stderr.write('Parsing error for function {0}'.format(f.name()))
# Create docstrings for classes
block_names = [block.name() for block in blocks]
@@ -219,7 +255,7 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
try:
output.append(make_class_entry(k))
except k.ParsingError:
- print('Parsing error for class %s' % k.name())
+ sys.stderr.write('Parsing error for class {0}'.format(k.name()))
# Docstrings are not created for anything that is not a function or a class.
# If this excludes anything important please add it here.
@@ -250,4 +286,24 @@ if __name__ == "__main__":
custom_output = "\n\n".join(output)
# Generate the docstrings interface file.
- make_swig_interface_file(di, swigdocfilename, custom_output=custom_output)
+ # If parsing error on NoSuchMember, try again by rereading everything.
+ # Give up after 3 tries.
+ tries = 0
+ while(1):
+ try:
+ make_swig_interface_file(di, swigdocfilename, custom_output=custom_output)
+ except:
+ if(tries < 3):
+ # May not be built just yet; sleep and try again
+ sys.stderr.write("XML parsing problem with file {0}, retrying.\n".format(
+ swigdocfilename))
+ time.sleep(1)
+ tries += 1
+ else:
+ # if we've given it three tries, give up and raise an error
+ sys.stderr.write("XML parsing error with file {0}. giving up.\n".format(
+ swigdocfilename))
+ raise
+ else:
+ break
+
diff --git a/gnuradio-core/src/lib/CMakeLists.txt b/gnuradio-core/src/lib/CMakeLists.txt
index f9756feba..86f88242c 100644
--- a/gnuradio-core/src/lib/CMakeLists.txt
+++ b/gnuradio-core/src/lib/CMakeLists.txt
@@ -64,6 +64,11 @@ list(APPEND gnuradio_core_libs
${FFTW3F_LIBRARIES}
)
+if(FFTW3F_THREADS_LIBRARIES)
+ list(APPEND gnuradio_core_libs ${FFTW3F_THREADS_LIBRARIES} )
+ add_definitions("-DFFTW3F_THREADS")
+endif()
+
#need to link with librt on ubuntu 11.10 for shm_*
if(LINUX)
list(APPEND gnuradio_core_libs rt)
diff --git a/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.cc b/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.cc
index d523404c9..5968e487e 100644
--- a/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.cc
+++ b/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.cc
@@ -42,13 +42,17 @@
#include <iostream>
#include <string.h>
-gr_fft_filter_ccc_sptr gr_make_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps)
+gr_fft_filter_ccc_sptr gr_make_fft_filter_ccc (int decimation,
+ const std::vector<gr_complex> &taps,
+ int nthreads)
{
- return gnuradio::get_initial_sptr(new gr_fft_filter_ccc (decimation, taps));
+ return gnuradio::get_initial_sptr(new gr_fft_filter_ccc (decimation, taps, nthreads));
}
-gr_fft_filter_ccc::gr_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps)
+gr_fft_filter_ccc::gr_fft_filter_ccc (int decimation,
+ const std::vector<gr_complex> &taps,
+ int nthreads)
: gr_sync_decimator ("fft_filter_ccc",
gr_make_io_signature (1, 1, sizeof (gr_complex)),
gr_make_io_signature (1, 1, sizeof (gr_complex)),
@@ -56,7 +60,13 @@ gr_fft_filter_ccc::gr_fft_filter_ccc (int decimation, const std::vector<gr_compl
d_updated(false)
{
set_history(1);
- d_filter = new gri_fft_filter_ccc_generic(decimation, taps);
+
+#if 1 // don't enable the sse version until handling it is worked out
+ d_filter = new gri_fft_filter_ccc_generic(decimation, taps, nthreads);
+#else
+ d_filter = new gri_fft_filter_ccc_sse(decimation, taps);
+#endif
+
d_new_taps = taps;
d_nsamples = d_filter->set_taps(taps);
set_output_multiple(d_nsamples);
@@ -80,6 +90,23 @@ gr_fft_filter_ccc::taps () const
return d_new_taps;
}
+void
+gr_fft_filter_ccc::set_nthreads(int n)
+{
+ if(d_filter)
+ d_filter->set_nthreads(n);
+}
+
+int
+gr_fft_filter_ccc::nthreads() const
+{
+ if(d_filter)
+ return d_filter->nthreads();
+ else
+ return 0;
+}
+
+
int
gr_fft_filter_ccc::work (int noutput_items,
gr_vector_const_void_star &input_items,
diff --git a/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.h b/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.h
index 1b72a1c00..d037597e8 100644
--- a/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.h
+++ b/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.h
@@ -27,7 +27,9 @@
class gr_fft_filter_ccc;
typedef boost::shared_ptr<gr_fft_filter_ccc> gr_fft_filter_ccc_sptr;
-GR_CORE_API gr_fft_filter_ccc_sptr gr_make_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps);
+GR_CORE_API gr_fft_filter_ccc_sptr
+gr_make_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps,
+ int nthreads=1);
//class gri_fft_filter_ccc_sse;
class gri_fft_filter_ccc_generic;
@@ -39,7 +41,9 @@ class gri_fft_filter_ccc_generic;
class GR_CORE_API gr_fft_filter_ccc : public gr_sync_decimator
{
private:
- friend GR_CORE_API gr_fft_filter_ccc_sptr gr_make_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps);
+ friend GR_CORE_API gr_fft_filter_ccc_sptr
+ gr_make_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps,
+ int nthreads);
int d_nsamples;
bool d_updated;
@@ -55,8 +59,10 @@ class GR_CORE_API gr_fft_filter_ccc : public gr_sync_decimator
*
* \param decimation >= 1
* \param taps complex filter taps
+ * \param nthreads number of threads for the FFT to use
*/
- gr_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps);
+ gr_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps,
+ int nthreads=1);
public:
~gr_fft_filter_ccc ();
@@ -64,6 +70,16 @@ class GR_CORE_API gr_fft_filter_ccc : public gr_sync_decimator
void set_taps (const std::vector<gr_complex> &taps);
std::vector<gr_complex> taps () const;
+ /*!
+ * \brief Set number of threads to use.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * \brief Get number of threads being used.
+ */
+ int nthreads() const;
+
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
diff --git a/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.i b/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.i
index 812920d8b..acdc347a6 100644
--- a/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.i
+++ b/gnuradio-core/src/lib/filter/gr_fft_filter_ccc.i
@@ -24,17 +24,23 @@ GR_SWIG_BLOCK_MAGIC(gr,fft_filter_ccc)
gr_fft_filter_ccc_sptr
gr_make_fft_filter_ccc (int decimation,
- const std::vector<gr_complex> &taps
+ const std::vector<gr_complex> &taps,
+ int nthreads=1
) throw (std::invalid_argument);
class gr_fft_filter_ccc : public gr_sync_decimator
{
private:
- gr_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps);
+ gr_fft_filter_ccc (int decimation, const std::vector<gr_complex> &taps,
+ int nthreads=1);
public:
~gr_fft_filter_ccc ();
void set_taps (const std::vector<gr_complex> &taps);
std::vector<gr_complex> taps () const;
+
+ void set_nthreads(int n);
+ int nthreads() const;
+
};
diff --git a/gnuradio-core/src/lib/filter/gr_fft_filter_fff.cc b/gnuradio-core/src/lib/filter/gr_fft_filter_fff.cc
index 640851a1d..e4a669150 100644
--- a/gnuradio-core/src/lib/filter/gr_fft_filter_fff.cc
+++ b/gnuradio-core/src/lib/filter/gr_fft_filter_fff.cc
@@ -34,13 +34,17 @@
#include <iostream>
#include <string.h>
-gr_fft_filter_fff_sptr gr_make_fft_filter_fff (int decimation, const std::vector<float> &taps)
+gr_fft_filter_fff_sptr gr_make_fft_filter_fff (int decimation,
+ const std::vector<float> &taps,
+ int nthreads)
{
- return gnuradio::get_initial_sptr(new gr_fft_filter_fff (decimation, taps));
+ return gnuradio::get_initial_sptr(new gr_fft_filter_fff (decimation, taps, nthreads));
}
-gr_fft_filter_fff::gr_fft_filter_fff (int decimation, const std::vector<float> &taps)
+gr_fft_filter_fff::gr_fft_filter_fff (int decimation,
+ const std::vector<float> &taps,
+ int nthreads)
: gr_sync_decimator ("fft_filter_fff",
gr_make_io_signature (1, 1, sizeof (float)),
gr_make_io_signature (1, 1, sizeof (float)),
@@ -49,7 +53,12 @@ gr_fft_filter_fff::gr_fft_filter_fff (int decimation, const std::vector<float> &
{
set_history(1);
- d_filter = new gri_fft_filter_fff_generic(decimation, taps);
+#if 1 // don't enable the sse version until handling it is worked out
+ d_filter = new gri_fft_filter_fff_generic(decimation, taps, nthreads);
+#else
+ d_filter = new gri_fft_filter_fff_sse(decimation, taps);
+#endif
+
d_new_taps = taps;
d_nsamples = d_filter->set_taps(taps);
set_output_multiple(d_nsamples);
@@ -73,6 +82,22 @@ gr_fft_filter_fff::taps () const
return d_new_taps;
}
+void
+gr_fft_filter_fff::set_nthreads(int n)
+{
+ if(d_filter)
+ d_filter->set_nthreads(n);
+}
+
+int
+gr_fft_filter_fff::nthreads() const
+{
+ if(d_filter)
+ return d_filter->nthreads();
+ else
+ return 0;
+}
+
int
gr_fft_filter_fff::work (int noutput_items,
gr_vector_const_void_star &input_items,
diff --git a/gnuradio-core/src/lib/filter/gr_fft_filter_fff.h b/gnuradio-core/src/lib/filter/gr_fft_filter_fff.h
index ddd8dcac2..2eeb8c646 100644
--- a/gnuradio-core/src/lib/filter/gr_fft_filter_fff.h
+++ b/gnuradio-core/src/lib/filter/gr_fft_filter_fff.h
@@ -27,7 +27,9 @@
class gr_fft_filter_fff;
typedef boost::shared_ptr<gr_fft_filter_fff> gr_fft_filter_fff_sptr;
-GR_CORE_API gr_fft_filter_fff_sptr gr_make_fft_filter_fff (int decimation, const std::vector<float> &taps);
+GR_CORE_API gr_fft_filter_fff_sptr
+gr_make_fft_filter_fff (int decimation, const std::vector<float> &taps,
+ int nthreads=1);
class gri_fft_filter_fff_generic;
//class gri_fft_filter_fff_sse;
@@ -39,7 +41,9 @@ class gri_fft_filter_fff_generic;
class GR_CORE_API gr_fft_filter_fff : public gr_sync_decimator
{
private:
- friend GR_CORE_API gr_fft_filter_fff_sptr gr_make_fft_filter_fff (int decimation, const std::vector<float> &taps);
+ friend GR_CORE_API gr_fft_filter_fff_sptr
+ gr_make_fft_filter_fff (int decimation, const std::vector<float> &taps,
+ int nthreads);
int d_nsamples;
bool d_updated;
@@ -55,15 +59,27 @@ class GR_CORE_API gr_fft_filter_fff : public gr_sync_decimator
*
* \param decimation >= 1
* \param taps float filter taps
+ * \param nthreads number of threads for the FFT to use
*/
- gr_fft_filter_fff (int decimation, const std::vector<float> &taps);
-
+ gr_fft_filter_fff (int decimation, const std::vector<float> &taps,
+ int nthreads=1);
+
public:
~gr_fft_filter_fff ();
void set_taps (const std::vector<float> &taps);
std::vector<float> taps () const;
+ /*!
+ * \brief Set number of threads to use.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * \brief Get number of threads being used.
+ */
+ int nthreads() const;
+
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
diff --git a/gnuradio-core/src/lib/filter/gr_fft_filter_fff.i b/gnuradio-core/src/lib/filter/gr_fft_filter_fff.i
index 7e2cde977..c8118e09e 100644
--- a/gnuradio-core/src/lib/filter/gr_fft_filter_fff.i
+++ b/gnuradio-core/src/lib/filter/gr_fft_filter_fff.i
@@ -24,17 +24,22 @@ GR_SWIG_BLOCK_MAGIC(gr,fft_filter_fff)
gr_fft_filter_fff_sptr
gr_make_fft_filter_fff (int decimation,
- const std::vector<float> &taps
+ const std::vector<float> &taps,
+ int nthreads=1
) throw (std::invalid_argument);
class gr_fft_filter_fff : public gr_sync_decimator
{
private:
- gr_fft_filter_fff (int decimation, const std::vector<float> &taps);
+ gr_fft_filter_fff (int decimation, const std::vector<float> &taps,
+ int nthreads=1);
public:
~gr_fft_filter_fff ();
void set_taps (const std::vector<float> &taps);
std::vector<float> taps () const;
+ void set_nthreads(int n);
+ int nthreads() const;
+
};
diff --git a/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h b/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
index 386d056e5..84be57768 100644
--- a/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
+++ b/gnuradio-core/src/lib/filter/gr_iir_filter_ffd.h
@@ -43,16 +43,26 @@ gr_make_iir_filter_ffd (const std::vector<double> &fftaps,
*
*
* The input and output satisfy a difference equation of the form
+ \htmlonly
+ \f{
+ y[n] - \sum_{k=1}^{M} a_k y[n-k] = \sum_{k=0}^{N} b_k x[n-k]
+ \f}
+ \endhtmlonly
- \f[
+ \xmlonly
y[n] - \sum_{k=1}^{M} a_k y[n-k] = \sum_{k=0}^{N} b_k x[n-k]
- \f]
+ \endxmlonly
* with the corresponding rational system function
+ \htmlonly
+ \f{
+ H(z) = \ frac{\sum_{k=0}^{M} b_k z^{-k}}{1 - \sum_{k=1}^{N} a_k z^{-k}}
+ \f}
+ \endhtmlonly
- \f[
- H(z) = \frac{\sum_{k=0}^{M} b_k z^{-k}}{1 - \sum_{k=1}^{N} a_k z^{-k}}
- \f]
+ \xmlonly
+ H(z) = \ frac{\sum_{k=0}^{M} b_k z^{-k}}{1 - \sum_{k=1}^{N} a_k z^{-k}}
+ \endxmlonly
* Note that some texts define the system function with a + in the denominator.
* If you're using that convention, you'll need to negate the feedback taps.
diff --git a/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_cc.h b/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_cc.h
index 3ce468db2..78fa25393 100644
--- a/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_cc.h
+++ b/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_cc.h
@@ -40,16 +40,26 @@ gr_make_single_pole_iir_filter_cc (double alpha, unsigned int vlen=1);
* \ingroup filter_blk
*
* The input and output satisfy a difference equation of the form
+ \htmlonly
+ \f{
+ y[n] - (1-alpha) y[n-1] = alpha x[n]
+ \f}
+ \endhtmlonly
- \f[
+ \xmlonly
y[n] - (1-alpha) y[n-1] = alpha x[n]
- \f]
+ \endxmlonly
* with the corresponding rational system function
-
- \f[
+ \htmlonly
+ \f{
H(z) = \frac{alpha}{1 - (1-alpha) z^{-1}}
- \f]
+ \f}
+ \endhtmlonly
+
+ \xmlonly
+ H(z) = \ frac{alpha}{1 - (1-alpha) z^{-1}}
+ \endxmlonly
* Note that some texts define the system function with a + in the denominator.
* If you're using that convention, you'll need to negate the feedback tap.
diff --git a/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_ff.h b/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_ff.h
index d376587df..d2bae5c26 100644
--- a/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_ff.h
+++ b/gnuradio-core/src/lib/filter/gr_single_pole_iir_filter_ff.h
@@ -39,16 +39,26 @@ gr_make_single_pole_iir_filter_ff (double alpha, unsigned int vlen=1);
* \ingroup filter_blk
*
* The input and output satisfy a difference equation of the form
+ \htmlonly
+ \f{
+ y[n] - (1-alpha) y[n-1] = alpha x[n]
+ \f}
+ \endhtmlonly
- \f[
+ \xmlonly
y[n] - (1-alpha) y[n-1] = alpha x[n]
- \f]
+ \endxmlonly
* with the corresponding rational system function
-
- \f[
+ \htmlonly
+ \f{
H(z) = \frac{alpha}{1 - (1-alpha) z^{-1}}
- \f]
+ \f}
+ \endhtmlonly
+
+ \xmlonly
+H(z) = \ frac{alpha}{1 - (1-alpha) z^{-1}}
+ \endxmlonly
* Note that some texts define the system function with a + in the denominator.
* If you're using that convention, you'll need to negate the feedback tap.
diff --git a/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.cc b/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.cc
index d9700ad2e..c894d62aa 100644
--- a/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.cc
+++ b/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.cc
@@ -34,8 +34,9 @@
#include <fftw3.h>
gri_fft_filter_ccc_generic::gri_fft_filter_ccc_generic (int decimation,
- const std::vector<gr_complex> &taps)
- : d_fftsize(-1), d_decimation(decimation), d_fwdfft(0), d_invfft(0)
+ const std::vector<gr_complex> &taps,
+ int nthreads)
+ : d_fftsize(-1), d_decimation(decimation), d_fwdfft(0), d_invfft(0), d_nthreads(nthreads)
{
set_taps(taps);
}
@@ -112,12 +113,28 @@ gri_fft_filter_ccc_generic::compute_sizes(int ntaps)
if (d_fftsize != old_fftsize){ // compute new plans
delete d_fwdfft;
delete d_invfft;
- d_fwdfft = new gri_fft_complex(d_fftsize, true);
- d_invfft = new gri_fft_complex(d_fftsize, false);
+ d_fwdfft = new gri_fft_complex(d_fftsize, true, d_nthreads);
+ d_invfft = new gri_fft_complex(d_fftsize, false, d_nthreads);
d_xformed_taps.resize(d_fftsize);
}
}
+void
+gri_fft_filter_ccc_generic::set_nthreads(int n)
+{
+ d_nthreads = n;
+ if(d_fwdfft)
+ d_fwdfft->set_nthreads(n);
+ if(d_invfft)
+ d_invfft->set_nthreads(n);
+}
+
+int
+gri_fft_filter_ccc_generic::nthreads() const
+{
+ return d_nthreads;
+}
+
int
gri_fft_filter_ccc_generic::filter (int nitems, const gr_complex *input, gr_complex *output)
{
diff --git a/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.h b/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.h
index 4db7ba50f..217b9ab83 100644
--- a/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.h
+++ b/gnuradio-core/src/lib/filter/gri_fft_filter_ccc_generic.h
@@ -42,6 +42,7 @@ class GR_CORE_API gri_fft_filter_ccc_generic
int d_decimation;
gri_fft_complex *d_fwdfft; // forward "plan"
gri_fft_complex *d_invfft; // inverse "plan"
+ int d_nthreads; // number of FFTW threads to use
std::vector<gr_complex> d_tail; // state carried between blocks for overlap-add
std::vector<gr_complex> d_xformed_taps; // Fourier xformed taps
std::vector<gr_complex> d_new_taps;
@@ -57,8 +58,10 @@ class GR_CORE_API gri_fft_filter_ccc_generic
* in other blocks for complex vectors (such as gr_fft_filter_ccc).
* \param decimation The decimation rate of the filter (int)
* \param taps The filter taps (complex)
+ * \param nthreads The number of threads for the FFT to use (int)
*/
- gri_fft_filter_ccc_generic (int decimation, const std::vector<gr_complex> &taps);
+ gri_fft_filter_ccc_generic (int decimation, const std::vector<gr_complex> &taps,
+ int nthreads=1);
~gri_fft_filter_ccc_generic ();
/*!
@@ -68,6 +71,16 @@ class GR_CORE_API gri_fft_filter_ccc_generic
* \param taps The filter taps (complex)
*/
int set_taps (const std::vector<gr_complex> &taps);
+
+ /*!
+ * \brief Set number of threads to use.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * \brief Get number of threads being used.
+ */
+ int nthreads() const;
/*!
* \brief Perform the filter operation
diff --git a/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.cc b/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.cc
index 64705ee5e..e7f66b714 100644
--- a/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.cc
+++ b/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.cc
@@ -33,8 +33,9 @@
#include <cstring>
gri_fft_filter_fff_generic::gri_fft_filter_fff_generic (int decimation,
- const std::vector<float> &taps)
- : d_fftsize(-1), d_decimation(decimation), d_fwdfft(0), d_invfft(0)
+ const std::vector<float> &taps,
+ int nthreads)
+ : d_fftsize(-1), d_decimation(decimation), d_fwdfft(0), d_invfft(0), d_nthreads(nthreads)
{
set_taps(taps);
}
@@ -105,6 +106,22 @@ gri_fft_filter_fff_generic::compute_sizes(int ntaps)
}
}
+void
+gri_fft_filter_fff_generic::set_nthreads(int n)
+{
+ d_nthreads = n;
+ if(d_fwdfft)
+ d_fwdfft->set_nthreads(n);
+ if(d_invfft)
+ d_invfft->set_nthreads(n);
+}
+
+int
+gri_fft_filter_fff_generic::nthreads() const
+{
+ return d_nthreads;
+}
+
int
gri_fft_filter_fff_generic::filter (int nitems, const float *input, float *output)
{
diff --git a/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.h b/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.h
index 86658043a..be31068aa 100644
--- a/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.h
+++ b/gnuradio-core/src/lib/filter/gri_fft_filter_fff_generic.h
@@ -39,6 +39,7 @@ class GR_CORE_API gri_fft_filter_fff_generic
int d_decimation;
gri_fft_real_fwd *d_fwdfft; // forward "plan"
gri_fft_real_rev *d_invfft; // inverse "plan"
+ int d_nthreads; // number of FFTW threads to use
std::vector<float> d_tail; // state carried between blocks for overlap-add
std::vector<gr_complex> d_xformed_taps; // Fourier xformed taps
std::vector<float> d_new_taps;
@@ -55,8 +56,10 @@ class GR_CORE_API gri_fft_filter_fff_generic
* in other blocks for floating point vectors (such as gr_fft_filter_fff).
* \param decimation The decimation rate of the filter (int)
* \param taps The filter taps (float)
+ * \param nthreads The number of threads for the FFT to use (int)
*/
- gri_fft_filter_fff_generic (int decimation, const std::vector<float> &taps);
+ gri_fft_filter_fff_generic (int decimation, const std::vector<float> &taps,
+ int nthreads=1);
~gri_fft_filter_fff_generic ();
/*!
@@ -68,6 +71,16 @@ class GR_CORE_API gri_fft_filter_fff_generic
int set_taps (const std::vector<float> &taps);
/*!
+ * \brief Set number of threads to use.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * \brief Get number of threads being used.
+ */
+ int nthreads() const;
+
+ /*!
* \brief Perform the filter operation
*
* \param nitems The number of items to produce
diff --git a/gnuradio-core/src/lib/filter/qa_gri_mmse_fir_interpolator_cc.cc b/gnuradio-core/src/lib/filter/qa_gri_mmse_fir_interpolator_cc.cc
index 2fc97a78a..d0ed04238 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_mmse_fir_interpolator_cc.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_mmse_fir_interpolator_cc.cc
@@ -31,6 +31,7 @@
#include <stdio.h>
#include <cmath>
#include <stdexcept>
+#include <unistd.h>
#define NELEM(x) (sizeof (x) / sizeof (x[0]))
diff --git a/gnuradio-core/src/lib/general/gr_burst_tagger.cc b/gnuradio-core/src/lib/general/gr_burst_tagger.cc
index 4b3847b08..bd713d663 100644
--- a/gnuradio-core/src/lib/general/gr_burst_tagger.cc
+++ b/gnuradio-core/src/lib/general/gr_burst_tagger.cc
@@ -43,10 +43,39 @@ gr_burst_tagger::gr_burst_tagger(size_t itemsize)
std::stringstream str;
str << name() << unique_id();
- d_key = pmt::pmt_string_to_symbol("burst");
+ d_true_key = pmt::pmt_string_to_symbol("burst");
+ d_true_value = pmt::PMT_T;
+
+ d_false_key = pmt::pmt_string_to_symbol("burst");
+ d_false_value = pmt::PMT_F;
+
d_id = pmt::pmt_string_to_symbol(str.str());
}
+void
+gr_burst_tagger::set_true_tag (const std::string &key, bool value)
+{
+ d_true_key = pmt::pmt_string_to_symbol(key);
+ if(value == true) {
+ d_true_value = pmt::PMT_T;
+ }
+ else {
+ d_true_value = pmt::PMT_F;
+ }
+}
+
+void
+gr_burst_tagger::set_false_tag (const std::string &key, bool value)
+{
+ d_false_key = pmt::pmt_string_to_symbol(key);
+ if(value == true) {
+ d_false_value = pmt::PMT_T;
+ }
+ else {
+ d_false_value = pmt::PMT_F;
+ }
+}
+
gr_burst_tagger::~gr_burst_tagger()
{
}
@@ -66,18 +95,15 @@ gr_burst_tagger::work(int noutput_items,
if(trigger[i] > 0) {
if(d_state == false) {
d_state = true;
- pmt::pmt_t value = pmt::PMT_T;
- add_item_tag(0, nitems_written(0)+i, d_key, value, d_id);
+ add_item_tag(0, nitems_written(0)+i, d_true_key, d_true_value, d_id);
}
}
else {
if(d_state == true) {
d_state = false;
- pmt::pmt_t value = pmt::PMT_F;
- add_item_tag(0, nitems_written(0)+i, d_key, value, d_id);
+ add_item_tag(0, nitems_written(0)+i, d_false_key, d_false_value, d_id);
}
}
}
-
return noutput_items;
}
diff --git a/gnuradio-core/src/lib/general/gr_burst_tagger.h b/gnuradio-core/src/lib/general/gr_burst_tagger.h
index 7547ba9cc..663a146f2 100644
--- a/gnuradio-core/src/lib/general/gr_burst_tagger.h
+++ b/gnuradio-core/src/lib/general/gr_burst_tagger.h
@@ -40,14 +40,21 @@ class GR_CORE_API gr_burst_tagger : public gr_sync_block
{
size_t d_itemsize;
bool d_state;
- pmt::pmt_t d_key;
+ pmt::pmt_t d_true_key;
+ pmt::pmt_t d_true_value;
+
+ pmt::pmt_t d_false_key;
+ pmt::pmt_t d_false_value;
+
pmt::pmt_t d_id;
-
+
friend GR_CORE_API gr_burst_tagger_sptr gr_make_burst_tagger(size_t itemsize);
gr_burst_tagger(size_t itemsize);
public:
~gr_burst_tagger();
+ void set_true_tag (const std::string &key, bool value);
+ void set_false_tag (const std::string &key, bool value);
int work(int noutput_items,
gr_vector_const_void_star &input_items,
diff --git a/gnuradio-core/src/lib/general/gr_burst_tagger.i b/gnuradio-core/src/lib/general/gr_burst_tagger.i
index ebf1eea8c..868941fc6 100644
--- a/gnuradio-core/src/lib/general/gr_burst_tagger.i
+++ b/gnuradio-core/src/lib/general/gr_burst_tagger.i
@@ -28,4 +28,8 @@ class gr_burst_tagger : public gr_sync_block
{
private:
gr_burst_tagger(size_t itemsize);
+
+ public:
+ void set_true_tag(const std::string &key, bool value);
+ void set_false_tag(const std::string &key, bool value);
};
diff --git a/gnuradio-core/src/lib/general/gr_fft_vcc.cc b/gnuradio-core/src/lib/general/gr_fft_vcc.cc
index d07f6fa07..f744acb93 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vcc.cc
+++ b/gnuradio-core/src/lib/general/gr_fft_vcc.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2007,2008 Free Software Foundation, Inc.
+ * Copyright 2004,2007,2008,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -32,9 +32,12 @@
#include <string.h>
gr_fft_vcc_sptr
-gr_make_fft_vcc (int fft_size, bool forward,const std::vector<float> &window, bool shift)
+gr_make_fft_vcc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift, int nthreads)
{
- return gr_make_fft_vcc_fftw(fft_size, forward, window, shift);
+ return gr_make_fft_vcc_fftw(fft_size, forward,
+ window, shift, nthreads);
}
gr_fft_vcc::gr_fft_vcc (const std::string &name,
@@ -62,3 +65,16 @@ gr_fft_vcc::set_window(const std::vector<float> &window)
else
return false;
}
+
+void
+gr_fft_vcc::set_nthreads(int n)
+{
+ throw std::runtime_error("gr_fft_vcc::set_nthreads not implemented.");
+}
+
+int
+gr_fft_vcc::nthreads() const
+{
+ throw std::runtime_error("gr_fft_vcc::nthreads not implemented.");
+ return 0;
+}
diff --git a/gnuradio-core/src/lib/general/gr_fft_vcc.h b/gnuradio-core/src/lib/general/gr_fft_vcc.h
index a7c8e1162..ceabeb681 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vcc.h
+++ b/gnuradio-core/src/lib/general/gr_fft_vcc.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2007,2008 Free Software Foundation, Inc.
+ * Copyright 2004,2007,2008,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -30,7 +30,9 @@ class gr_fft_vcc;
typedef boost::shared_ptr<gr_fft_vcc> gr_fft_vcc_sptr;
GR_CORE_API gr_fft_vcc_sptr
-gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift=false);
+gr_make_fft_vcc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift=false, int nthreads=1);
/*!
* \brief Compute forward or reverse FFT. complex vector in / complex vector out.
@@ -42,7 +44,9 @@ class GR_CORE_API gr_fft_vcc : public gr_sync_block
{
protected:
friend GR_CORE_API gr_fft_vcc_sptr
- gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift);
+ gr_make_fft_vcc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift);
unsigned int d_fft_size;
std::vector<float> d_window;
@@ -55,6 +59,9 @@ protected:
public:
~gr_fft_vcc ();
+ virtual void set_nthreads(int n);
+ virtual int nthreads() const;
+
bool set_window(const std::vector<float> &window);
};
diff --git a/gnuradio-core/src/lib/general/gr_fft_vcc.i b/gnuradio-core/src/lib/general/gr_fft_vcc.i
index f35316e70..26d8b89a3 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vcc.i
+++ b/gnuradio-core/src/lib/general/gr_fft_vcc.i
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2007,2008,2010 Free Software Foundation, Inc.
+ * Copyright 2004,2007,2008,2010,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,13 +23,19 @@
GR_SWIG_BLOCK_MAGIC(gr, fft_vcc)
gr_fft_vcc_sptr
-gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift=false);
+gr_make_fft_vcc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift=false, int nthreads=1);
class gr_fft_vcc : public gr_sync_block
{
protected:
- gr_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift);
+ gr_fft_vcc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift);
public:
bool set_window(const std::vector<float> &window);
+ void set_nthreads(int n);
+ int nthreads() const;
};
diff --git a/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc b/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc
index 3293e3ab8..a99beb965 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc
+++ b/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc
@@ -31,16 +31,21 @@
#include <string.h>
gr_fft_vcc_sptr
-gr_make_fft_vcc_fftw (int fft_size, bool forward, const std::vector<float> &window, bool shift)
+gr_make_fft_vcc_fftw (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift, int nthreads)
{
- return gnuradio::get_initial_sptr(new gr_fft_vcc_fftw (fft_size, forward, window, shift));
+ return gnuradio::get_initial_sptr(new gr_fft_vcc_fftw
+ (fft_size, forward, window,
+ shift, nthreads));
}
gr_fft_vcc_fftw::gr_fft_vcc_fftw (int fft_size, bool forward,
- const std::vector<float> &window, bool shift)
+ const std::vector<float> &window,
+ bool shift, int nthreads)
: gr_fft_vcc("fft_vcc_fftw", fft_size, forward, window, shift)
{
- d_fft = new gri_fft_complex (d_fft_size, forward);
+ d_fft = new gri_fft_complex (d_fft_size, forward, nthreads);
}
gr_fft_vcc_fftw::~gr_fft_vcc_fftw ()
@@ -48,6 +53,18 @@ gr_fft_vcc_fftw::~gr_fft_vcc_fftw ()
delete d_fft;
}
+void
+gr_fft_vcc_fftw::set_nthreads(int n)
+{
+ d_fft->set_nthreads(n);
+}
+
+int
+gr_fft_vcc_fftw::nthreads() const
+{
+ return d_fft->nthreads();
+}
+
int
gr_fft_vcc_fftw::work (int noutput_items,
gr_vector_const_void_star &input_items,
@@ -67,8 +84,17 @@ gr_fft_vcc_fftw::work (int noutput_items,
if (d_window.size()){
gr_complex *dst = d_fft->get_inbuf();
- for (unsigned int i = 0; i < d_fft_size; i++) // apply window
- dst[i] = in[i] * d_window[i];
+ if(!d_forward && d_shift){
+ unsigned int offset = (!d_forward && d_shift)?(d_fft_size/2):0;
+ int fft_m_offset = d_fft_size - offset;
+ for (int i = 0; i < offset; i++) // apply window
+ dst[i+fft_m_offset] = in[i] * d_window[i];
+ for (unsigned int i = offset; i < d_fft_size; i++) // apply window
+ dst[i-offset] = in[i] * d_window[i];
+ } else {
+ for (unsigned int i = 0; i < d_fft_size; i++) // apply window
+ dst[i] = in[i] * d_window[i];
+ }
}
else {
if(!d_forward && d_shift) { // apply an ifft shift on the data
diff --git a/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h b/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h
index 8535d133c..82b7512d7 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h
+++ b/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h
@@ -29,7 +29,9 @@
class gri_fft_complex;
GR_CORE_API gr_fft_vcc_sptr
-gr_make_fft_vcc_fftw (int fft_size, bool forward, const std::vector<float> &window, bool shift=false);
+gr_make_fft_vcc_fftw (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift=false, int nthreads=1);
/*!
* \brief Compute forward or reverse FFT. complex vector in / complex vector out.
@@ -40,15 +42,22 @@ gr_make_fft_vcc_fftw (int fft_size, bool forward, const std::vector<float> &wind
class GR_CORE_API gr_fft_vcc_fftw : public gr_fft_vcc
{
friend GR_CORE_API gr_fft_vcc_sptr
- gr_make_fft_vcc_fftw (int fft_size, bool forward, const std::vector<float> &window, bool shift);
+ gr_make_fft_vcc_fftw (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift, int nthreads);
gri_fft_complex *d_fft;
- gr_fft_vcc_fftw (int fft_size, bool forward, const std::vector<float> &window, bool shift);
+ gr_fft_vcc_fftw (int fft_size, bool forward,
+ const std::vector<float> &window,
+ bool shift, int nthreads=1);
public:
~gr_fft_vcc_fftw ();
+ void set_nthreads(int n);
+ int nthreads() const;
+
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
diff --git a/gnuradio-core/src/lib/general/gr_fft_vfc.cc b/gnuradio-core/src/lib/general/gr_fft_vfc.cc
index 561c63740..5fbe732dc 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vfc.cc
+++ b/gnuradio-core/src/lib/general/gr_fft_vfc.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2010 Free Software Foundation, Inc.
+ * Copyright 2004,2010,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -40,12 +40,17 @@
gr_fft_vfc_sptr
-gr_make_fft_vfc (int fft_size, bool forward, const std::vector<float> &window)
+gr_make_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads)
{
- return gnuradio::get_initial_sptr(new gr_fft_vfc (fft_size, forward, window));
+ return gnuradio::get_initial_sptr(new gr_fft_vfc (fft_size, forward,
+ window, nthreads));
}
-gr_fft_vfc::gr_fft_vfc (int fft_size, bool forward, const std::vector<float> &window)
+gr_fft_vfc::gr_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads)
: gr_sync_block ("fft_vfc",
gr_make_io_signature (1, 1, fft_size * sizeof (float)),
gr_make_io_signature (1, 1, fft_size * sizeof (gr_complex))),
@@ -56,7 +61,7 @@ gr_fft_vfc::gr_fft_vfc (int fft_size, bool forward, const std::vector<float> &wi
throw std::invalid_argument ("fft_vfc: forward must == true");
}
- d_fft = new gri_fft_complex (d_fft_size, forward);
+ d_fft = new gri_fft_complex (d_fft_size, forward, nthreads);
set_window(window);
}
@@ -66,6 +71,18 @@ gr_fft_vfc::~gr_fft_vfc ()
delete d_fft;
}
+void
+gr_fft_vfc::set_nthreads(int n)
+{
+ d_fft->set_nthreads(n);
+}
+
+int
+gr_fft_vfc::nthreads() const
+{
+ return d_fft->nthreads();
+}
+
int
gr_fft_vfc::work (int noutput_items,
gr_vector_const_void_star &input_items,
diff --git a/gnuradio-core/src/lib/general/gr_fft_vfc.h b/gnuradio-core/src/lib/general/gr_fft_vfc.h
index 6cf6b9037..84ae08f08 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vfc.h
+++ b/gnuradio-core/src/lib/general/gr_fft_vfc.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2010 Free Software Foundation, Inc.
+ * Copyright 2004,2010,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -32,7 +32,9 @@ class gr_fft_vfc;
typedef boost::shared_ptr<gr_fft_vfc> gr_fft_vfc_sptr;
GR_CORE_API gr_fft_vfc_sptr
-gr_make_fft_vfc (int fft_size, bool forward, const std::vector<float> &window);
+gr_make_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads=1);
/*!
* \brief Compute forward FFT. float vector in / complex vector out.
@@ -42,17 +44,24 @@ gr_make_fft_vfc (int fft_size, bool forward, const std::vector<float> &window);
class GR_CORE_API gr_fft_vfc : public gr_sync_block
{
friend GR_CORE_API gr_fft_vfc_sptr
- gr_make_fft_vfc (int fft_size, bool forward, const std::vector<float> &window);
+ gr_make_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads);
unsigned int d_fft_size;
std::vector<float> d_window;
gri_fft_complex *d_fft;
- gr_fft_vfc (int fft_size, bool forward, const std::vector<float> &window);
+ gr_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads=1);
public:
~gr_fft_vfc ();
+ void set_nthreads(int n);
+ int nthreads() const;
+
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
diff --git a/gnuradio-core/src/lib/general/gr_fft_vfc.i b/gnuradio-core/src/lib/general/gr_fft_vfc.i
index 149745b58..4783ae1fe 100644
--- a/gnuradio-core/src/lib/general/gr_fft_vfc.i
+++ b/gnuradio-core/src/lib/general/gr_fft_vfc.i
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2010 Free Software Foundation, Inc.
+ * Copyright 2004,2010,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,14 +23,20 @@
GR_SWIG_BLOCK_MAGIC(gr, fft_vfc)
gr_fft_vfc_sptr
-gr_make_fft_vfc (int fft_size, bool forward, const std::vector<float> &window)
+gr_make_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads=1)
throw(std::exception);
class gr_fft_vfc : public gr_sync_block
{
protected:
- gr_fft_vfc (int fft_size, bool forward, const std::vector<float> &window);
+ gr_fft_vfc (int fft_size, bool forward,
+ const std::vector<float> &window,
+ int nthreads=1);
public:
bool set_window(const std::vector<float> &window);
+ void set_nthreads(int n);
+ int nthreads() const;
};
diff --git a/gnuradio-core/src/lib/general/gri_fft.cc b/gnuradio-core/src/lib/general/gri_fft.cc
index 0df1af25d..63e307776 100644
--- a/gnuradio-core/src/lib/general/gri_fft.cc
+++ b/gnuradio-core/src/lib/general/gri_fft.cc
@@ -78,6 +78,22 @@ gri_fftw_import_wisdom ()
}
static void
+gri_fftw_config_threading (int nthreads)
+{
+ static int fftw_threads_inited = 0;
+
+#ifdef FFTW3F_THREADS
+ if (fftw_threads_inited == 0)
+ {
+ fftw_threads_inited = 1;
+ fftwf_init_threads();
+ }
+
+ fftwf_plan_with_nthreads(nthreads);
+#endif
+}
+
+static void
gri_fftw_export_wisdom ()
{
const char *filename = wisdom_filename ();
@@ -94,7 +110,7 @@ gri_fftw_export_wisdom ()
// ----------------------------------------------------------------
-gri_fft_complex::gri_fft_complex (int fft_size, bool forward)
+gri_fft_complex::gri_fft_complex (int fft_size, bool forward, int nthreads)
{
// Hold global mutex during plan construction and destruction.
gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
@@ -115,7 +131,10 @@ gri_fft_complex::gri_fft_complex (int fft_size, bool forward)
throw std::runtime_error ("fftwf_malloc");
}
+ d_nthreads = nthreads;
+ gri_fftw_config_threading (nthreads);
gri_fftw_import_wisdom (); // load prior wisdom from disk
+
d_plan = fftwf_plan_dft_1d (fft_size,
reinterpret_cast<fftwf_complex *>(d_inbuf),
reinterpret_cast<fftwf_complex *>(d_outbuf),
@@ -139,6 +158,18 @@ gri_fft_complex::~gri_fft_complex ()
fftwf_free (d_outbuf);
}
+void
+gri_fft_complex::set_nthreads(int n)
+{
+ if (n <= 0)
+ throw std::out_of_range ("gri_fftw: invalid number of threads");
+ d_nthreads = n;
+
+#ifdef FFTW3F_THREADS
+ fftwf_plan_with_nthreads(d_nthreads);
+#endif
+}
+
void
gri_fft_complex::execute ()
{
@@ -147,7 +178,7 @@ gri_fft_complex::execute ()
// ----------------------------------------------------------------
-gri_fft_real_fwd::gri_fft_real_fwd (int fft_size)
+gri_fft_real_fwd::gri_fft_real_fwd (int fft_size, int nthreads)
{
// Hold global mutex during plan construction and destruction.
gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
@@ -168,7 +199,10 @@ gri_fft_real_fwd::gri_fft_real_fwd (int fft_size)
throw std::runtime_error ("fftwf_malloc");
}
+ d_nthreads = nthreads;
+ gri_fftw_config_threading (nthreads);
gri_fftw_import_wisdom (); // load prior wisdom from disk
+
d_plan = fftwf_plan_dft_r2c_1d (fft_size,
d_inbuf,
reinterpret_cast<fftwf_complex *>(d_outbuf),
@@ -191,6 +225,18 @@ gri_fft_real_fwd::~gri_fft_real_fwd ()
fftwf_free (d_outbuf);
}
+void
+gri_fft_real_fwd::set_nthreads(int n)
+{
+ if (n <= 0)
+ throw std::out_of_range ("gri_fftw: invalid number of threads");
+ d_nthreads = n;
+
+#ifdef FFTW3F_THREADS
+ fftwf_plan_with_nthreads(d_nthreads);
+#endif
+}
+
void
gri_fft_real_fwd::execute ()
{
@@ -199,7 +245,7 @@ gri_fft_real_fwd::execute ()
// ----------------------------------------------------------------
-gri_fft_real_rev::gri_fft_real_rev (int fft_size)
+gri_fft_real_rev::gri_fft_real_rev (int fft_size, int nthreads)
{
// Hold global mutex during plan construction and destruction.
gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
@@ -220,11 +266,13 @@ gri_fft_real_rev::gri_fft_real_rev (int fft_size)
throw std::runtime_error ("fftwf_malloc");
}
+ d_nthreads = nthreads;
+ gri_fftw_config_threading (nthreads);
+ gri_fftw_import_wisdom (); // load prior wisdom from disk
+
// FIXME If there's ever a chance that the planning functions
// will be called in multiple threads, we've got to ensure single
// threaded access. They are not thread-safe.
-
- gri_fftw_import_wisdom (); // load prior wisdom from disk
d_plan = fftwf_plan_dft_c2r_1d (fft_size,
reinterpret_cast<fftwf_complex *>(d_inbuf),
d_outbuf,
@@ -244,6 +292,18 @@ gri_fft_real_rev::~gri_fft_real_rev ()
fftwf_free (d_outbuf);
}
+void
+gri_fft_real_rev::set_nthreads(int n)
+{
+ if (n <= 0)
+ throw std::out_of_range ("gri_fftw: invalid number of threads");
+ d_nthreads = n;
+
+#ifdef FFTW3F_THREADS
+ fftwf_plan_with_nthreads(d_nthreads);
+#endif
+}
+
void
gri_fft_real_rev::execute ()
{
diff --git a/gnuradio-core/src/lib/general/gri_fft.h b/gnuradio-core/src/lib/general/gri_fft.h
index 91a82fb55..ed80badf1 100644
--- a/gnuradio-core/src/lib/general/gri_fft.h
+++ b/gnuradio-core/src/lib/general/gri_fft.h
@@ -49,12 +49,13 @@ public:
*/
class GR_CORE_API gri_fft_complex {
int d_fft_size;
+ int d_nthreads;
gr_complex *d_inbuf;
gr_complex *d_outbuf;
void *d_plan;
public:
- gri_fft_complex (int fft_size, bool forward = true);
+ gri_fft_complex (int fft_size, bool forward = true, int nthreads=1);
virtual ~gri_fft_complex ();
/*
@@ -69,6 +70,16 @@ public:
int outbuf_length () const { return d_fft_size; }
/*!
+ * Set the number of threads to use for caclulation.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * Get the number of threads being used by FFTW
+ */
+ int nthreads() const { return d_nthreads; }
+
+ /*!
* compute FFT. The input comes from inbuf, the output is placed in outbuf.
*/
void execute ();
@@ -80,12 +91,13 @@ public:
*/
class GR_CORE_API gri_fft_real_fwd {
int d_fft_size;
+ int d_nthreads;
float *d_inbuf;
gr_complex *d_outbuf;
void *d_plan;
public:
- gri_fft_real_fwd (int fft_size);
+ gri_fft_real_fwd (int fft_size, int nthreads=1);
virtual ~gri_fft_real_fwd ();
/*
@@ -100,6 +112,16 @@ public:
int outbuf_length () const { return d_fft_size / 2 + 1; }
/*!
+ * Set the number of threads to use for caclulation.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * Get the number of threads being used by FFTW
+ */
+ int nthreads() const { return d_nthreads; }
+
+ /*!
* compute FFT. The input comes from inbuf, the output is placed in outbuf.
*/
void execute ();
@@ -111,12 +133,13 @@ public:
*/
class GR_CORE_API gri_fft_real_rev {
int d_fft_size;
+ int d_nthreads;
gr_complex *d_inbuf;
float *d_outbuf;
void *d_plan;
public:
- gri_fft_real_rev (int fft_size);
+ gri_fft_real_rev (int fft_size, int nthreads=1);
virtual ~gri_fft_real_rev ();
/*
@@ -131,6 +154,16 @@ public:
int outbuf_length () const { return d_fft_size; }
/*!
+ * Set the number of threads to use for caclulation.
+ */
+ void set_nthreads(int n);
+
+ /*!
+ * Get the number of threads being used by FFTW
+ */
+ int nthreads() const { return d_nthreads; }
+
+ /*!
* compute FFT. The input comes from inbuf, the output is placed in outbuf.
*/
void execute ();
diff --git a/gnuradio-core/src/lib/io/gr_oscope_guts.cc b/gnuradio-core/src/lib/io/gr_oscope_guts.cc
index ce7feca13..8b0d1e632 100644
--- a/gnuradio-core/src/lib/io/gr_oscope_guts.cc
+++ b/gnuradio-core/src/lib/io/gr_oscope_guts.cc
@@ -31,24 +31,36 @@
#include <math.h>
#include <assert.h>
-static const int OUTPUT_RECORD_SIZE = 2048; // must be power of 2
+/*
+ * Bad performance if it's large, and flaky triggering if it's too small
+ */
+static const int OUTPUT_RECORD_SIZE = 1024; // Must be power of 2
+
+/*
+ * For (slow-updated) STRIPCHART triggering, we make the record size larger, since we
+ * potentially want to be able to "see" hours of data. This works as long as the
+ * update rates to a STRIPCHART are low, which they generally are--that's rather what
+ * a stripchart is all about!
+ */
+static const int SCHART_MULT = 8;
+
static inline int
-wrap_bi (int buffer_index) // wrap buffer index
+wrap_bi (int buffer_index, int mx) // wrap buffer index
{
- return buffer_index & (OUTPUT_RECORD_SIZE - 1);
+ return buffer_index & (mx - 1);
}
static inline int
-incr_bi (int buffer_index) // increment buffer index
+incr_bi (int buffer_index, int mx) // increment buffer index
{
- return wrap_bi (buffer_index + 1);
+ return wrap_bi (buffer_index + 1, mx);
}
static inline int
-decr_bi (int buffer_index) // decrement buffer index
+decr_bi (int buffer_index, int mx) // decrement buffer index
{
- return wrap_bi (buffer_index - 1);
+ return wrap_bi (buffer_index - 1, mx);
}
gr_oscope_guts::gr_oscope_guts (double sample_rate, gr_msg_queue_sptr msgq)
@@ -74,8 +86,8 @@ gr_oscope_guts::gr_oscope_guts (double sample_rate, gr_msg_queue_sptr msgq)
d_buffer[i] = 0;
for (int i = 0; i < MAX_CHANNELS; i++){
- d_buffer[i] = new float [OUTPUT_RECORD_SIZE];
- for (int j = 0; j < OUTPUT_RECORD_SIZE; j++)
+ d_buffer[i] = new float [OUTPUT_RECORD_SIZE*SCHART_MULT];
+ for (int j = 0; j < OUTPUT_RECORD_SIZE*SCHART_MULT; j++)
d_buffer[i][j] = 0.0;
}
@@ -133,18 +145,19 @@ gr_oscope_guts::process_sample (const float *channel_data)
assert (0);
}
- d_obi = incr_bi (d_obi);
+ d_obi = incr_bi (d_obi, OUTPUT_RECORD_SIZE);
}
else
{
for (int i = 0; i < d_nchannels; i++)
{
- for (int j = OUTPUT_RECORD_SIZE-1; j >= 0; j--)
+ for (int j = (OUTPUT_RECORD_SIZE*SCHART_MULT)-1; j > 0; j--)
{
d_buffer[i][j] = d_buffer[i][j-1];
}
d_buffer[i][0] = channel_data[i];
}
+ d_trigger_off = 0;
write_output_records();
}
}
@@ -183,7 +196,10 @@ gr_oscope_guts::enter_post_trigger ()
bool
gr_oscope_guts::found_trigger ()
{
- float prev_sample = d_buffer[d_trigger_channel][decr_bi(d_obi)];
+ int mx = d_trigger_mode == gr_TRIG_MODE_STRIPCHART ? OUTPUT_RECORD_SIZE*SCHART_MULT :
+ OUTPUT_RECORD_SIZE;
+
+ float prev_sample = d_buffer[d_trigger_channel][decr_bi(d_obi, mx)];
float new_sample = d_buffer[d_trigger_channel][d_obi];
switch (d_trigger_mode){
@@ -224,6 +240,11 @@ gr_oscope_guts::found_trigger ()
void
gr_oscope_guts::write_output_records ()
{
+ int mx;
+
+ mx = d_trigger_mode == gr_TRIG_MODE_STRIPCHART ?
+ OUTPUT_RECORD_SIZE*SCHART_MULT : OUTPUT_RECORD_SIZE;
+
// if the output queue if full, drop the data like its hot.
if (d_msgq->full_p())
return;
@@ -231,17 +252,17 @@ gr_oscope_guts::write_output_records ()
gr_message_sptr msg =
gr_make_message(0, // msg type
d_nchannels, // arg1 for other side
- OUTPUT_RECORD_SIZE, // arg2 for other side
- ((d_nchannels * OUTPUT_RECORD_SIZE) + 1) * sizeof(float)); // sizeof payload
+ mx, // arg2 for other side
+ ((d_nchannels * mx) + 1) * sizeof(float)); // sizeof payload
float *out = (float *)msg->msg(); // get pointer to raw message buffer
for (int ch = 0; ch < d_nchannels; ch++){
// note that d_obi + 1 points at the oldest sample in the buffer
- for (int i = 0; i < OUTPUT_RECORD_SIZE; i++){
- out[i] = d_buffer[ch][wrap_bi(d_obi + 1 + i)];
+ for (int i = 0; i < mx; i++){
+ out[i] = d_buffer[ch][wrap_bi(d_obi + 1 + i, mx)];
}
- out += OUTPUT_RECORD_SIZE;
+ out += mx;
}
//Set the last sample as the trigger offset:
// The non gl scope sink will not look at this last sample.
@@ -405,5 +426,12 @@ gr_oscope_guts::get_trigger_level () const
int
gr_oscope_guts::get_samples_per_output_record () const
{
- return OUTPUT_RECORD_SIZE;
+ int mx;
+
+ mx = OUTPUT_RECORD_SIZE;
+ if (d_trigger_mode == gr_TRIG_MODE_STRIPCHART)
+ {
+ mx = OUTPUT_RECORD_SIZE*SCHART_MULT;
+ }
+ return mx;
}
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_fft.py b/gnuradio-core/src/python/gnuradio/gr/qa_fft.py
index 98d80fbb0..e90eb2e7f 100755
--- a/gnuradio-core/src/python/gnuradio/gr/qa_fft.py
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_fft.py
@@ -152,6 +152,60 @@ class test_fft(gr_unittest.TestCase):
#self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
self.assert_fft_ok2(expected_result, result_data)
+ def test_003(self):
+ # Same test as above, only use 2 threads
+
+ tb = gr.top_block()
+ fft_size = 32
+
+ tmp_data = ((4377+4516j),
+ (-1706.1268310546875+1638.4256591796875j),
+ (-915.2083740234375+660.69427490234375j),
+ (-660.370361328125+381.59600830078125j),
+ (-499.96044921875+238.41630554199219j),
+ (-462.26748657226562+152.88948059082031j),
+ (-377.98440551757812+77.5928955078125j),
+ (-346.85821533203125+47.152004241943359j),
+ (-295+20j),
+ (-286.33609008789062-22.257017135620117j),
+ (-271.52999877929688-33.081821441650391j),
+ (-224.6358642578125-67.019538879394531j),
+ (-244.24473571777344-91.524826049804688j),
+ (-203.09068298339844-108.54627227783203j),
+ (-198.45195007324219-115.90768432617188j),
+ (-182.97744750976562-128.12318420410156j),
+ (-167-180j),
+ (-130.33688354492188-173.83778381347656j),
+ (-141.19784545898438-190.28807067871094j),
+ (-111.09677124023438-214.48896789550781j),
+ (-70.039543151855469-242.41630554199219j),
+ (-68.960540771484375-228.30015563964844j),
+ (-53.049201965332031-291.47097778320312j),
+ (-28.695289611816406-317.64553833007812j),
+ (57-300j),
+ (45.301143646240234-335.69509887695312j),
+ (91.936195373535156-373.32437133789062j),
+ (172.09465026855469-439.275146484375j),
+ (242.24473571777344-504.47515869140625j),
+ (387.81732177734375-666.6788330078125j),
+ (689.48553466796875-918.2142333984375j),
+ (1646.539306640625-1694.1956787109375j))
+
+ src_data = tuple([x/fft_size for x in tmp_data])
+
+ expected_result = tuple([complex(primes[2*i], primes[2*i+1]) for i in range(fft_size)])
+
+ nthreads = 2
+
+ src = gr.vector_source_c(src_data)
+ s2v = gr.stream_to_vector(gr.sizeof_gr_complex, fft_size)
+ fft = gr.fft_vcc(fft_size, False, [], False, nthreads)
+ v2s = gr.vector_to_stream(gr.sizeof_gr_complex, fft_size)
+ dst = gr.vector_sink_c()
+ tb.connect(src, s2v, fft, v2s, dst)
+ tb.run()
+ result_data = dst.data()
+ self.assert_fft_ok2(expected_result, result_data)
if __name__ == '__main__':
gr_unittest.run(test_fft, "test_fft.xml")
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_fft_filter.py b/gnuradio-core/src/python/gnuradio/gr/qa_fft_filter.py
index 325495c1d..1e9fdb6a8 100755
--- a/gnuradio-core/src/python/gnuradio/gr/qa_fft_filter.py
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_fft_filter.py
@@ -110,6 +110,23 @@ class test_fft_filter(gr_unittest.TestCase):
def test_ccc_002(self):
+ # Test nthreads
+ tb = gr.top_block()
+ src_data = (0,1,2,3,4,5,6,7)
+ taps = (2,)
+ nthreads = 2
+ expected_result = tuple([2 * complex(x) for x in (0,1,2,3,4,5,6,7)])
+ src = gr.vector_source_c(src_data)
+ op = gr.fft_filter_ccc(1, taps, nthreads)
+ dst = gr.vector_sink_c()
+ tb.connect(src, op, dst)
+ tb.run()
+ result_data = dst.data()
+ #print 'expected:', expected_result
+ #print 'results: ', result_data
+ self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
+
+ def test_ccc_003(self):
tb = gr.top_block()
src_data = (0,1,2,3,4,5,6,7)
taps = (2,)
@@ -124,6 +141,7 @@ class test_fft_filter(gr_unittest.TestCase):
#print 'results: ', result_data
self.assertComplexTuplesAlmostEqual (expected_result, result_data, 5)
+
def test_ccc_004(self):
random.seed(0)
for i in xrange(25):
@@ -167,6 +185,30 @@ class test_fft_filter(gr_unittest.TestCase):
self.assert_fft_ok2(expected_result, result_data)
+ def test_ccc_006(self):
+ # Test decimating with nthreads=2
+ random.seed(0)
+ nthreads = 2
+ for i in xrange(25):
+ # sys.stderr.write("\n>>> Loop = %d\n" % (i,))
+ dec = i + 1
+ src_len = 4*1024
+ src_data = make_random_complex_tuple(src_len)
+ ntaps = int(random.uniform(2, 100))
+ taps = make_random_complex_tuple(ntaps)
+ expected_result = reference_filter_ccc(dec, taps, src_data)
+
+ src = gr.vector_source_c(src_data)
+ op = gr.fft_filter_ccc(dec, taps, nthreads)
+ dst = gr.vector_sink_c()
+ tb = gr.top_block()
+ tb.connect(src, op, dst)
+ tb.run()
+ del tb
+ result_data = dst.data()
+
+ self.assert_fft_ok2(expected_result, result_data)
+
# ----------------------------------------------------------------
# test _fff version
# ----------------------------------------------------------------
@@ -202,7 +244,22 @@ class test_fft_filter(gr_unittest.TestCase):
#print 'results: ', result_data
self.assertFloatTuplesAlmostEqual (expected_result, result_data, 5)
- def xtest_fff_003(self):
+ def test_fff_003(self):
+ # Test 02 with nthreads
+ tb = gr.top_block()
+ src_data = (0,1,2,3,4,5,6,7)
+ taps = (2,)
+ nthreads = 2
+ expected_result = tuple([2 * float(x) for x in (0,1,2,3,4,5,6,7)])
+ src = gr.vector_source_f(src_data)
+ op = gr.fft_filter_fff(1, taps, nthreads)
+ dst = gr.vector_sink_f()
+ tb.connect(src, op, dst)
+ tb.run()
+ result_data = dst.data()
+ self.assertFloatTuplesAlmostEqual (expected_result, result_data, 5)
+
+ def xtest_fff_004(self):
random.seed(0)
for i in xrange(25):
sys.stderr.write("\n>>> Loop = %d\n" % (i,))
@@ -232,7 +289,7 @@ class test_fft_filter(gr_unittest.TestCase):
actual.write(`x` + '\n')
raise
- def xtest_fff_004(self):
+ def xtest_fff_005(self):
random.seed(0)
for i in xrange(25):
sys.stderr.write("\n>>> Loop = %d\n" % (i,))
@@ -252,7 +309,7 @@ class test_fft_filter(gr_unittest.TestCase):
self.assert_fft_float_ok2(expected_result, result_data, abs_eps=2.0)
- def xtest_fff_005(self):
+ def xtest_fff_006(self):
random.seed(0)
for i in xrange(25):
sys.stderr.write("\n>>> Loop = %d\n" % (i,))
@@ -273,6 +330,29 @@ class test_fft_filter(gr_unittest.TestCase):
self.assert_fft_float_ok2(expected_result, result_data)
+ def xtest_fff_007(self):
+ # test decimation with nthreads
+ random.seed(0)
+ nthreads = 2
+ for i in xrange(25):
+ sys.stderr.write("\n>>> Loop = %d\n" % (i,))
+ dec = i + 1
+ src_len = 4*1024
+ src_data = make_random_float_tuple(src_len)
+ ntaps = int(random.uniform(2, 100))
+ taps = make_random_float_tuple(ntaps)
+ expected_result = reference_filter_fff(dec, taps, src_data)
+
+ src = gr.vector_source_f(src_data)
+ op = gr.fft_filter_fff(dec, taps, nthreads)
+ dst = gr.vector_sink_f()
+ tb = gr.top_block()
+ tb.connect(src, op, dst)
+ tb.run()
+ result_data = dst.data()
+
+ self.assert_fft_float_ok2(expected_result, result_data)
+
def test_fff_get0(self):
random.seed(0)
for i in xrange(25):
diff --git a/gnuradio-examples/grc/audio/cvsd_sweep.grc b/gnuradio-examples/grc/audio/cvsd_sweep.grc
index 8d0b385ce..b645b747a 100644
--- a/gnuradio-examples/grc/audio/cvsd_sweep.grc
+++ b/gnuradio-examples/grc/audio/cvsd_sweep.grc
@@ -25,10 +25,10 @@
</param>
</block>
<block>
- <key>blks2_cvsd_decode</key>
+ <key>vocoder_cvsd_decode_bf</key>
<param>
<key>id</key>
- <value>blks2_cvsd_decode_0</value>
+ <value>vocoder_cvsd_decode_bf_0</value>
</param>
<param>
<key>_enabled</key>
@@ -157,7 +157,7 @@
</param>
</block>
<block>
- <key>blks2_cvsd_encode</key>
+ <key>vocoder_cvsd_encode_fb</key>
<param>
<key>id</key>
<value>enc</value>
@@ -863,7 +863,7 @@
</connection>
<connection>
<source_block_id>enc</source_block_id>
- <sink_block_id>blks2_cvsd_decode_0</sink_block_id>
+ <sink_block_id>vocoder_cvsd_decode_bf_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@@ -874,19 +874,19 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blks2_cvsd_decode_0</source_block_id>
+ <source_block_id>vocoder_cvsd_decode_bf_0</source_block_id>
<sink_block_id>dec_fft</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blks2_cvsd_decode_0</source_block_id>
+ <source_block_id>vocoder_cvsd_decode_bf_0</source_block_id>
<sink_block_id>dec_scope</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blks2_cvsd_decode_0</source_block_id>
+ <source_block_id>vocoder_cvsd_decode_bf_0</source_block_id>
<sink_block_id>audio_sink</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
diff --git a/gr-digital/examples/narrowband/digital_bert_rx.py b/gr-digital/examples/narrowband/digital_bert_rx.py
index 28331310d..dfed0eee7 100755
--- a/gr-digital/examples/narrowband/digital_bert_rx.py
+++ b/gr-digital/examples/narrowband/digital_bert_rx.py
@@ -113,9 +113,11 @@ class rx_psk_block(gr.top_block):
self._demodulator = self._demodulator_class(**demod_kwargs)
if(options.rx_freq is not None):
+ symbol_rate = options.bitrate / self._demodulator.bits_per_symbol()
self._source = uhd_receiver(options.args, options.bitrate,
options.samples_per_symbol,
options.rx_freq, options.rx_gain,
+ options.spec,
options.antenna, options.verbose)
options.samples_per_symbol = self._source._sps
diff --git a/gr-digital/examples/narrowband/digital_bert_tx.py b/gr-digital/examples/narrowband/digital_bert_tx.py
index 46f4f9097..f29e997af 100755
--- a/gr-digital/examples/narrowband/digital_bert_tx.py
+++ b/gr-digital/examples/narrowband/digital_bert_tx.py
@@ -67,9 +67,11 @@ class tx_psk_block(gr.top_block):
self._modulator = self._modulator_class(**mod_kwargs)
if(options.tx_freq is not None):
- self._sink = uhd_transmitter(options.args, options.bitrate,
+ symbol_rate = options.bitrate / self._modulator.bits_per_symbol()
+ self._sink = uhd_transmitter(options.args, symbol_rate,
options.samples_per_symbol,
options.tx_freq, options.tx_gain,
+ options.spec,
options.antenna, options.verbose)
options.samples_per_symbol = self._sink._sps
@@ -87,7 +89,8 @@ class tx_psk_block(gr.top_block):
verbose=options.verbose,
log=options.log)
- self.connect(self._transmitter, self._sink)
+ self.amp = gr.multiply_const_cc(options.amplitude)
+ self.connect(self._transmitter, self.amp, self._sink)
def get_options(mods):
diff --git a/gr-digital/include/digital_mpsk_receiver_cc.h b/gr-digital/include/digital_mpsk_receiver_cc.h
index e70495bfa..02cea8d25 100644
--- a/gr-digital/include/digital_mpsk_receiver_cc.h
+++ b/gr-digital/include/digital_mpsk_receiver_cc.h
@@ -91,23 +91,37 @@ class DIGITAL_API digital_mpsk_receiver_cc : public gr_block, public gri_control
gr_vector_void_star &output_items);
- // Member functions related to the symbol tracking portion of the receiver
- //! (M&M) Returns current value of mu
- float mu() const { return d_mu;}
+ //! Returns the modulation order (M) currently set
+ float modulation_order() const { return d_M; }
- //! (M&M) Returns current value of omega
- float omega() const { return d_omega;}
+ //! Returns current value of theta
+ float theta() const { return d_theta; }
- //! (M&M) Returns mu gain factor
- float gain_mu() const { return d_gain_mu;}
+ //! Returns current value of mu
+ float mu() const { return d_mu; }
- //! (M&M) Returns omega gain factor
- float gain_omega() const { return d_gain_omega;}
+ //! Returns current value of omega
+ float omega() const { return d_omega; }
- //! (M&M) Sets value of mu
+ //! Returns mu gain factor
+ float gain_mu() const { return d_gain_mu; }
+
+ //! Returns omega gain factor
+ float gain_omega() const { return d_gain_omega; }
+
+ //! Returns the relative omega limit
+ float gain_omega_rel() const {return d_omega_rel; }
+
+ //! Sets the modulation order (M) currently
+ void set_modulation_order(unsigned int M);
+
+ //! Sets value of theta
+ void set_theta(float theta) { d_theta = theta; }
+
+ //! Sets value of mu
void set_mu (float mu) { d_mu = mu; }
- //! (M&M) Sets value of omega and its min and max values
+ //! Sets value of omega and its min and max values
void set_omega (float omega) {
d_omega = omega;
d_min_omega = omega*(1.0 - d_omega_rel);
@@ -115,12 +129,15 @@ class DIGITAL_API digital_mpsk_receiver_cc : public gr_block, public gri_control
d_omega_mid = 0.5*(d_min_omega+d_max_omega);
}
- //! (M&M) Sets value for mu gain factor
+ //! Sets value for mu gain factor
void set_gain_mu (float gain_mu) { d_gain_mu = gain_mu; }
- //! (M&M) Sets value for omega gain factor
+ //! Sets value for omega gain factor
void set_gain_omega (float gain_omega) { d_gain_omega = gain_omega; }
+ //! Sets the relative omega limit and resets omega min/max values
+ void set_gain_omega_rel(float omega_rel);
+
protected:
/*!
diff --git a/gr-digital/lib/digital_mpsk_receiver_cc.cc b/gr-digital/lib/digital_mpsk_receiver_cc.cc
index 363b86c9f..6d2bab8a4 100644
--- a/gr-digital/lib/digital_mpsk_receiver_cc.cc
+++ b/gr-digital/lib/digital_mpsk_receiver_cc.cc
@@ -85,7 +85,18 @@ digital_mpsk_receiver_cc::digital_mpsk_receiver_cc (unsigned int M, float theta,
// zero double length delay line.
for (unsigned int i = 0; i < 2 * DLLEN; i++)
d_dl[i] = gr_complex(0.0,0.0);
+
+ set_modulation_order(d_M);
+}
+
+digital_mpsk_receiver_cc::~digital_mpsk_receiver_cc ()
+{
+ delete d_interp;
+}
+void
+digital_mpsk_receiver_cc::set_modulation_order(unsigned int M)
+{
// build the constellation vector from M
make_constellation();
@@ -108,9 +119,11 @@ digital_mpsk_receiver_cc::digital_mpsk_receiver_cc (unsigned int M, float theta,
}
}
-digital_mpsk_receiver_cc::~digital_mpsk_receiver_cc ()
+void
+digital_mpsk_receiver_cc::set_gain_omega_rel(float omega_rel)
{
- delete d_interp;
+ d_omega_rel = omega_rel;
+ set_omega(d_omega);
}
void
diff --git a/gr-digital/swig/digital_mpsk_receiver_cc.i b/gr-digital/swig/digital_mpsk_receiver_cc.i
index b51411f6f..2338a1854 100644
--- a/gr-digital/swig/digital_mpsk_receiver_cc.i
+++ b/gr-digital/swig/digital_mpsk_receiver_cc.i
@@ -37,16 +37,21 @@ class digital_mpsk_receiver_cc : public gr_block, public gri_control_loop
float mu, float gain_mu,
float omega, float gain_omega, float omega_rel);
public:
+ float modulation_order() const { return d_M; }
float mu() const { return d_mu;}
float omega() const { return d_omega;}
float gain_mu() const { return d_gain_mu;}
float gain_omega() const { return d_gain_omega;}
+ float gain_omega_rel() const {return d_omega_rel; }
+ void set_modulation_order(unsigned int M);
void set_mu (float mu) { d_mu = mu; }
void set_omega (float omega) {
d_omega = omega;
d_min_omega = omega*(1.0 - d_omega_rel);
d_max_omega = omega*(1.0 + d_omega_rel);
}
+ void set_theta(float theta) { d_theta = theta; }
void set_gain_mu (float gain_mu) { d_gain_mu = gain_mu; }
void set_gain_omega (float gain_omega) { d_gain_omega = gain_omega; }
+ void set_gain_omega_rel(float omega_rel);
};
diff --git a/gr-howto-write-a-block-cmake/CMakeLists.txt b/gr-howto-write-a-block-cmake/CMakeLists.txt
index 9d2d18258..58285ae8f 100644
--- a/gr-howto-write-a-block-cmake/CMakeLists.txt
+++ b/gr-howto-write-a-block-cmake/CMakeLists.txt
@@ -115,6 +115,18 @@ set(GR_HOWTO_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL ""
set(GR_HOWTO_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
########################################################################
+# Create uninstall target
+########################################################################
+configure_file(
+ ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
+@ONLY)
+
+add_custom_target(uninstall
+ ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
+)
+
+########################################################################
# Add subdirectories
########################################################################
add_subdirectory(include)
@@ -123,4 +135,4 @@ add_subdirectory(swig)
add_subdirectory(python)
add_subdirectory(grc)
add_subdirectory(apps)
-add_subdirectory(docs) \ No newline at end of file
+add_subdirectory(docs)
diff --git a/gr-howto-write-a-block-cmake/cmake/Modules/FindGnuradioCore.cmake b/gr-howto-write-a-block-cmake/cmake/Modules/FindGnuradioCore.cmake
index b45cf95e6..3773588a7 100644
--- a/gr-howto-write-a-block-cmake/cmake/Modules/FindGnuradioCore.cmake
+++ b/gr-howto-write-a-block-cmake/cmake/Modules/FindGnuradioCore.cmake
@@ -1,11 +1,11 @@
INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(PC_GNURADIO_CORE QUIET gnuradio-core)
+PKG_CHECK_MODULES(PC_GNURADIO_CORE gnuradio-core)
FIND_PATH(
GNURADIO_CORE_INCLUDE_DIRS
NAMES gr_random.h
HINTS $ENV{GNURADIO_CORE_DIR}/include/gnuradio
- ${PC_GNURADIO_CORE_INCLUDE_DIR}
+ ${PC_GNURADIO_CORE_INCLUDEDIR}
PATHS /usr/local/include/gnuradio
/usr/include/gnuradio
)
diff --git a/gr-howto-write-a-block-cmake/cmake/Modules/FindGruel.cmake b/gr-howto-write-a-block-cmake/cmake/Modules/FindGruel.cmake
index 56b8b1773..58dff7044 100644
--- a/gr-howto-write-a-block-cmake/cmake/Modules/FindGruel.cmake
+++ b/gr-howto-write-a-block-cmake/cmake/Modules/FindGruel.cmake
@@ -1,11 +1,11 @@
INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(PC_GRUEL QUIET gnuradio-core)
+PKG_CHECK_MODULES(PC_GRUEL gruel)
FIND_PATH(
GRUEL_INCLUDE_DIRS
NAMES gruel/attributes.h
HINTS $ENV{GRUEL_DIR}/include
- ${PC_GRUEL_INCLUDE_DIR}
+ ${PC_GRUEL_INCLUDEDIR}
PATHS /usr/local/include
/usr/include
)
diff --git a/gr-howto-write-a-block-cmake/cmake/cmake_uninstall.cmake.in b/gr-howto-write-a-block-cmake/cmake/cmake_uninstall.cmake.in
new file mode 100644
index 000000000..9ae1ae4bd
--- /dev/null
+++ b/gr-howto-write-a-block-cmake/cmake/cmake_uninstall.cmake.in
@@ -0,0 +1,32 @@
+# http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
+
+IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+ MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+STRING(REGEX REPLACE "\n" ";" files "${files}")
+FOREACH(file ${files})
+ MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
+ IF(EXISTS "$ENV{DESTDIR}${file}")
+ EXEC_PROGRAM(
+ "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
+ OUTPUT_VARIABLE rm_out
+ RETURN_VALUE rm_retval
+ )
+ IF(NOT "${rm_retval}" STREQUAL 0)
+ MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+ ENDIF(NOT "${rm_retval}" STREQUAL 0)
+ ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}")
+ EXEC_PROGRAM(
+ "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
+ OUTPUT_VARIABLE rm_out
+ RETURN_VALUE rm_retval
+ )
+ IF(NOT "${rm_retval}" STREQUAL 0)
+ MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+ ENDIF(NOT "${rm_retval}" STREQUAL 0)
+ ELSE(EXISTS "$ENV{DESTDIR}${file}")
+ MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
+ ENDIF(EXISTS "$ENV{DESTDIR}${file}")
+ENDFOREACH(file)
diff --git a/gr-howto-write-a-block-cmake/docs/doxygen/swig_doc.py b/gr-howto-write-a-block-cmake/docs/doxygen/swig_doc.py
index 5034099e3..62c8437e1 100644
--- a/gr-howto-write-a-block-cmake/docs/doxygen/swig_doc.py
+++ b/gr-howto-write-a-block-cmake/docs/doxygen/swig_doc.py
@@ -98,6 +98,8 @@ def make_entry(obj, name=None, templ="{description}", description=None):
"""
if name is None:
name=obj.name()
+ if "operator " in name:
+ return ''
if description is None:
description = combine_descriptions(obj)
docstring = templ.format(description=description)
diff --git a/gr-howto-write-a-block-cmake/swig/CMakeLists.txt b/gr-howto-write-a-block-cmake/swig/CMakeLists.txt
index 8691942fa..ac5f700f1 100644
--- a/gr-howto-write-a-block-cmake/swig/CMakeLists.txt
+++ b/gr-howto-write-a-block-cmake/swig/CMakeLists.txt
@@ -53,5 +53,5 @@ install(
FILES
howto_swig.i
${CMAKE_CURRENT_BINARY_DIR}/howto_swig_doc.i
- DESTINATION $(GR_INCLUDE_DIR)/howto/swig
+ DESTINATION ${GR_INCLUDE_DIR}/howto/swig
)
diff --git a/gr-howto-write-a-block/version.sh b/gr-howto-write-a-block/version.sh
index 58ec712f6..88a3de947 100644
--- a/gr-howto-write-a-block/version.sh
+++ b/gr-howto-write-a-block/version.sh
@@ -1,4 +1,4 @@
MAJOR_VERSION=3
API_COMPAT=5
-MINOR_VERSION=1
-MAINT_VERSION=0
+MINOR_VERSION=2
+MAINT_VERSION=git
diff --git a/gr-noaa/CMakeLists.txt b/gr-noaa/CMakeLists.txt
index 621dd5d6e..a3a5d56db 100644
--- a/gr-noaa/CMakeLists.txt
+++ b/gr-noaa/CMakeLists.txt
@@ -84,4 +84,18 @@ if(ENABLE_PYTHON)
add_subdirectory(apps)
endif(ENABLE_PYTHON)
+########################################################################
+# Create Pkg Config File
+########################################################################
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/gnuradio-noaa.pc.in
+ ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-noaa.pc
+@ONLY)
+
+install(
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-noaa.pc
+ DESTINATION ${GR_LIBRARY_DIR}/pkgconfig
+ COMPONENT "noaa_devel"
+)
+
endif(ENABLE_GR_NOAA)
diff --git a/gr-noaa/Makefile.am b/gr-noaa/Makefile.am
index 854ce1476..ce5f66109 100644
--- a/gr-noaa/Makefile.am
+++ b/gr-noaa/Makefile.am
@@ -27,3 +27,5 @@ if PYTHON
SUBDIRS += swig python apps
endif
+pkgconfigdir = $(libdir)/pkgconfig
+dist_pkgconfig_DATA = gnuradio-noaa.pc
diff --git a/gr-noaa/gnuradio-noaa.pc.in b/gr-noaa/gnuradio-noaa.pc.in
new file mode 100644
index 000000000..cacfeecca
--- /dev/null
+++ b/gr-noaa/gnuradio-noaa.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: gnuradio-noaa
+Description: GNU Radio blocks implementing a NOAA satellite protocols
+Requires: gnuradio-core
+Version: @LIBVER@
+Libs: -L${libdir} -lgnuradio-noaa
+Cflags: -I${includedir}
diff --git a/gr-shd/CMakeLists.txt b/gr-shd/CMakeLists.txt
index de9daf540..a1b3b1a0b 100644
--- a/gr-shd/CMakeLists.txt
+++ b/gr-shd/CMakeLists.txt
@@ -22,7 +22,7 @@
########################################################################
include(GrBoost)
-PKG_CHECK_MODULES(PC_SHD shd QUIET)
+PKG_CHECK_MODULES(PC_SHD shd)
FIND_PATH(
SHD_INCLUDE_DIRS
NAMES shd/config.hpp
diff --git a/gr-uhd/apps/uhd_fft.py b/gr-uhd/apps/uhd_fft.py
index f311a903b..18edc8f86 100755
--- a/gr-uhd/apps/uhd_fft.py
+++ b/gr-uhd/apps/uhd_fft.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2011 Free Software Foundation, Inc.
+# Copyright 2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -20,7 +20,7 @@
# Boston, MA 02110-1301, USA.
#
-from gnuradio import gr
+from gnuradio import gr, gru
from gnuradio import uhd
from gnuradio import eng_notation
from gnuradio.eng_option import eng_option
@@ -75,6 +75,8 @@ class app_top_block(stdgui2.std_top_block):
help="Set wire format from USRP [default=%default]")
parser.add_option("", "--scalar", type="int", default=1024,
help="Set scalar multiplier value sc8 wire format [default=%default]")
+ parser.add_option("", "--show-async-msg", action="store_true", default=False,
+ help="Show asynchronous message notifications from UHD [default=%default]")
(options, args) = parser.parse_args()
if len(args) != 0:
parser.print_help()
@@ -146,6 +148,16 @@ class app_top_block(stdgui2.std_top_block):
if not(self.set_freq(options.freq)):
self._set_status_msg("Failed to set initial frequency")
+ # Direct asynchronous notifications to callback function
+ if self.options.show_async_msg:
+ self.async_msgq = gr.msg_queue(0)
+ self.async_src = uhd.amsg_source("", self.async_msgq)
+ self.async_rcv = gru.msgq_runner(self.async_msgq, self.async_callback)
+
+ def async_callback(self, msg):
+ md = self.async_src.msg_to_async_metadata_t(msg)
+ print "Channel: %i Time: %f Event: %i" % (md.channel, md.time_spec.get_real_secs(), md.event_code)
+
def _set_status_msg(self, msg):
self.frame.GetStatusBar().SetStatusText(msg, 0)
@@ -169,17 +181,24 @@ class app_top_block(stdgui2.std_top_block):
g = self.u.get_gain_range()
# some configurations don't have gain control
- if g.stop() > g.start():
- myform['gain'] = form.slider_field(parent=self.panel,
- sizer=hbox, label="Gain",
- weight=3,
- min=int(g.start()), max=int(g.stop()),
- callback=self.set_gain)
+ if g.stop() <= g.start():
+ glow = 0.0
+ ghigh = 1.0
+
+ else:
+ glow = g.start()
+ ghigh = g.stop()
+
+ myform['gain'] = form.slider_field(parent=self.panel,
+ sizer=hbox, label="Gain",
+ weight=3,
+ min=int(glow), max=int(ghigh),
+ callback=self.set_gain)
- hbox.Add((5,0), 0, 0)
- vbox.Add(hbox, 0, wx.EXPAND)
+ hbox.Add((5,0), 0, 0)
+ vbox.Add(hbox, 0, wx.EXPAND)
- self._build_subpanel(vbox)
+ self._build_subpanel(vbox)
def _build_subpanel(self, vbox_arg):
# build a secondary information panel (sometimes hidden)
diff --git a/gr-uhd/apps/uhd_rx_cfile.py b/gr-uhd/apps/uhd_rx_cfile.py
index de44d4f56..718bb80b7 100755
--- a/gr-uhd/apps/uhd_rx_cfile.py
+++ b/gr-uhd/apps/uhd_rx_cfile.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2011 Free Software Foundation, Inc.
+# Copyright 2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -26,7 +26,7 @@ outputs single precision complex float values or complex short values
(interleaved 16 bit signed short integers).
"""
-from gnuradio import gr, eng_notation
+from gnuradio import gr, gru, eng_notation
from gnuradio import uhd
from gnuradio.eng_option import eng_option
from optparse import OptionParser
@@ -106,6 +106,17 @@ class rx_cfile_block(gr.top_block):
else:
print "Writing 32-bit complex floats"
print "Output filename:", filename
+
+ # Direct asynchronous notifications to callback function
+ if options.show_async_msg:
+ self.async_msgq = gr.msg_queue(0)
+ self.async_src = uhd.amsg_source("", self.async_msgq)
+ self.async_rcv = gru.msgq_runner(self.async_msgq, self.async_callback)
+
+ def async_callback(self, msg):
+ md = self.async_src.msg_to_async_metadata_t(msg)
+ print "Channel: %i Time: %f Event: %i" % (md.channel, md.time_spec.get_real_secs(), md.event_code)
+
def get_options():
usage="%prog: [options] output_filename"
@@ -134,6 +145,8 @@ def get_options():
help="set wire format from USRP [default=%default")
parser.add_option("", "--scalar", type="int", default=1024,
help="set scalar multiplier value for sc8 wire format [default=%default]")
+ parser.add_option("", "--show-async-msg", action="store_true", default=False,
+ help="Show asynchronous message notifications from UHD [default=%default]")
(options, args) = parser.parse_args ()
if len(args) != 1:
diff --git a/gr-uhd/apps/uhd_rx_nogui.py b/gr-uhd/apps/uhd_rx_nogui.py
index e692e6ea3..bcb52c619 100755
--- a/gr-uhd/apps/uhd_rx_nogui.py
+++ b/gr-uhd/apps/uhd_rx_nogui.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2006,2007,2011 Free Software Foundation, Inc.
+# Copyright 2006,2007,2011,2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -190,6 +190,17 @@ class app_top_block(gr.top_block):
AUDIO = audio.sink(int(options.output_rate),
options.audio_output)
self.connect(tail, AUDIO)
+
+ # Direct asynchronous notifications to callback function
+ if self.options.show_async_msg:
+ self.async_msgq = gr.msg_queue(0)
+ self.async_src = uhd.amsg_source("", self.async_msgq)
+ self.async_rcv = gru.msgq_runner(self.async_msgq, self.async_callback)
+
+ def async_callback(self, msg):
+ md = self.async_src.msg_to_async_metadata_t(msg)
+ print "Channel: %i Time: %f Event: %i" % (md.channel, md.time_spec.get_real_secs(), md.event_code)
+
def main():
parser = OptionParser(option_class=eng_option)
@@ -222,6 +233,8 @@ def main():
help="set CTCSS squelch to FREQ [default=%default]")
parser.add_option("-O", "--audio-output", type="string", default="",
help="pcm device name. E.g., hw:0,0 or surround51 or /dev/dsp")
+ parser.add_option("", "--show-async-msg", action="store_true", default=False,
+ help="Show asynchronous message notifications from UHD [default=%default]")
(options, args) = parser.parse_args()
if options.frequency is None:
diff --git a/gr-uhd/apps/uhd_siggen.py b/gr-uhd/apps/uhd_siggen.py
index 27e9e8e01..e1af586ae 100755
--- a/gr-uhd/apps/uhd_siggen.py
+++ b/gr-uhd/apps/uhd_siggen.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2008,2009,2011 Free Software Foundation, Inc.
+# Copyright 2008,2009,2011,2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -38,7 +38,7 @@ TYPE_KEY = 'type'
def setter(ps, key, val): ps[key] = val
-from gnuradio import gr, uhd, eng_notation
+from gnuradio import gr, gru, uhd, eng_notation
from gnuradio.gr.pubsub import pubsub
from gnuradio.eng_option import eng_option
from optparse import OptionParser
@@ -114,6 +114,16 @@ class top_block(gr.top_block, pubsub):
if self._verbose:
print str(self._u)
+ # Direct asynchronous notifications to callback function
+ if options.show_async_msg:
+ self.async_msgq = gr.msg_queue(0)
+ self.async_src = uhd.amsg_source("", self.async_msgq)
+ self.async_rcv = gru.msgq_runner(self.async_msgq, self.async_callback)
+
+ def async_callback(self, msg):
+ md = self.async_src.msg_to_async_metadata_t(msg)
+ print "Channel: %i Time: %f Event: %i" % (md.channel, md.time_spec.get_real_secs(), md.event_code)
+
def _set_tx_amplitude(self, ampl):
"""
Sets the transmit amplitude sent to the USRP
@@ -325,6 +335,8 @@ def get_options():
metavar="AMPL")
parser.add_option("-v", "--verbose", action="store_true", default=False,
help="Use verbose console output [default=%default]")
+ parser.add_option("", "--show-async-msg", action="store_true", default=False,
+ help="Show asynchronous message notifications from UHD [default=%default]")
(options, args) = parser.parse_args()
diff --git a/gr-uhd/grc/gen_uhd_usrp_blocks.py b/gr-uhd/grc/gen_uhd_usrp_blocks.py
index 67343541c..25b0a4c46 100644
--- a/gr-uhd/grc/gen_uhd_usrp_blocks.py
+++ b/gr-uhd/grc/gen_uhd_usrp_blocks.py
@@ -411,10 +411,10 @@ max_num_channels = max_num_mboards*4
if __name__ == '__main__':
import sys
for file in sys.argv[1:]:
- if 'source' in file:
+ if file.endswith ('source.xml'):
sourk = 'source'
direction = 'out'
- elif 'sink' in file:
+ elif file.endswith ('sink.xml'):
sourk = 'sink'
direction = 'in'
else: raise Exception, 'is %s a source or sink?'%file
diff --git a/gr-uhd/include/gr_uhd_amsg_source.h b/gr-uhd/include/gr_uhd_amsg_source.h
index accf15ce2..3c1b59fa7 100644
--- a/gr-uhd/include/gr_uhd_amsg_source.h
+++ b/gr-uhd/include/gr_uhd_amsg_source.h
@@ -38,6 +38,13 @@ GR_UHD_API boost::shared_ptr<uhd_amsg_source> uhd_make_amsg_source(
);
class GR_UHD_API uhd_amsg_source{
+public:
+ /*!
+ * Convert a raw asynchronous message to an asynchronous metatdata object.
+ * \return The asynchronous metadata object.
+ */
+ static uhd::async_metadata_t msg_to_async_metadata_t(const gr_message_sptr msg);
+
};
#endif /* INCLUDED_GR_UHD_AMSG_SOURCE_H */
diff --git a/gr-uhd/lib/gr_uhd_amsg_source.cc b/gr-uhd/lib/gr_uhd_amsg_source.cc
index f2958f115..08941584b 100644
--- a/gr-uhd/lib/gr_uhd_amsg_source.cc
+++ b/gr-uhd/lib/gr_uhd_amsg_source.cc
@@ -75,6 +75,11 @@ protected:
bool _running;
};
+uhd::async_metadata_t uhd_amsg_source::msg_to_async_metadata_t(const gr_message_sptr msg)
+{
+ return *(uhd::async_metadata_t *)msg->msg();
+}
+
/***********************************************************************
* Make UHD Asynchronous Message Source
**********************************************************************/
diff --git a/gr-vocoder/CMakeLists.txt b/gr-vocoder/CMakeLists.txt
index f32ecdd9c..e800cff00 100644
--- a/gr-vocoder/CMakeLists.txt
+++ b/gr-vocoder/CMakeLists.txt
@@ -90,6 +90,7 @@ add_subdirectory(doc)
if(ENABLE_PYTHON)
add_subdirectory(swig)
add_subdirectory(python)
+ add_subdirectory(grc)
add_subdirectory(examples)
endif(ENABLE_PYTHON)
diff --git a/gr-vocoder/grc/CMakeLists.txt b/gr-vocoder/grc/CMakeLists.txt
new file mode 100644
index 000000000..f8cf8231b
--- /dev/null
+++ b/gr-vocoder/grc/CMakeLists.txt
@@ -0,0 +1,42 @@
+# Copyright 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.
+
+install(FILES
+ vocoder_alaw_decode_bs.xml
+ vocoder_alaw_encode_sb.xml
+ vocoder_block_tree.xml
+ vocoder_codec2_decode_ps.xml
+ vocoder_codec2_encode_sp.xml
+ vocoder_cvsd_decode_bs.xml
+ vocoder_cvsd_decode.xml
+ vocoder_cvsd_encode_sb.xml
+ vocoder_cvsd_encode.xml
+ vocoder_g721_decode_bs.xml
+ vocoder_g721_encode_sb.xml
+ vocoder_g723_24_decode_bs.xml
+ vocoder_g723_24_encode_sb.xml
+ vocoder_g723_40_decode_bs.xml
+ vocoder_g723_40_encode_sb.xml
+ vocoder_gsm_fr_decode_ps.xml
+ vocoder_gsm_fr_encode_sp.xml
+ vocoder_ulaw_decode_bs.xml
+ vocoder_ulaw_encode_sb.xml
+ DESTINATION ${GRC_BLOCKS_DIR}
+ COMPONENT "vocoder_python"
+)
diff --git a/gr-vocoder/grc/vocoder_alaw_decode_bs.xml b/gr-vocoder/grc/vocoder_alaw_decode_bs.xml
new file mode 100644
index 000000000..776187d4d
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_alaw_decode_bs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Alaw audio decoder
+###################################################
+ -->
+<block>
+ <name>Alaw Audio Decoder</name>
+ <key>vocoder_alaw_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.alaw_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_alaw_encode_sb.xml b/gr-vocoder/grc/vocoder_alaw_encode_sb.xml
new file mode 100644
index 000000000..0ad8eca12
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_alaw_encode_sb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Alaw audio encoder
+###################################################
+ -->
+<block>
+ <name>g711 alaw Audio Encoder</name>
+ <key>vocoder_alaw_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.alaw_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/gr-vocoder/grc/vocoder_block_tree.xml b/gr-vocoder/grc/vocoder_block_tree.xml
new file mode 100644
index 000000000..0c0fdd4a0
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_block_tree.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+
+<!--
+ Copyright 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.
+-->
+
+<!--
+###################################################
+##Block Tree for GR Digital blocks.
+###################################################
+ -->
+<cat>
+ <name></name> <!-- Blank for Root Name -->
+ <cat>
+ <name>Vocoders</name>
+ <block>vocoder_binary_slicer_fb</block>
+ <block>vocoder_alaw_decode_bs</block>
+ <block>vocoder_alaw_encode_sb</block>
+ <block>vocoder_codec2_decode_ps</block>
+ <block>vocoder_codec2_encode_sp</block>
+ <block>vocoder_cvsd_decode_bs</block>
+ <block>vocoder_cvsd_encode_sb</block>
+ <block>vocoder_cvsd_decode_bf</block>
+ <block>vocoder_cvsd_encode_fb</block>
+ <block>vocoder_g721_decode_bs</block>
+ <block>vocoder_g721_encode_sb</block>
+ <block>vocoder_g723_24_decode_bs</block>
+ <block>vocoder_g723_24_encode_sb</block>
+ <block>vocoder_g723_40_decode_bs</block>
+ <block>vocoder_g723_40_encode_sb</block>
+ <block>vocoder_gsm_fr_decode_ps</block>
+ <block>vocoder_gsm_fr_encode_sp</block>
+ <block>vocoder_ulaw_decode_bs</block>
+ <block>vocoder_ulaw_encode_sb</block>
+ </cat>
+</cat>
diff --git a/gr-vocoder/grc/vocoder_codec2_decode_ps.xml b/gr-vocoder/grc/vocoder_codec2_decode_ps.xml
new file mode 100644
index 000000000..708882151
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_codec2_decode_ps.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## CODEC2 audio decoder
+###################################################
+ -->
+<block>
+ <name>CODEC2 Audio Decoder</name>
+ <key>vocoder_codec2_decode_ps</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.codec2_decode_ps()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_codec2_encode_sp.xml b/gr-vocoder/grc/vocoder_codec2_encode_sp.xml
new file mode 100644
index 000000000..7a56ac633
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_codec2_encode_sp.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## CODEC2 audio encoder
+###################################################
+ -->
+<block>
+ <name>CODEC2 Audio Encoder</name>
+ <key>vocoder_codec2_encode_sp</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.codec2_encode_sp()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/grc/blocks/blks2_cvsd_decode.xml b/gr-vocoder/grc/vocoder_cvsd_decode.xml
index 6be7daa22..ce117c5d4 100644
--- a/grc/blocks/blks2_cvsd_decode.xml
+++ b/gr-vocoder/grc/vocoder_cvsd_decode.xml
@@ -6,9 +6,9 @@
-->
<block>
<name>CVSD Decoder</name>
- <key>blks2_cvsd_decode</key>
- <import>from gnuradio import blks2</import>
- <make>blks2.cvsd_decode($resample,$bw)</make>
+ <key>vocoder_cvsd_decode_bf</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.cvsd_decode_bf($resample,$bw)</make>
<param>
<name>Resample</name>
<key>resample</key>
diff --git a/gr-vocoder/grc/vocoder_cvsd_decode_bs.xml b/gr-vocoder/grc/vocoder_cvsd_decode_bs.xml
new file mode 100644
index 000000000..40ddc04d4
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_cvsd_decode_bs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## CVSD audio decoder
+###################################################
+ -->
+<block>
+ <name>CVSD Audio Decoder (Raw Bit-Level)</name>
+ <key>vocoder_cvsd_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.cvsd_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
+
diff --git a/grc/blocks/blks2_cvsd_encode.xml b/gr-vocoder/grc/vocoder_cvsd_encode.xml
index 3123b1aa9..12e73f602 100644
--- a/grc/blocks/blks2_cvsd_encode.xml
+++ b/gr-vocoder/grc/vocoder_cvsd_encode.xml
@@ -6,9 +6,9 @@
-->
<block>
<name>CVSD Encoder</name>
- <key>blks2_cvsd_encode</key>
- <import>from gnuradio import blks2</import>
- <make>blks2.cvsd_encode($resample,$bw)</make>
+ <key>vocoder_cvsd_encode_fb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.cvsd_encode_fb($resample,$bw)</make>
<param>
<name>Resample</name>
<key>resample</key>
diff --git a/gr-vocoder/grc/vocoder_cvsd_encode_sb.xml b/gr-vocoder/grc/vocoder_cvsd_encode_sb.xml
new file mode 100644
index 000000000..a92387a60
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_cvsd_encode_sb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## CVSD audio encoder
+###################################################
+ -->
+<block>
+ <name>CVSD Audio Encoder (Raw Bit-Level)</name>
+ <key>vocoder_cvsd_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.cvsd_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/gr-vocoder/grc/vocoder_g721_decode_bs.xml b/gr-vocoder/grc/vocoder_g721_decode_bs.xml
new file mode 100644
index 000000000..e8a64f404
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_g721_decode_bs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## g271 audio decoder
+###################################################
+ -->
+<block>
+ <name>g271 Audio Decoder</name>
+ <key>vocoder_g271_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.g271_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_g721_encode_sb.xml b/gr-vocoder/grc/vocoder_g721_encode_sb.xml
new file mode 100644
index 000000000..f105ff8ff
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_g721_encode_sb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## g721 audio encoder
+###################################################
+ -->
+<block>
+ <name>g721 Audio Encoder</name>
+ <key>vocoder_g721_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.g721_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/gr-vocoder/grc/vocoder_g723_24_decode_bs.xml b/gr-vocoder/grc/vocoder_g723_24_decode_bs.xml
new file mode 100644
index 000000000..768f82d8b
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_g723_24_decode_bs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## g273_24 audio decoder
+###################################################
+ -->
+<block>
+ <name>g273_24 Audio Decoder</name>
+ <key>vocoder_g273_24_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.g273_24_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_g723_24_encode_sb.xml b/gr-vocoder/grc/vocoder_g723_24_encode_sb.xml
new file mode 100644
index 000000000..0e70ddedc
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_g723_24_encode_sb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## g723_24 audio encoder
+###################################################
+ -->
+<block>
+ <name>g723_24 Audio Encoder</name>
+ <key>vocoder_g723_24_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.g723_24_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/gr-vocoder/grc/vocoder_g723_40_decode_bs.xml b/gr-vocoder/grc/vocoder_g723_40_decode_bs.xml
new file mode 100644
index 000000000..09e31be4c
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_g723_40_decode_bs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## g273_40 audio decoder
+###################################################
+ -->
+<block>
+ <name>g273_40 Audio Decoder</name>
+ <key>vocoder_g273_40_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.g273_40_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_g723_40_encode_sb.xml b/gr-vocoder/grc/vocoder_g723_40_encode_sb.xml
new file mode 100644
index 000000000..fbbf600ff
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_g723_40_encode_sb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## g723_40 audio encoder
+###################################################
+ -->
+<block>
+ <name>g723_40 Audio Encoder</name>
+ <key>vocoder_g723_40_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.g723_40_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml b/gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml
new file mode 100644
index 000000000..f90890032
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_gsm_fr_decode_ps.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## GSM full-rate audio decoder
+###################################################
+ -->
+<block>
+ <name>GSM full-rate Audio Decoder</name>
+ <key>vocoder_gsm_fr_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.gsm_fr_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml b/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml
new file mode 100644
index 000000000..d39994b6b
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_gsm_fr_encode_sp.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## GSM full-rate audio encoder
+###################################################
+ -->
+<block>
+ <name>GSM full-rate Audio Encoder</name>
+ <key>vocoder_gsm_fr_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.gsm_fr_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/gr-vocoder/grc/vocoder_ulaw_decode_bs.xml b/gr-vocoder/grc/vocoder_ulaw_decode_bs.xml
new file mode 100644
index 000000000..5a7ccbb0e
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_ulaw_decode_bs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Ulaw audio decoder
+###################################################
+ -->
+<block>
+ <name>Ulaw Audio Decoder</name>
+ <key>vocoder_ulaw_decode_bs</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.ulaw_decode_bs()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>short</type>
+ </source>
+</block>
diff --git a/gr-vocoder/grc/vocoder_ulaw_encode_sb.xml b/gr-vocoder/grc/vocoder_ulaw_encode_sb.xml
new file mode 100644
index 000000000..8e76d8d08
--- /dev/null
+++ b/gr-vocoder/grc/vocoder_ulaw_encode_sb.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## ulaw audio encoder
+###################################################
+ -->
+<block>
+ <name>ulaw Audio Encoder</name>
+ <key>vocoder_ulaw_encode_sb</key>
+ <import>from gnuradio import vocoder</import>
+ <make>vocoder.ulaw_encode_sb()</make>
+ <sink>
+ <name>in</name>
+ <type>short</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
+
+
diff --git a/grc/blocks/Makefile.am b/grc/blocks/Makefile.am
index 020dcecdd..738e79f24 100644
--- a/grc/blocks/Makefile.am
+++ b/grc/blocks/Makefile.am
@@ -162,6 +162,7 @@ dist_ourdata_DATA = \
gr_stream_to_vector.xml \
gr_streams_to_stream.xml \
gr_streams_to_vector.xml \
+ gr_burst_tagger.xml \
gr_sub_xx.xml \
gr_threshold_ff.xml \
gr_throttle.xml \
diff --git a/grc/blocks/block_tree.xml b/grc/blocks/block_tree.xml
index 183408cec..6c4cc0e88 100644
--- a/grc/blocks/block_tree.xml
+++ b/grc/blocks/block_tree.xml
@@ -104,6 +104,7 @@
<block>blks2_stream_to_vector_decimator</block>
<block>gr_stream_mux</block>
+ <block>gr_burst_tagger</block>
</cat>
<cat>
<name>Misc Conversions</name>
@@ -224,11 +225,6 @@
<block>gr_additive_scrambler_bb</block>
</cat>
<cat>
- <name>Vocoders</name>
- <block>blks2_cvsd_encode</block>
- <block>blks2_cvsd_decode</block>
- </cat>
- <cat>
<name>Probes</name>
<block>gr_probe_avg_mag_sqrd_x</block>
<block>gr_probe_density_b</block>
diff --git a/grc/blocks/gr_burst_tagger.xml b/grc/blocks/gr_burst_tagger.xml
new file mode 100644
index 000000000..58c909999
--- /dev/null
+++ b/grc/blocks/gr_burst_tagger.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Burst tagger:
+## all types, 1 output, 2 input: stream & trigger (short)
+###################################################
+ -->
+<block>
+ <name>Burst Tagger</name>
+ <key>gr_burst_tagger</key>
+ <import>from gnuradio import gr</import>
+ <make>gr.burst_tagger($type.size)
+self.$(id).set_true_tag($true_key,$true_value)
+self.$(id).set_false_tag($false_key,$false_value)
+ </make>
+ <callback>set_true_tag($true_key,$true_value)</callback>
+ <callback>set_false_tag($false_key,$false_value)</callback>
+ <param>
+ <name>Stream Type</name>
+ <key>type</key>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>size:gr.sizeof_gr_complex</opt>
+ </option>
+ <option>
+ <name>Float</name>
+ <key>float</key>
+ <opt>size:gr.sizeof_float</opt>
+ </option>
+ <option>
+ <name>Int</name>
+ <key>int</key>
+ <opt>size:gr.sizeof_int</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>size:gr.sizeof_short</opt>
+ </option>
+ <option>
+ <name>Byte</name>
+ <key>byte</key>
+ <opt>size:gr.sizeof_char</opt>
+ </option>
+ </param>
+ <param>
+ <name>True KeyID</name>
+ <key>true_key</key>
+ <value>burst</value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>True Value</name>
+ <key>true_value</key>
+ <value>True</value>
+ <type>bool</type>
+ </param>
+ <param>
+ <name>False KeyID</name>
+ <key>false_key</key>
+ <value>burst</value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>False Value</name>
+ <key>false_value</key>
+ <value>False</value>
+ <type>bool</type>
+ </param>
+ <sink>
+ <name>in</name>
+ <type>$type</type>
+ <vlen>1</vlen>
+ </sink>
+ <sink>
+ <name>trigger</name>
+ <type>short</type>
+ <vlen>1</vlen>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>$type</type>
+ <vlen>1</vlen>
+ </source>
+</block>
diff --git a/grc/blocks/gr_fft_filter_xxx.xml b/grc/blocks/gr_fft_filter_xxx.xml
index c1633094b..5b4cd83cc 100644
--- a/grc/blocks/gr_fft_filter_xxx.xml
+++ b/grc/blocks/gr_fft_filter_xxx.xml
@@ -9,8 +9,9 @@
<key>gr_fft_filter_xxx</key>
<import>from gnuradio import gr</import>
<import>from gnuradio.gr import firdes</import>
- <make>gr.fft_filter_$(type)($decim, $taps)</make>
+ <make>gr.fft_filter_$(type)($decim, $taps, $nthreads)</make>
<callback>set_taps($taps)</callback>
+ <callback>set_nthreads($nthreads)</callback>
<param>
<name>Type</name>
<key>type</key>
@@ -41,6 +42,12 @@
<key>taps</key>
<type>$type.taps</type>
</param>
+ <param>
+ <name>Num. Threads</name>
+ <key>nthreads</key>
+ <value>1</value>
+ <type>int</type>
+ </param>
<sink>
<name>in</name>
<type>$type.input</type>
diff --git a/grc/blocks/gr_fft_vxx.xml b/grc/blocks/gr_fft_vxx.xml
index d398486ef..565354e41 100644
--- a/grc/blocks/gr_fft_vxx.xml
+++ b/grc/blocks/gr_fft_vxx.xml
@@ -10,10 +10,11 @@
<import>from gnuradio import gr</import>
<import>from gnuradio import window</import>
<make>#if $type() == "complex"
-gr.fft_vcc($fft_size, $forward, $window, $shift)
+gr.fft_vcc($fft_size, $forward, $window, $shift, $nthreads)
#else
-gr.fft_vfc($fft_size, $forward, $window)
+gr.fft_vfc($fft_size, $forward, $window, $nthreads)
#end if</make>
+ <callback>set_nthreads($nthreads)</callback>
<param>
<name>Input Type</name>
<key>type</key>
@@ -68,6 +69,12 @@ gr.fft_vfc($fft_size, $forward, $window)
<key>False</key>
</option>
</param>
+ <param>
+ <name>Num. Threads</name>
+ <key>nthreads</key>
+ <value>1</value>
+ <type>int</type>
+ </param>
<sink>
<name>in</name>
<type>$type</type>
diff --git a/grc/freedesktop/CMakeLists.txt b/grc/freedesktop/CMakeLists.txt
index 8c0f53d9f..492b0f7d8 100644
--- a/grc/freedesktop/CMakeLists.txt
+++ b/grc/freedesktop/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2011 Free Software Foundation, Inc.
+# Copyright 2011-2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -41,7 +41,7 @@ if(UNIX AND HAVE_XDG_UTILS)
${CMAKE_CURRENT_BINARY_DIR}/grc_setup_freedesktop
@ONLY)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/grc_setup_freedesktop
+ PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/grc_setup_freedesktop
DESTINATION ${GR_PKG_LIBEXEC_DIR} COMPONENT "grc"
)
endif(UNIX AND HAVE_XDG_UTILS)
diff --git a/grc/scripts/gnuradio-companion b/grc/scripts/gnuradio-companion
index a4115c39f..e76322b4d 100755
--- a/grc/scripts/gnuradio-companion
+++ b/grc/scripts/gnuradio-companion
@@ -1,6 +1,6 @@
#!/usr/bin/env python
"""
-Copyright 2009 Free Software Foundation, Inc.
+Copyright 2009-2012 Free Software Foundation, Inc.
This file is part of GNU Radio
GNU Radio Companion is free software; you can redistribute it and/or
@@ -25,7 +25,16 @@ import gtk
try: from gnuradio import gr
except ImportError, e:
d = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format="""
-Cannot import gnuradio. Are your PYTHONPATH and LD_LIBRARY_PATH set correctly?""")
+Cannot import gnuradio.
+
+Is the python path environment variable set correctly?
+ All OS: PYTHONPATH
+
+Is the library path environment variable set correctly?
+ Linux: LD_LIBRARY_PATH
+ Windows: PATH
+ MacOSX: DYLD_LIBRARY_PATH
+""")
d.set_title(str(e))
d.run()
exit(-1)
diff --git a/gruel/src/include/gruel/high_res_timer.h b/gruel/src/include/gruel/high_res_timer.h
index 9be524624..63841f612 100644
--- a/gruel/src/include/gruel/high_res_timer.h
+++ b/gruel/src/include/gruel/high_res_timer.h
@@ -46,7 +46,7 @@ namespace gruel {
#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
#define GRUEL_HRT_USE_MACH_ABSOLUTE_TIME
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
- #define GRUEL_HRT_USE_MACH_ABSOLUTE_TIME
+ #define GRUEL_HRT_USE_CLOCK_GETTIME
#else
#define GRUEL_HRT_USE_MICROSEC_CLOCK
#endif
diff --git a/version.sh b/version.sh
index 58ec712f6..88a3de947 100644
--- a/version.sh
+++ b/version.sh
@@ -1,4 +1,4 @@
MAJOR_VERSION=3
API_COMPAT=5
-MINOR_VERSION=1
-MAINT_VERSION=0
+MINOR_VERSION=2
+MAINT_VERSION=git
diff --git a/volk/orc/volk_8i_convert_16i_a_orc_impl.orc b/volk/orc/volk_8i_convert_16i_a_orc_impl.orc
index d813c6cfa..17198bf1e 100644
--- a/volk/orc/volk_8i_convert_16i_a_orc_impl.orc
+++ b/volk/orc/volk_8i_convert_16i_a_orc_impl.orc
@@ -1,5 +1,6 @@
.function volk_8i_convert_16i_a_orc_impl
.source 1 src
.dest 2 dst
-convsbw dst, src
-shlw dst, dst, 8
+.temp 2 tmp
+convsbw tmp, src
+shlw dst, tmp, 8