summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.common4
-rw-r--r--configure.ac7
-rw-r--r--gcell/lib/runtime/Makefile.am4
-rw-r--r--gnuradio-core/src/lib/filter/.gitignore12
-rw-r--r--gnuradio-core/src/lib/filter/Makefile.am27
-rw-r--r--gnuradio-core/src/lib/filter/Makefile.gen17
-rw-r--r--gnuradio-core/src/lib/filter/filter.i2
-rwxr-xr-xgnuradio-core/src/lib/filter/generate_all.py2
-rwxr-xr-xgnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py64
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc1
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc169
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h98
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i (renamed from gr-uhd/lib/utils.h)26
-rw-r--r--gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t121
-rw-r--r--gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t131
-rw-r--r--gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h131
-rw-r--r--gnuradio-core/src/lib/filter/qa_filter.cc12
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc160
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h46
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc167
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h46
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc168
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h46
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc156
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h46
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc147
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h46
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc167
-rw-r--r--gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h46
-rw-r--r--gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc5
-rw-r--r--gnuradio-core/src/lib/runtime/Makefile.am4
-rw-r--r--gnuradio-core/src/lib/swig/Makefile.am4
-rw-r--r--gnuradio-examples/c++/dial_tone/Makefile.am9
-rwxr-xr-xgnuradio-examples/python/pfb/synth_filter.py71
-rwxr-xr-xgnuradio-examples/python/pfb/synth_to_chan.py105
-rw-r--r--gr-gcell/src/Makefile.am4
-rw-r--r--gr-noaa/swig/Makefile.am6
-rw-r--r--gr-pager/swig/Makefile.am6
-rw-r--r--gr-qtgui/src/lib/Makefile.am4
-rw-r--r--gr-uhd/grc/.gitignore2
-rw-r--r--gr-uhd/grc/Makefile.am22
-rwxr-xr-xgr-uhd/grc/gen_uhd_mimo_blocks_xml.py190
-rwxr-xr-xgr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py293
-rwxr-xr-xgr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py75
-rw-r--r--gr-uhd/grc/uhd_block_tree.xml23
-rw-r--r--gr-uhd/grc/uhd_mimo_sink.xml549
-rw-r--r--gr-uhd/grc/uhd_mimo_source.xml549
-rw-r--r--gr-uhd/grc/uhd_simple_sink.xml1
-rw-r--r--gr-uhd/grc/uhd_simple_source.xml1
-rw-r--r--gr-uhd/lib/Makefile.am21
-rw-r--r--gr-uhd/lib/uhd_mimo_sink.cc6
-rw-r--r--gr-uhd/lib/uhd_mimo_sink.h5
-rw-r--r--gr-uhd/lib/uhd_mimo_source.cc6
-rw-r--r--gr-uhd/lib/uhd_mimo_source.h5
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_sink.cc188
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_sink.h175
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_source.cc187
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_source.h175
-rw-r--r--gr-uhd/lib/uhd_simple_sink.cc6
-rw-r--r--gr-uhd/lib/uhd_simple_sink.h5
-rw-r--r--gr-uhd/lib/uhd_simple_source.cc6
-rw-r--r--gr-uhd/lib/uhd_simple_source.h5
-rw-r--r--gr-uhd/lib/uhd_single_usrp_sink.cc43
-rw-r--r--gr-uhd/lib/uhd_single_usrp_sink.h35
-rw-r--r--gr-uhd/lib/uhd_single_usrp_source.cc38
-rw-r--r--gr-uhd/lib/uhd_single_usrp_source.h35
-rw-r--r--gr-uhd/lib/utils.cc56
-rw-r--r--gr-uhd/swig/__init__.py12
-rw-r--r--gr-uhd/swig/uhd_swig.i72
-rw-r--r--gr-usrp/apps/Makefile.am15
-rw-r--r--gr-usrp/src/Makefile.am4
-rw-r--r--gr-usrp2/src/Makefile.am6
-rw-r--r--gr-wxgui/src/python/constants.py1
-rw-r--r--gr-wxgui/src/python/scope_window.py4
-rw-r--r--gr-wxgui/src/python/scopesink_gl.py2
-rw-r--r--grc/base/Param.py2
-rw-r--r--grc/blocks/wxgui_scopesink2.xml7
-rw-r--r--gruel/src/lib/Makefile.am4
-rw-r--r--gruel/src/lib/msg/Makefile.am5
-rw-r--r--gruel/src/lib/pmt/Makefile.am6
-rw-r--r--usrp/host/lib/Makefile.am2
-rw-r--r--usrp/host/swig/Makefile.am4
-rw-r--r--usrp2/host/apps/Makefile.am6
-rw-r--r--usrp2/host/lib/Makefile.am6
84 files changed, 4726 insertions, 421 deletions
diff --git a/Makefile.common b/Makefile.common
index fb83b9470..95dacf987 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -57,8 +57,8 @@ libspudir = $(libdir)spu
# This used to be set in configure.ac but is now defined here for all
# Makefiles when this fragment is included.
-STD_DEFINES_AND_INCLUDES = $(DEFINES) $(BOOST_CPPFLAGS) \
- $(GNURADIO_INCLUDES) $(GRUEL_INCLUDES)
+STD_DEFINES_AND_INCLUDES = $(DEFINES) $(GNURADIO_INCLUDES) \
+ $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS)
# when including for compilation from pre-installed libraries and such,
# need to make sure those are put last on the compile command
diff --git a/configure.ac b/configure.ac
index 3c23c55e6..91bbe755a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,6 +19,13 @@ dnl Boston, MA 02110-1301, USA.
AC_INIT
AC_PREREQ(2.57)
+
+dnl Set the prefix to the default when --prefix is not specified.
+dnl This is critical for variable substitutions in the configure.
+if test "${prefix}" = "NONE"; then
+ prefix=${ac_default_prefix}
+fi
+
AM_CONFIG_HEADER(config.h)
AC_CONFIG_SRCDIR([gnuradio-core/src/lib/runtime/gr_vmcircbuf.cc])
diff --git a/gcell/lib/runtime/Makefile.am b/gcell/lib/runtime/Makefile.am
index 4d13790cd..3ce637636 100644
--- a/gcell/lib/runtime/Makefile.am
+++ b/gcell/lib/runtime/Makefile.am
@@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common
IBM_PPU_SYNC_INCLUDES = -I$(top_srcdir)/gcell/ibm/sync/ppu_source
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) \
- $(GCELL_INCLUDES) $(IBM_PPU_SYNC_INCLUDES) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(DEFINES) $(GCELL_INCLUDES) $(IBM_PPU_SYNC_INCLUDES) \
+ $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
dist_bin_SCRIPTS = gcell-embedspu-libtool
diff --git a/gnuradio-core/src/lib/filter/.gitignore b/gnuradio-core/src/lib/filter/.gitignore
index 2d009f154..faaf02cb8 100644
--- a/gnuradio-core/src/lib/filter/.gitignore
+++ b/gnuradio-core/src/lib/filter/.gitignore
@@ -211,4 +211,16 @@
/gr_rational_resampler_base_scc.cc
/gr_rational_resampler_base_scc.h
/gr_rational_resampler_base_scc.i
+/gri_fir_filter_with_buffer_ccc.cc
+/gri_fir_filter_with_buffer_ccc.h
+/gri_fir_filter_with_buffer_ccf.cc
+/gri_fir_filter_with_buffer_ccf.h
+/gri_fir_filter_with_buffer_fcc.cc
+/gri_fir_filter_with_buffer_fcc.h
+/gri_fir_filter_with_buffer_fff.cc
+/gri_fir_filter_with_buffer_fff.h
+/gri_fir_filter_with_buffer_fsf.cc
+/gri_fir_filter_with_buffer_fsf.h
+/gri_fir_filter_with_buffer_scc.cc
+/gri_fir_filter_with_buffer_scc.h
/stamp-*
diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index 23c1dadc3..6d2ec1c7e 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2001,2002,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2001,2002,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -44,6 +44,7 @@ code_generator = \
generate_gr_fir_sysconfig_generic.py \
generate_gr_fir_util.py \
generate_gr_freq_xlating_fir_filter_XXX.py \
+ generate_gri_fir_filter_with_buffer_XXX.py \
generate_utils.py \
gr_fir_XXX.cc.t \
gr_fir_XXX.h.t \
@@ -60,7 +61,10 @@ code_generator = \
gr_rational_resampler_base_XXX.i.t \
gr_freq_xlating_fir_filter_XXX.cc.t \
gr_freq_xlating_fir_filter_XXX.h.t \
- gr_freq_xlating_fir_filter_XXX.i.t
+ gr_freq_xlating_fir_filter_XXX.i.t \
+ gri_fir_filter_with_buffer_XXX.cc.t \
+ gri_fir_filter_with_buffer_XXX.h.t
+
# Source built by Python into $(builddir)
BUILT_SOURCES = \
@@ -205,6 +209,7 @@ libfilter_la_common_SOURCES = \
float_dotprod_generic.c \
short_dotprod_generic.c \
gr_pfb_channelizer_ccf.cc \
+ gr_pfb_synthesis_filterbank_ccf.cc\
gr_pfb_decimator_ccf.cc \
gr_pfb_interpolator_ccf.cc \
gr_pfb_arb_resampler_ccf.cc \
@@ -220,7 +225,13 @@ libfilter_qa_la_common_SOURCES = \
qa_gr_fir_scc.cc \
qa_gr_rotator.cc \
qa_gri_mmse_fir_interpolator.cc \
- qa_gri_mmse_fir_interpolator_cc.cc
+ qa_gri_mmse_fir_interpolator_cc.cc \
+ qa_gri_fir_filter_with_buffer_ccf.cc \
+ qa_gri_fir_filter_with_buffer_ccc.cc \
+ qa_gri_fir_filter_with_buffer_fcc.cc \
+ qa_gri_fir_filter_with_buffer_fff.cc \
+ qa_gri_fir_filter_with_buffer_fsf.cc \
+ qa_gri_fir_filter_with_buffer_scc.cc
if MD_CPU_generic
libfilter_la_SOURCES = $(libfilter_la_common_SOURCES) $(generic_CODE)
@@ -288,6 +299,7 @@ grinclude_HEADERS = \
short_dotprod_x86.h \
sse_debug.h \
gr_pfb_channelizer_ccf.h \
+ gr_pfb_synthesis_filterbank_ccf.h\
gr_pfb_decimator_ccf.h \
gr_pfb_interpolator_ccf.h \
gr_pfb_arb_resampler_ccf.h \
@@ -324,7 +336,13 @@ noinst_HEADERS = \
qa_gr_fir_scc.h \
qa_gr_rotator.h \
qa_gri_mmse_fir_interpolator.h \
- qa_gri_mmse_fir_interpolator_cc.h
+ qa_gri_mmse_fir_interpolator_cc.h \
+ qa_gri_fir_filter_with_buffer_ccf.h \
+ qa_gri_fir_filter_with_buffer_ccc.h \
+ qa_gri_fir_filter_with_buffer_fcc.h \
+ qa_gri_fir_filter_with_buffer_fff.h \
+ qa_gri_fir_filter_with_buffer_fsf.h \
+ qa_gri_fir_filter_with_buffer_scc.h
if PYTHON
@@ -344,6 +362,7 @@ swiginclude_HEADERS = \
gr_single_pole_iir_filter_ff.i \
gr_single_pole_iir_filter_cc.i \
gr_pfb_channelizer_ccf.i \
+ gr_pfb_synthesis_filterbank_ccf.i\
gr_pfb_decimator_ccf.i \
gr_pfb_interpolator_ccf.i \
gr_pfb_arb_resampler_ccf.i \
diff --git a/gnuradio-core/src/lib/filter/Makefile.gen b/gnuradio-core/src/lib/filter/Makefile.gen
index 6809274fa..909899c05 100644
--- a/gnuradio-core/src/lib/filter/Makefile.gen
+++ b/gnuradio-core/src/lib/filter/Makefile.gen
@@ -40,7 +40,14 @@ GENERATED_H = \
gr_rational_resampler_base_fcc.h \
gr_rational_resampler_base_fff.h \
gr_rational_resampler_base_fsf.h \
- gr_rational_resampler_base_scc.h
+ gr_rational_resampler_base_scc.h \
+ gri_fir_filter_with_buffer_ccc.h \
+ gri_fir_filter_with_buffer_ccf.h \
+ gri_fir_filter_with_buffer_fcc.h \
+ gri_fir_filter_with_buffer_fff.h \
+ gri_fir_filter_with_buffer_fsf.h \
+ gri_fir_filter_with_buffer_scc.h
+
GENERATED_I = \
gr_fir_filter_ccc.i \
@@ -107,5 +114,11 @@ GENERATED_CC = \
gr_rational_resampler_base_fcc.cc \
gr_rational_resampler_base_fff.cc \
gr_rational_resampler_base_fsf.cc \
- gr_rational_resampler_base_scc.cc
+ gr_rational_resampler_base_scc.cc \
+ gri_fir_filter_with_buffer_ccc.cc \
+ gri_fir_filter_with_buffer_ccf.cc \
+ gri_fir_filter_with_buffer_fcc.cc \
+ gri_fir_filter_with_buffer_fff.cc \
+ gri_fir_filter_with_buffer_fsf.cc \
+ gri_fir_filter_with_buffer_scc.cc
diff --git a/gnuradio-core/src/lib/filter/filter.i b/gnuradio-core/src/lib/filter/filter.i
index bdfb8fa8d..645607cba 100644
--- a/gnuradio-core/src/lib/filter/filter.i
+++ b/gnuradio-core/src/lib/filter/filter.i
@@ -33,6 +33,7 @@
#include <gr_goertzel_fc.h>
#include <gr_cma_equalizer_cc.h>
#include <gr_pfb_channelizer_ccf.h>
+#include <gr_pfb_synthesis_filterbank_ccf.h>
#include <gr_pfb_decimator_ccf.h>
#include <gr_pfb_interpolator_ccf.h>
#include <gr_pfb_arb_resampler_ccf.h>
@@ -52,6 +53,7 @@
%include "gr_goertzel_fc.i"
%include "gr_cma_equalizer_cc.i"
%include "gr_pfb_channelizer_ccf.i"
+%include "gr_pfb_synthesis_filterbank_ccf.i"
%include "gr_pfb_decimator_ccf.i"
%include "gr_pfb_interpolator_ccf.i"
%include "gr_pfb_arb_resampler_ccf.i"
diff --git a/gnuradio-core/src/lib/filter/generate_all.py b/gnuradio-core/src/lib/filter/generate_all.py
index b34e13c73..ceed2b851 100755
--- a/gnuradio-core/src/lib/filter/generate_all.py
+++ b/gnuradio-core/src/lib/filter/generate_all.py
@@ -30,6 +30,7 @@ import generate_gr_fir_sysconfig_generic
import generate_gr_fir_sysconfig
import generate_gr_fir_util
import generate_gr_fir_XXX
+import generate_gri_fir_filter_with_buffer_XXX
def generate_all():
generate_gr_fir_XXX.generate()
@@ -40,6 +41,7 @@ def generate_all():
generate_gr_fir_sysconfig_generic.generate()
generate_gr_fir_sysconfig.generate()
generate_gr_fir_util.generate()
+ generate_gri_fir_filter_with_buffer_XXX.generate()
output_glue('filter')
if __name__ == '__main__':
diff --git a/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py b/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
new file mode 100755
index 000000000..f586b0c27
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+# -*- python -*-
+#
+# Copyright 2010 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.
+#
+
+import re
+from generate_utils import *
+
+roots = ['gri_fir_filter_with_buffer_XXX',]
+
+def code3_to_acc_code (code3):
+ if i_code (code3) == 'c' or o_code (code3) == 'c' or tap_code (code3) == 'c':
+ return 'c'
+ if i_code (code3) == 'f' or o_code (code3) == 'f' or tap_code (code3) == 'f':
+ return 'f'
+ if i_code (code3) == 'i' or o_code (code3) == 'i' or tap_code (code3) == 'i':
+ return 'i'
+ return 'i' # even short short short needs int accumulator
+
+def code3_to_input_cast (code3):
+ if i_code (code3) == 's' and o_code (code3) == 'c':
+ return '(float)'
+ return ''
+
+def expand_h_cc (root, code3):
+ d = init_dict (root, code3)
+ expand_template (d, root + '.h.t')
+ expand_template (d, root + '.cc.t')
+
+def init_dict (root, code3):
+ name = re.sub ('X+', code3, root)
+ d = standard_dict (name, code3)
+ d['INPUT_CAST'] = code3_to_input_cast (code3)
+ acc_code = code3_to_acc_code (code3)
+ d['ACC_TYPE'] = char_to_type[acc_code]
+ return d
+
+
+def generate ():
+ for r in roots:
+ for s in fir_signatures:
+ expand_h_cc (r, s)
+
+
+if __name__ == '__main__':
+ generate ()
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
index cb67b8104..db16a634b 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
@@ -55,7 +55,6 @@ gr_pfb_channelizer_ccf::gr_pfb_channelizer_ccf (unsigned int numchans,
// This tests the specified input sample rate to see if it conforms to this
// requirement within a few significant figures.
double intp = 0;
- double x = (10000.0*rint(numchans / oversample_rate)) / 10000.0;
double fltp = modf(numchans / oversample_rate, &intp);
if(fltp != 0.0)
throw std::invalid_argument("gr_pfb_channelizer: oversample rate must be N/i for i in [1, N]");
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
new file mode 100644
index 000000000..9fad1bd0d
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
@@ -0,0 +1,169 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gr_pfb_synthesis_filterbank_ccf.h>
+#include <gri_fft.h>
+#include <gr_io_signature.h>
+#include <cstdio>
+#include <cstring>
+
+gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf
+ (unsigned int numchans, const std::vector<float> &taps)
+{
+ return gr_pfb_synthesis_filterbank_ccf_sptr
+ (new gr_pfb_synthesis_filterbank_ccf (numchans, taps));
+}
+
+
+gr_pfb_synthesis_filterbank_ccf::gr_pfb_synthesis_filterbank_ccf
+ (unsigned int numchans, const std::vector<float> &taps)
+ : gr_sync_interpolator ("pfb_synthesis_filterbank_ccf",
+ gr_make_io_signature (1, numchans, sizeof(gr_complex)),
+ gr_make_io_signature (1, 1, sizeof(gr_complex)),
+ numchans),
+ d_updated (false), d_numchans(numchans)
+{
+ d_filters = std::vector<gri_fir_filter_with_buffer_ccf*>(d_numchans);
+
+ // Create an FIR filter for each channel and zero out the taps
+ std::vector<float> vtaps(0, d_numchans);
+ for(unsigned int i = 0; i < d_numchans; i++) {
+ d_filters[i] = new gri_fir_filter_with_buffer_ccf(vtaps);
+ }
+
+ // Now, actually set the filters' taps
+ set_taps(taps);
+
+ // Create the IFFT to handle the input channel rotations
+ d_fft = new gri_fft_complex (d_numchans, true);
+}
+
+gr_pfb_synthesis_filterbank_ccf::~gr_pfb_synthesis_filterbank_ccf ()
+{
+ for(unsigned int i = 0; i < d_numchans; i++) {
+ delete d_filters[i];
+ }
+}
+
+void
+gr_pfb_synthesis_filterbank_ccf::set_taps (const std::vector<float> &taps)
+{
+ unsigned int i,j;
+
+ unsigned int ntaps = taps.size();
+ d_taps_per_filter = (unsigned int)ceil((double)ntaps/(double)d_numchans);
+
+ // Create d_numchan vectors to store each channel's taps
+ d_taps.resize(d_numchans);
+
+ // Make a vector of the taps plus fill it out with 0's to fill
+ // each polyphase filter with exactly d_taps_per_filter
+ std::vector<float> tmp_taps;
+ tmp_taps = taps;
+ while((float)(tmp_taps.size()) < d_numchans*d_taps_per_filter) {
+ tmp_taps.push_back(0.0);
+ }
+
+ // Partition the filter
+ for(i = 0; i < d_numchans; i++) {
+ // Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out
+ d_taps[i] = std::vector<float>(d_taps_per_filter, 0);
+ for(j = 0; j < d_taps_per_filter; j++) {
+ d_taps[i][j] = tmp_taps[i + j*d_numchans]; // add taps to channels in reverse order
+ }
+
+ // Build a filter for each channel and add it's taps to it
+ d_filters[i]->set_taps(d_taps[i]);
+ }
+
+ // Set the history to ensure enough input items for each filter
+ set_history (d_taps_per_filter+1);
+
+ d_updated = true;
+}
+
+void
+gr_pfb_synthesis_filterbank_ccf::print_taps()
+{
+ unsigned int i, j;
+ for(i = 0; i < d_numchans; i++) {
+ printf("filter[%d]: [", i);
+ for(j = 0; j < d_taps_per_filter; j++) {
+ printf(" %.4e", d_taps[i][j]);
+ }
+ printf("]\n\n");
+ }
+}
+
+
+int
+gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+{
+ gr_complex *in = (gr_complex*) input_items[0];
+ gr_complex *out = (gr_complex *) output_items[0];
+ int numsigs = input_items.size();
+ int ndiff = d_numchans - numsigs;
+ unsigned int nhalf = (unsigned int)ceil((float)numsigs/2.0f);
+
+ if (d_updated) {
+ d_updated = false;
+ return 0; // history requirements may have changed.
+ }
+
+ unsigned int n, i;
+ for(n = 0; n < noutput_items/d_numchans; n++) {
+ // fill up the populated channels based on the
+ // number of real input streams
+ for(i = 0; i < nhalf; i++) {
+ in = (gr_complex*)input_items[i];
+ d_fft->get_inbuf()[i] = (in+i)[n];
+ }
+
+ // Make the ndiff channels around N/2 0
+ for(; i < nhalf+ndiff; i++) {
+ d_fft->get_inbuf()[i] = gr_complex(0,0);
+ }
+
+ // Finish off channels with data
+ for(; i < d_numchans; i++) {
+ in = (gr_complex*)input_items[i-ndiff];
+ d_fft->get_inbuf()[i] = (in+i)[n];
+ }
+
+ // spin through IFFT
+ d_fft->execute();
+
+ for(i = 0; i < d_numchans; i++) {
+ out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(d_fft->get_outbuf()[i]);
+ }
+
+ out += d_numchans;
+ }
+
+ return noutput_items;
+}
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
new file mode 100644
index 000000000..f5b1cbb94
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
@@ -0,0 +1,98 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+
+#ifndef INCLUDED_GR_PFB_SYNTHESIS_FILTERBANK_CCF_H
+#define INCLUDED_GR_PFB_SYNTHESIS_FILTERBANK_CCF_H
+
+#include <gr_sync_interpolator.h>
+#include <gri_fir_filter_with_buffer_ccf.h>
+
+class gr_pfb_synthesis_filterbank_ccf;
+typedef boost::shared_ptr<gr_pfb_synthesis_filterbank_ccf> gr_pfb_synthesis_filterbank_ccf_sptr;
+gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf
+ (unsigned int numchans, const std::vector<float> &taps);
+
+class gri_fft_complex;
+
+
+/*!
+ * \class gr_pfb_synthesis_filterbank_ccf
+ *
+ * \brief Polyphase synthesis filterbank with
+ * gr_complex input, gr_complex output and float taps
+ *
+ * \ingroup filter_blk
+ */
+
+class gr_pfb_synthesis_filterbank_ccf : public gr_sync_interpolator
+{
+ private:
+ /*!
+ * Build the polyphase synthesis filterbank.
+ * \param numchans (unsigned integer) Specifies the number of
+ channels <EM>M</EM>
+ * \param taps (vector/list of floats) The prototype filter to
+ populate the filterbank.
+ */
+ friend gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf
+ (unsigned int numchans, const std::vector<float> &taps);
+
+ bool d_updated;
+ unsigned int d_numchans;
+ unsigned int d_taps_per_filter;
+ gri_fft_complex *d_fft;
+ std::vector< gri_fir_filter_with_buffer_ccf*> d_filters;
+ std::vector< std::vector<float> > d_taps;
+
+
+ /*!
+ * Build the polyphase synthesis filterbank.
+ * \param numchans (unsigned integer) Specifies the number of
+ channels <EM>M</EM>
+ * \param taps (vector/list of floats) The prototype filter
+ to populate the filterbank.
+ */
+ gr_pfb_synthesis_filterbank_ccf (unsigned int numchans,
+ const std::vector<float> &taps);
+
+public:
+ ~gr_pfb_synthesis_filterbank_ccf ();
+
+ /*!
+ * Resets the filterbank's filter taps with the new prototype filter
+ * \param taps (vector/list of floats) The prototype filter to
+ populate the filterbank.
+ */
+ void set_taps (const std::vector<float> &taps);
+
+ /*!
+ * Print all of the filterbank taps to screen.
+ */
+ void print_taps();
+
+ int work (int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gr-uhd/lib/utils.h b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i
index 4a05476bd..02a9f0255 100644
--- a/gr-uhd/lib/utils.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i
@@ -20,21 +20,19 @@
* Boston, MA 02110-1301, USA.
*/
-#ifndef INCLUDED_NOINST_UTILS_H
-#define INCLUDED_NOINST_UTILS_H
+GR_SWIG_BLOCK_MAGIC(gr,pfb_synthesis_filterbank_ccf);
-#include <string>
+gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf
+ (unsigned int numchans, const std::vector<float> &taps);
-void do_samp_rate_error_message(
- double target_rate,
- double actual_rate,
- const std::string &xx
-);
+class gr_pfb_synthesis_filterbank_ccf : public gr_sync_interpolator
+{
+ private:
+ gr_pfb_synthesis_filterbank_ccf (unsigned int numchans,
+ const std::vector<float> &taps);
-void do_tune_freq_error_message(
- double target_freq,
- double actual_freq,
- const std::string &xx
-);
+ public:
+ ~gr_pfb_synthesis_filterbank_ccf ();
-#endif /* INCLUDED_NOINST_UTILS_H */
+ void set_taps (const std::vector<float> &taps);
+};
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
new file mode 100644
index 000000000..154068840
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
@@ -0,0 +1,121 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <@NAME@.h>
+
+@NAME@::@NAME@(const std::vector<@TAP_TYPE@> &taps)
+{
+ d_buffer = NULL;
+ set_taps(taps);
+}
+
+@NAME@::~@NAME@()
+{
+ if(d_buffer != NULL)
+ free(d_buffer);
+}
+
+void
+@NAME@::set_taps (const std::vector<@TAP_TYPE@> &taps)
+{
+ d_taps = gr_reverse(taps);
+
+ if(d_buffer != NULL) {
+ free(d_buffer);
+ d_buffer = NULL;
+ }
+
+ // FIXME: memalign this to 16-byte boundaries for SIMD later
+ size_t t = sizeof(@I_TYPE@) * 2 * d_taps.size();
+ d_buffer = (@I_TYPE@*)malloc(t);
+ memset(d_buffer, 0x00, t);
+ d_idx = 0;
+}
+
+@O_TYPE@
+@NAME@::filter (@I_TYPE@ input)
+{
+ unsigned int i;
+
+ d_buffer[d_idx] = input;
+ d_buffer[d_idx+ntaps()] = input;
+
+ // using the later for the case when ntaps=0;
+ // profiling shows this doesn't make a difference
+ //d_idx = (d_idx + 1) % ntaps();
+ d_idx++;
+ if(d_idx >= ntaps())
+ d_idx = 0;
+
+ @ACC_TYPE@ out = 0;
+ for(i = 0; i < ntaps(); i++) {
+ out += @INPUT_CAST@ d_buffer[d_idx + i] * d_taps[i];
+ }
+ return (@O_TYPE@)out;
+}
+
+@O_TYPE@
+@NAME@::filter (const @I_TYPE@ input[], unsigned long dec)
+{
+ unsigned int i;
+
+ for(i = 0; i < dec; i++) {
+ d_buffer[d_idx] = input[i];
+ d_buffer[d_idx+ntaps()] = input[i];
+ d_idx++;
+ if(d_idx >= ntaps())
+ d_idx = 0;
+ }
+
+ @ACC_TYPE@ out = 0;
+ for(i = 0; i < ntaps(); i++) {
+ out += @INPUT_CAST@ d_buffer[d_idx + i] * d_taps[i];
+ }
+ return (@O_TYPE@)out;
+}
+
+void
+@NAME@::filterN (@O_TYPE@ output[],
+ const @I_TYPE@ input[],
+ unsigned long n)
+{
+ for(unsigned long i = 0; i < n; i++) {
+ output[i] = filter(input[i]);
+ }
+}
+
+void
+@NAME@::filterNdec (@O_TYPE@ output[],
+ const @I_TYPE@ input[],
+ unsigned long n,
+ unsigned long decimate)
+{
+ unsigned long j = 0;
+ for(unsigned long i = 0; i < n; i++) {
+ output[i] = filter(&input[j], decimate);
+ j += decimate;
+ }
+}
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
new file mode 100644
index 000000000..23d64b65d
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
@@ -0,0 +1,131 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+/*
+ * WARNING: This file is automatically generated by generate_gri_fir_XXX.py
+ * Any changes made to this file will be overwritten.
+ */
+
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <vector>
+#include <gr_types.h>
+#include <gr_reverse.h>
+#include <string.h>
+#include <cstdio>
+
+/*!
+ * \brief FIR with internal buffer for @I_TYPE@ input,
+ @O_TYPE@ output and @TAP_TYPE@ taps
+ * \ingroup filter
+ *
+ */
+
+class @NAME@ {
+
+protected:
+ std::vector<@TAP_TYPE@> d_taps; // reversed taps
+ @I_TYPE@ *d_buffer;
+ unsigned int d_idx;
+
+public:
+
+ // CONSTRUCTORS
+
+ /*!
+ * \brief construct new FIR with given taps.
+ *
+ * Note that taps must be in forward order, e.g., coefficient 0 is
+ * stored in new_taps[0], coefficient 1 is stored in
+ * new_taps[1], etc.
+ */
+ @NAME@ (const std::vector<@TAP_TYPE@> &taps);
+
+ ~@NAME@ ();
+
+ // MANIPULATORS
+
+ /*!
+ * \brief compute a single output value.
+ *
+ * \p input is a single input value of the filter type
+ *
+ * \returns the filtered input value.
+ */
+ @O_TYPE@ filter (@I_TYPE@ input);
+
+
+ /*!
+ * \brief compute a single output value; designed for decimating filters.
+ *
+ * \p input is a single input value of the filter type. The value of dec is the
+ * decimating value of the filter, so input[] must have dec valid values.
+ * The filter pushes dec number of items onto the circ. buffer before computing
+ * a single output.
+ *
+ * \returns the filtered input value.
+ */
+ @O_TYPE@ filter (const @I_TYPE@ input[], unsigned long dec);
+
+ /*!
+ * \brief compute an array of N output values.
+ *
+ * \p input must have (n - 1 + ntaps()) valid entries.
+ * input[0] .. input[n - 1 + ntaps() - 1] are referenced to compute the output values.
+ */
+ void filterN (@O_TYPE@ output[], const @I_TYPE@ input[],
+ unsigned long n);
+
+ /*!
+ * \brief compute an array of N output values, decimating the input
+ *
+ * \p input must have (decimate * (n - 1) + ntaps()) valid entries.
+ * input[0] .. input[decimate * (n - 1) + ntaps() - 1] are referenced to
+ * compute the output values.
+ */
+ void filterNdec (@O_TYPE@ output[], const @I_TYPE@ input[],
+ unsigned long n, unsigned long decimate);
+
+ /*!
+ * \brief install \p new_taps as the current taps.
+ */
+ void set_taps (const std::vector<@TAP_TYPE@> &taps);
+
+ // ACCESSORS
+
+ /*!
+ * \return number of taps in filter.
+ */
+ unsigned ntaps () const { return d_taps.size (); }
+
+ /*!
+ * \return current taps
+ */
+ const std::vector<@TAP_TYPE@> get_taps () const
+ {
+ return gr_reverse(d_taps);
+ }
+};
+
+#endif /* @GUARD_NAME@ */
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
new file mode 100644
index 000000000..bd7fa33cf
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
@@ -0,0 +1,131 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+/*
+ * WARNING: This file is automatically generated by generate_gri_fir_XXX.py
+ * Any changes made to this file will be overwritten.
+ */
+
+
+#ifndef INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_CCF_H
+#define INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_CCF_H
+
+#include <vector>
+#include <gr_types.h>
+#include <gr_reverse.h>
+#include <string.h>
+#include <cstdio>
+
+/*!
+ * \brief FIR with internal buffer for gr_complex input,
+ gr_complex output and float taps
+ * \ingroup filter
+ *
+ */
+
+class gri_fir_filter_with_buffer_ccf {
+
+protected:
+ std::vector<float> d_taps; // reversed taps
+ gr_complex *d_buffer;
+ unsigned int d_idx;
+
+public:
+
+ // CONSTRUCTORS
+
+ /*!
+ * \brief construct new FIR with given taps.
+ *
+ * Note that taps must be in forward order, e.g., coefficient 0 is
+ * stored in new_taps[0], coefficient 1 is stored in
+ * new_taps[1], etc.
+ */
+ gri_fir_filter_with_buffer_ccf (const std::vector<float> &taps);
+
+ ~gri_fir_filter_with_buffer_ccf ();
+
+ // MANIPULATORS
+
+ /*!
+ * \brief compute a single output value.
+ *
+ * \p input is a single input value of the filter type
+ *
+ * \returns the filtered input value.
+ */
+ gr_complex filter (gr_complex input);
+
+
+ /*!
+ * \brief compute a single output value; designed for decimating filters.
+ *
+ * \p input is a single input value of the filter type. The value of dec is the
+ * decimating value of the filter, so input[] must have dec valid values.
+ * The filter pushes dec number of items onto the circ. buffer before computing
+ * a single output.
+ *
+ * \returns the filtered input value.
+ */
+ gr_complex filter (const gr_complex input[], unsigned long dec);
+
+ /*!
+ * \brief compute an array of N output values.
+ *
+ * \p input must have (n - 1 + ntaps()) valid entries.
+ * input[0] .. input[n - 1 + ntaps() - 1] are referenced to compute the output values.
+ */
+ void filterN (gr_complex output[], const gr_complex input[],
+ unsigned long n);
+
+ /*!
+ * \brief compute an array of N output values, decimating the input
+ *
+ * \p input must have (decimate * (n - 1) + ntaps()) valid entries.
+ * input[0] .. input[decimate * (n - 1) + ntaps() - 1] are referenced to
+ * compute the output values.
+ */
+ void filterNdec (gr_complex output[], const gr_complex input[],
+ unsigned long n, unsigned long decimate);
+
+ /*!
+ * \brief install \p new_taps as the current taps.
+ */
+ void set_taps (const std::vector<float> &taps);
+
+ // ACCESSORS
+
+ /*!
+ * \return number of taps in filter.
+ */
+ unsigned ntaps () const { return d_taps.size (); }
+
+ /*!
+ * \return current taps
+ */
+ const std::vector<float> get_taps () const
+ {
+ return gr_reverse(d_taps);
+ }
+};
+
+#endif /* INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_CCF_H */
diff --git a/gnuradio-core/src/lib/filter/qa_filter.cc b/gnuradio-core/src/lib/filter/qa_filter.cc
index 878d48023..0d03cb0ee 100644
--- a/gnuradio-core/src/lib/filter/qa_filter.cc
+++ b/gnuradio-core/src/lib/filter/qa_filter.cc
@@ -36,6 +36,12 @@
#include <qa_gri_mmse_fir_interpolator.h>
#include <qa_gri_mmse_fir_interpolator_cc.h>
#include <qa_gr_rotator.h>
+#include <qa_gri_fir_filter_with_buffer_ccf.h>
+#include <qa_gri_fir_filter_with_buffer_ccc.h>
+#include <qa_gri_fir_filter_with_buffer_fcc.h>
+#include <qa_gri_fir_filter_with_buffer_fff.h>
+#include <qa_gri_fir_filter_with_buffer_fsf.h>
+#include <qa_gri_fir_filter_with_buffer_scc.h>
CppUnit::TestSuite *
qa_filter::suite ()
@@ -51,6 +57,12 @@ qa_filter::suite ()
s->addTest (qa_gri_mmse_fir_interpolator::suite ());
s->addTest (qa_gri_mmse_fir_interpolator_cc::suite ());
s->addTest (qa_gr_rotator::suite ());
+ s->addTest (qa_gri_fir_filter_with_buffer_ccf::suite ());
+ s->addTest (qa_gri_fir_filter_with_buffer_ccc::suite ());
+ s->addTest (qa_gri_fir_filter_with_buffer_fcc::suite ());
+ s->addTest (qa_gri_fir_filter_with_buffer_fff::suite ());
+ s->addTest (qa_gri_fir_filter_with_buffer_fsf::suite ());
+ s->addTest (qa_gri_fir_filter_with_buffer_scc::suite ());
return s;
}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
new file mode 100644
index 000000000..e87d93ebf
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
@@ -0,0 +1,160 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gr_types.h>
+#include <qa_gri_fir_filter_with_buffer_ccc.h>
+#include <gri_fir_filter_with_buffer_ccc.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef gr_complex i_type;
+typedef gr_complex o_type;
+typedef gr_complex tap_type;
+typedef gr_complex acc_type;
+
+using std::vector;
+
+#define ERR_DELTA (1e-5)
+
+#define NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+ return 2.0 * ((float) random () / RANDOM_MAX - 0.5); // uniformly (-1, 1)
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++){
+ float re = rint (uniform () * 32767);
+ float im = rint (uniform () * 32767);
+ buf[i] = gr_complex (re, im);
+ }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+ acc_type sum = 0;
+ for (int i = 0; i < ntaps; i++) {
+ sum += input[i] * taps[i];
+ }
+
+ return sum;
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccc::t1 ()
+{
+ test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccc::t2 ()
+{
+ test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccc::t3 ()
+{
+ test_decimate(5);
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+void
+qa_gri_fir_filter_with_buffer_ccc::test_decimate(unsigned int decimate)
+{
+ const int MAX_TAPS = 9;
+ const int OUTPUT_LEN = 17;
+ const int INPUT_LEN = MAX_TAPS + OUTPUT_LEN;
+
+ // Mem aligned buffer not really necessary, but why not?
+ i_type *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+ i_type *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+ o_type expected_output[OUTPUT_LEN];
+ o_type actual_output[OUTPUT_LEN];
+ tap_type taps[MAX_TAPS];
+
+ srandom (0); // we want reproducibility
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+ for (int n = 0; n <= MAX_TAPS; n++){
+ for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+ // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+ // build random test case
+ random_complex (input, INPUT_LEN);
+ random_complex (taps, MAX_TAPS);
+
+ // compute expected output values
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ // use an actual delay line for this test
+ for(int dd = 0; dd < (int)decimate; dd++) {
+ for(int oo = INPUT_LEN-1; oo > 0; oo--)
+ dline[oo] = dline[oo-1];
+ dline[0] = input[decimate*o+dd];
+ }
+ expected_output[o] = ref_dotprod (dline, taps, n);
+ }
+
+ // build filter
+ vector<tap_type> f1_taps(&taps[0], &taps[n]);
+ gri_fir_filter_with_buffer_ccc *f1 = new gri_fir_filter_with_buffer_ccc(f1_taps);
+
+ // zero the output, then do the filtering
+ memset (actual_output, 0, sizeof (actual_output));
+ f1->filterNdec (actual_output, input, ol/decimate, decimate);
+
+ // check results
+ //
+ // we use a sloppy error margin because on the x86 architecture,
+ // our reference implementation is using 80 bit floating point
+ // arithmetic, while the SSE version is using 32 bit float point
+ // arithmetic.
+
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+ abs (expected_output[o]) * ERR_DELTA);
+ }
+ delete f1;
+ }
+ }
+ free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
new file mode 100644
index 000000000..f9f206f66
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+#ifndef _QA_GRI_FIR_FILTER_WITH_BUFFER_CCC_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_CCC_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_ccc : public CppUnit::TestCase {
+
+ CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_ccc);
+ CPPUNIT_TEST (t1);
+ CPPUNIT_TEST (t2);
+ CPPUNIT_TEST (t3);
+ CPPUNIT_TEST_SUITE_END ();
+
+ private:
+ void test_decimate(unsigned int decimate);
+
+ void t1 ();
+ void t2 ();
+ void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_CCC_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
new file mode 100644
index 000000000..c25853b1e
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
@@ -0,0 +1,167 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gr_types.h>
+#include <qa_gri_fir_filter_with_buffer_ccf.h>
+#include <gri_fir_filter_with_buffer_ccf.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef gr_complex i_type;
+typedef gr_complex o_type;
+typedef float tap_type;
+typedef gr_complex acc_type;
+
+using std::vector;
+
+#define ERR_DELTA (1e-5)
+
+#define NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+ return 2.0 * ((float) random () / RANDOM_MAX - 0.5); // uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++)
+ buf[i] = (float) rint (uniform () * 32767);
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++){
+ float re = rint (uniform () * 32767);
+ float im = rint (uniform () * 32767);
+ buf[i] = gr_complex (re, im);
+ }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+ acc_type sum = 0;
+ for (int i = 0; i < ntaps; i++) {
+ sum += input[i] * taps[i];
+ }
+
+ return sum;
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccf::t1 ()
+{
+ test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccf::t2 ()
+{
+ test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccf::t3 ()
+{
+ test_decimate(5);
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+void
+qa_gri_fir_filter_with_buffer_ccf::test_decimate (unsigned int decimate)
+{
+ const int MAX_TAPS = 9;
+ const int OUTPUT_LEN = 17;
+ const int INPUT_LEN = MAX_TAPS + OUTPUT_LEN;
+
+ // Mem aligned buffer not really necessary, but why not?
+ i_type *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+ i_type *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+ o_type expected_output[OUTPUT_LEN];
+ o_type actual_output[OUTPUT_LEN];
+ tap_type taps[MAX_TAPS];
+
+ srandom (0); // we want reproducibility
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+ for (int n = 0; n <= MAX_TAPS; n++){
+ for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+ // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+ // build random test case
+ random_complex (input, INPUT_LEN);
+ random_floats (taps, MAX_TAPS);
+
+ // compute expected output values
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ // use an actual delay line for this test
+ for(int dd = 0; dd < (int)decimate; dd++) {
+ for(int oo = INPUT_LEN-1; oo > 0; oo--)
+ dline[oo] = dline[oo-1];
+ dline[0] = input[decimate*o+dd];
+ }
+ expected_output[o] = ref_dotprod (dline, taps, n);
+ }
+
+ // build filter
+ vector<tap_type> f1_taps(&taps[0], &taps[n]);
+ gri_fir_filter_with_buffer_ccf *f1 = new gri_fir_filter_with_buffer_ccf(f1_taps);
+
+ // zero the output, then do the filtering
+ memset (actual_output, 0, sizeof (actual_output));
+ f1->filterNdec (actual_output, input, ol/decimate, decimate);
+
+ // check results
+ //
+ // we use a sloppy error margin because on the x86 architecture,
+ // our reference implementation is using 80 bit floating point
+ // arithmetic, while the SSE version is using 32 bit float point
+ // arithmetic.
+
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+ abs (expected_output[o]) * ERR_DELTA);
+ }
+ delete f1;
+ }
+ }
+ free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
new file mode 100644
index 000000000..924b4bc2e
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+#ifndef _QA_GRI_FIR_FILTER_WITH_BUFFER_CCF_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_CCF_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_ccf : public CppUnit::TestCase {
+
+ CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_ccf);
+ CPPUNIT_TEST (t1);
+ CPPUNIT_TEST (t2);
+ CPPUNIT_TEST (t3);
+ CPPUNIT_TEST_SUITE_END ();
+
+ private:
+ void test_decimate(unsigned int decimate);
+
+ void t1 ();
+ void t2 ();
+ void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_CCF_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
new file mode 100644
index 000000000..19f270200
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
@@ -0,0 +1,168 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gr_types.h>
+#include <qa_gri_fir_filter_with_buffer_fcc.h>
+#include <gri_fir_filter_with_buffer_fcc.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef float i_type;
+typedef gr_complex o_type;
+typedef gr_complex tap_type;
+typedef gr_complex acc_type;
+
+using std::vector;
+
+#define ERR_DELTA (1e-5)
+
+#define NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+ return 2.0 * ((float) random () / RANDOM_MAX - 0.5); // uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++)
+ buf[i] = (float) rint (uniform () * 32767);
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++){
+ float re = rint (uniform () * 32767);
+ float im = rint (uniform () * 32767);
+ buf[i] = gr_complex (re, im);
+ }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+ acc_type sum = 0;
+ for (int i = 0; i < ntaps; i++) {
+ sum += input[i] * taps[i];
+ }
+
+ return sum;
+}
+
+void
+qa_gri_fir_filter_with_buffer_fcc::t1()
+{
+ test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fcc::t2()
+{
+ test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fcc::t3()
+{
+ test_decimate(5);
+}
+
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+void
+qa_gri_fir_filter_with_buffer_fcc::test_decimate(unsigned int decimate)
+{
+ const int MAX_TAPS = 9;
+ const int OUTPUT_LEN = 17;
+ const int INPUT_LEN = MAX_TAPS + OUTPUT_LEN;
+
+ // Mem aligned buffer not really necessary, but why not?
+ i_type *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+ i_type *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+ o_type expected_output[OUTPUT_LEN];
+ o_type actual_output[OUTPUT_LEN];
+ tap_type taps[MAX_TAPS];
+
+ srandom (0); // we want reproducibility
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+ for (int n = 0; n <= MAX_TAPS; n++){
+ for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+ // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+ // build random test case
+ random_floats (input, INPUT_LEN);
+ random_complex (taps, MAX_TAPS);
+
+ // compute expected output values
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ // use an actual delay line for this test
+ for(int dd = 0; dd < (int)decimate; dd++) {
+ for(int oo = INPUT_LEN-1; oo > 0; oo--)
+ dline[oo] = dline[oo-1];
+ dline[0] = input[decimate*o+dd];
+ }
+ expected_output[o] = ref_dotprod (dline, taps, n);
+ }
+
+ // build filter
+ vector<tap_type> f1_taps(&taps[0], &taps[n]);
+ gri_fir_filter_with_buffer_fcc *f1 = new gri_fir_filter_with_buffer_fcc(f1_taps);
+
+ // zero the output, then do the filtering
+ memset (actual_output, 0, sizeof (actual_output));
+ f1->filterNdec (actual_output, input, ol/decimate, decimate);
+
+ // check results
+ //
+ // we use a sloppy error margin because on the x86 architecture,
+ // our reference implementation is using 80 bit floating point
+ // arithmetic, while the SSE version is using 32 bit float point
+ // arithmetic.
+
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+ abs (expected_output[o]) * ERR_DELTA);
+ }
+ delete f1;
+ }
+ }
+ free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
new file mode 100644
index 000000000..6201800f9
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+#ifndef _QA_GRI_FIR_FILTER_WITH_BUFFER_FCC_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_FCC_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_fcc : public CppUnit::TestCase {
+
+ CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fcc);
+ CPPUNIT_TEST (t1);
+ CPPUNIT_TEST (t2);
+ CPPUNIT_TEST (t3);
+ CPPUNIT_TEST_SUITE_END ();
+
+ private:
+ void test_decimate(unsigned int decimate);
+
+ void t1 ();
+ void t2 ();
+ void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_FCC_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
new file mode 100644
index 000000000..8401e484b
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
@@ -0,0 +1,156 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gr_types.h>
+#include <qa_gri_fir_filter_with_buffer_fff.h>
+#include <gri_fir_filter_with_buffer_fff.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef float i_type;
+typedef float o_type;
+typedef float tap_type;
+typedef float acc_type;
+
+using std::vector;
+
+#define ERR_DELTA (1e-5)
+
+#define NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+ return 2.0 * ((float) random () / RANDOM_MAX - 0.5); // uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++)
+ buf[i] = (float) rint (uniform () * 32767);
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+ acc_type sum = 0;
+ for (int i = 0; i < ntaps; i++) {
+ sum += input[i] * taps[i];
+ }
+ return sum;
+}
+
+void
+qa_gri_fir_filter_with_buffer_fff::t1 ()
+{
+ test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fff::t2 ()
+{
+ test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fff::t3 ()
+{
+ test_decimate(5);
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+void
+qa_gri_fir_filter_with_buffer_fff::test_decimate(unsigned int decimate)
+{
+ const int MAX_TAPS = 9;
+ const int OUTPUT_LEN = 17;
+ const int INPUT_LEN = MAX_TAPS + OUTPUT_LEN;
+
+ // Mem aligned buffer not really necessary, but why not?
+ i_type *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+ i_type *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+ o_type expected_output[OUTPUT_LEN];
+ o_type actual_output[OUTPUT_LEN];
+ tap_type taps[MAX_TAPS];
+
+ srandom (0); // we want reproducibility
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+ for (int n = 0; n <= MAX_TAPS; n++){
+ for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+ // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+ // build random test case
+ random_floats (input, INPUT_LEN);
+ random_floats (taps, MAX_TAPS);
+
+ // compute expected output values
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ // use an actual delay line for this test
+ for(int dd = 0; dd < (int)decimate; dd++) {
+ for(int oo = INPUT_LEN-1; oo > 0; oo--)
+ dline[oo] = dline[oo-1];
+ dline[0] = input[decimate*o+dd];
+ }
+ expected_output[o] = ref_dotprod (dline, taps, n);
+ }
+
+ // build filter
+ vector<tap_type> f1_taps(&taps[0], &taps[n]);
+ gri_fir_filter_with_buffer_fff *f1 = new gri_fir_filter_with_buffer_fff(f1_taps);
+
+ // zero the output, then do the filtering
+ memset (actual_output, 0, sizeof (actual_output));
+ f1->filterNdec (actual_output, input, ol/decimate, decimate);
+
+ // check results
+ //
+ // we use a sloppy error margin because on the x86 architecture,
+ // our reference implementation is using 80 bit floating point
+ // arithmetic, while the SSE version is using 32 bit float point
+ // arithmetic.
+
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_output[o], actual_output[o],
+ fabsf (expected_output[o]) * ERR_DELTA);
+ }
+ delete f1;
+ }
+ }
+ free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
new file mode 100644
index 000000000..54a9cdc53
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+#ifndef _QA_GRI_FIR_FILTER_WITH_BUFFER_FFF_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_FFF_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_fff : public CppUnit::TestCase {
+
+ CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fff);
+ CPPUNIT_TEST (t1);
+ CPPUNIT_TEST (t2);
+ CPPUNIT_TEST (t3);
+ CPPUNIT_TEST_SUITE_END ();
+
+ private:
+ void test_decimate(unsigned int decimate);
+
+ void t1 ();
+ void t2 ();
+ void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_FFF_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
new file mode 100644
index 000000000..091505380
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gr_types.h>
+#include <qa_gri_fir_filter_with_buffer_fsf.h>
+#include <gri_fir_filter_with_buffer_fsf.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef float i_type;
+typedef short o_type;
+typedef float tap_type;
+typedef float acc_type;
+
+using std::vector;
+
+#define NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+ return 2.0 * ((float) random () / RANDOM_MAX - 0.5); // uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++)
+ buf[i] = (float) rint (uniform () * 128);
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+ acc_type sum = 0;
+ for (int i = 0; i < ntaps; i++) {
+ sum += input[i] * taps[i];
+ }
+ return (o_type)sum;
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t1 ()
+{
+ test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t2 ()
+{
+ test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t3 ()
+{
+ test_decimate(5);
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+void
+qa_gri_fir_filter_with_buffer_fsf::test_decimate (unsigned int decimate)
+{
+ const int MAX_TAPS = 9;
+ const int OUTPUT_LEN = 17;
+ const int INPUT_LEN = MAX_TAPS + OUTPUT_LEN;
+
+ // Mem aligned buffer not really necessary, but why not?
+ i_type *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+ i_type *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+ o_type expected_output[OUTPUT_LEN];
+ o_type actual_output[OUTPUT_LEN];
+ tap_type taps[MAX_TAPS];
+
+ srandom (0); // we want reproducibility
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+ for (int n = 0; n <= MAX_TAPS; n++){
+ for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+ // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+ // build random test case
+ random_floats (input, INPUT_LEN);
+ random_floats (taps, MAX_TAPS);
+
+ // compute expected output values
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ // use an actual delay line for this test
+ for(int dd = 0; dd < (int)decimate; dd++) {
+ for(int oo = INPUT_LEN-1; oo > 0; oo--)
+ dline[oo] = dline[oo-1];
+ dline[0] = input[decimate*o+dd];
+ }
+ expected_output[o] = ref_dotprod (dline, taps, n);
+ }
+
+ // build filter
+ vector<tap_type> f1_taps(&taps[0], &taps[n]);
+ gri_fir_filter_with_buffer_fsf *f1 = new gri_fir_filter_with_buffer_fsf(f1_taps);
+
+ // zero the output, then do the filtering
+ memset (actual_output, 0, sizeof (actual_output));
+ f1->filterNdec (actual_output, input, ol/decimate, decimate);
+
+ // check results
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ CPPUNIT_ASSERT_EQUAL(expected_output[o], actual_output[o]);
+ }
+ delete f1;
+ }
+ }
+ free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
new file mode 100644
index 000000000..9c901464e
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+#ifndef _QA_GRI_FIR_FILTER_WITH_BUFFER_FSF_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_FSF_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_fsf : public CppUnit::TestCase {
+
+ CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fsf);
+ CPPUNIT_TEST (t1);
+ CPPUNIT_TEST (t2);
+ CPPUNIT_TEST (t3);
+ CPPUNIT_TEST_SUITE_END ();
+
+ private:
+ void test_decimate(unsigned int decimate);
+
+ void t1 ();
+ void t2 ();
+ void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_FSF_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
new file mode 100644
index 000000000..03cd71022
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
@@ -0,0 +1,167 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gr_types.h>
+#include <qa_gri_fir_filter_with_buffer_scc.h>
+#include <gri_fir_filter_with_buffer_scc.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef short i_type;
+typedef gr_complex o_type;
+typedef gr_complex tap_type;
+typedef gr_complex acc_type;
+
+using std::vector;
+
+#define ERR_DELTA (1e-5)
+
+#define NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+ return 2.0 * ((float) random () / RANDOM_MAX - 0.5); // uniformly (-1, 1)
+}
+
+static void
+random_shorts (short *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++)
+ buf[i] = (short) rint (uniform () * 16384);
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+ for (unsigned i = 0; i < n; i++){
+ float re = rint (uniform () * 32767);
+ float im = rint (uniform () * 32767);
+ buf[i] = gr_complex (re, im);
+ }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+ acc_type sum = 0;
+ for (int i = 0; i < ntaps; i++) {
+ sum += (float)input[i] * taps[i];
+ }
+
+ return sum;
+}
+
+void
+qa_gri_fir_filter_with_buffer_scc::t1 ()
+{
+ test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_scc::t2 ()
+{
+ test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_scc::t3 ()
+{
+ test_decimate(5);
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+void
+qa_gri_fir_filter_with_buffer_scc::test_decimate (unsigned int decimate)
+{
+ const int MAX_TAPS = 9;
+ const int OUTPUT_LEN = 17;
+ const int INPUT_LEN = MAX_TAPS + OUTPUT_LEN;
+
+ // Mem aligned buffer not really necessary, but why not?
+ i_type *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+ i_type *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+ o_type expected_output[OUTPUT_LEN];
+ o_type actual_output[OUTPUT_LEN];
+ tap_type taps[MAX_TAPS];
+
+ srandom (0); // we want reproducibility
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+ for (int n = 0; n <= MAX_TAPS; n++){
+ for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+ // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+ // build random test case
+ random_shorts (input, INPUT_LEN);
+ random_complex (taps, MAX_TAPS);
+
+ // compute expected output values
+ memset(dline, 0, INPUT_LEN*sizeof(i_type));
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ // use an actual delay line for this test
+ for(int dd = 0; dd < (int)decimate; dd++) {
+ for(int oo = INPUT_LEN-1; oo > 0; oo--)
+ dline[oo] = dline[oo-1];
+ dline[0] = input[decimate*o+dd];
+ }
+ expected_output[o] = ref_dotprod (dline, taps, n);
+ }
+
+ // build filter
+ vector<tap_type> f1_taps(&taps[0], &taps[n]);
+ gri_fir_filter_with_buffer_scc *f1 = new gri_fir_filter_with_buffer_scc(f1_taps);
+
+ // zero the output, then do the filtering
+ memset (actual_output, 0, sizeof (actual_output));
+ f1->filterNdec (actual_output, input, ol/decimate, decimate);
+
+ // check results
+ //
+ // we use a sloppy error margin because on the x86 architecture,
+ // our reference implementation is using 80 bit floating point
+ // arithmetic, while the SSE version is using 32 bit float point
+ // arithmetic.
+
+ for (int o = 0; o < (int)(ol/decimate); o++){
+ CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+ abs (expected_output[o]) * ERR_DELTA);
+ }
+ delete f1;
+ }
+ }
+ free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
new file mode 100644
index 000000000..970ca3749
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+#ifndef _QA_GRI_FIR_FILTER_WITH_BUFFER_SCC_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_SCC_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_scc : public CppUnit::TestCase {
+
+ CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_scc);
+ CPPUNIT_TEST (t1);
+ CPPUNIT_TEST (t2);
+ CPPUNIT_TEST (t3);
+ CPPUNIT_TEST_SUITE_END ();
+
+ private:
+ void test_decimate(unsigned int decimate);
+
+ void t1 ();
+ void t2 ();
+ void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_SCC_H_ */
diff --git a/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc b/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc
index ff997e7a9..c32398e6d 100644
--- a/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc
+++ b/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc
@@ -161,8 +161,9 @@ gr_fll_band_edge_cc::work (int noutput_items,
const gr_complex *in = (const gr_complex *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
- float *frq, *phs;
- gr_complex *err;
+ float *frq = NULL;
+ float *phs = NULL;
+ gr_complex *err = NULL;
if(output_items.size() > 2) {
frq = (float *) output_items[1];
phs = (float *) output_items[2];
diff --git a/gnuradio-core/src/lib/runtime/Makefile.am b/gnuradio-core/src/lib/runtime/Makefile.am
index 4c52f3ab0..a3aa36a39 100644
--- a/gnuradio-core/src/lib/runtime/Makefile.am
+++ b/gnuradio-core/src/lib/runtime/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2003,2004,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2003,2004,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -21,7 +21,7 @@
include $(top_srcdir)/Makefile.common
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(GRUEL_INCLUDES) $(STD_DEFINES_AND_INCLUDES) $(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
noinst_LTLIBRARIES = libruntime.la libruntime-qa.la
diff --git a/gnuradio-core/src/lib/swig/Makefile.am b/gnuradio-core/src/lib/swig/Makefile.am
index 242f27d9c..1a50b8c8e 100644
--- a/gnuradio-core/src/lib/swig/Makefile.am
+++ b/gnuradio-core/src/lib/swig/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2001,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2001,2003,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -22,7 +22,7 @@
include $(top_srcdir)/Makefile.common
if PYTHON
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) -I$(srcdir) \
+AM_CPPFLAGS = -I$(srcdir) $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
$(WITH_INCLUDES)
EXTRA_DIST = gen-swig-bug-fix
diff --git a/gnuradio-examples/c++/dial_tone/Makefile.am b/gnuradio-examples/c++/dial_tone/Makefile.am
index ea34beee8..188275fca 100644
--- a/gnuradio-examples/c++/dial_tone/Makefile.am
+++ b/gnuradio-examples/c++/dial_tone/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2006,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -22,9 +22,10 @@
include $(top_srcdir)/Makefile.common
# For compiling within the GNU Radio build tree
-AM_CPPFLAGS=$(STD_DEFINES_AND_INCLUDES) \
- -I$(top_srcdir)/gr-audio-alsa/src \
- $(WITH_INCLUDES)
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/gr-audio-alsa/src \
+ $(STD_DEFINES_AND_INCLUDES) \
+ $(WITH_INCLUDES)
GR_AUDIO_ALSA_LA=$(top_builddir)/gr-audio-alsa/src/libgnuradio-audio-alsa.la
diff --git a/gnuradio-examples/python/pfb/synth_filter.py b/gnuradio-examples/python/pfb/synth_filter.py
new file mode 100755
index 000000000..a1562f9ea
--- /dev/null
+++ b/gnuradio-examples/python/pfb/synth_filter.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 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.
+#
+
+from gnuradio import gr, blks2
+import scipy, pylab
+
+def main():
+ N = 1000000
+ fs = 8000
+
+ freqs = [100, 200, 300, 400, 500]
+ nchans = 7
+
+ sigs = list()
+ for fi in freqs:
+ s = gr.sig_source_c(fs, gr.GR_SIN_WAVE, fi, 1)
+ sigs.append(s)
+
+ taps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+ print "Num. Taps = %d (taps per filter = %d)" % (len(taps),
+ len(taps)/nchans)
+ filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, taps)
+
+ head = gr.head(gr.sizeof_gr_complex, N)
+ snk = gr.vector_sink_c()
+
+ tb = gr.top_block()
+ tb.connect(filtbank, head, snk)
+
+ for i,si in enumerate(sigs):
+ tb.connect(si, (filtbank, i))
+
+ tb.run()
+
+ if 1:
+ f1 = pylab.figure(1)
+ s1 = f1.add_subplot(1,1,1)
+ s1.plot(snk.data()[1000:])
+
+ fftlen = 2048
+ f2 = pylab.figure(2)
+ s2 = f2.add_subplot(1,1,1)
+ winfunc = scipy.blackman
+ s2.psd(snk.data()[10000:], NFFT=fftlen,
+ Fs = nchans*fs,
+ noverlap=fftlen/4,
+ window = lambda d: d*winfunc(fftlen))
+
+ pylab.show()
+
+if __name__ == "__main__":
+ main()
diff --git a/gnuradio-examples/python/pfb/synth_to_chan.py b/gnuradio-examples/python/pfb/synth_to_chan.py
new file mode 100755
index 000000000..1beda1a54
--- /dev/null
+++ b/gnuradio-examples/python/pfb/synth_to_chan.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 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.
+#
+
+from gnuradio import gr, blks2
+import scipy, pylab
+
+def main():
+ N = 1000000
+ fs = 8000
+
+ freqs = [100, 200, 300, 400, 500]
+ nchans = 7
+
+ sigs = list()
+ fmtx = list()
+ for fi in freqs:
+ s = gr.sig_source_f(fs, gr.GR_SIN_WAVE, fi, 1)
+ fm = blks2.nbfm_tx (fs, 4*fs, max_dev=10000, tau=75e-6)
+ sigs.append(s)
+ fmtx.append(fm)
+
+ syntaps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+ print "Synthesis Num. Taps = %d (taps per filter = %d)" % (len(syntaps),
+ len(syntaps)/nchans)
+ chtaps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+ print "Channelizer Num. Taps = %d (taps per filter = %d)" % (len(chtaps),
+ len(chtaps)/nchans)
+ filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, syntaps)
+ channelizer = blks2.pfb_channelizer_ccf(nchans, chtaps)
+
+ noise_level = 0.01
+ head = gr.head(gr.sizeof_gr_complex, N)
+ noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_level)
+ addnoise = gr.add_cc()
+ snk_synth = gr.vector_sink_c()
+
+ tb = gr.top_block()
+
+ tb.connect(noise, (addnoise,0))
+ tb.connect(filtbank, head, (addnoise, 1))
+ tb.connect(addnoise, channelizer)
+ tb.connect(addnoise, snk_synth)
+
+ snk = list()
+ for i,si in enumerate(sigs):
+ tb.connect(si, fmtx[i], (filtbank, i))
+
+ for i in xrange(nchans):
+ snk.append(gr.vector_sink_c())
+ tb.connect((channelizer, i), snk[i])
+
+ tb.run()
+
+ if 1:
+ channel = 1
+ data = snk[channel].data()[1000:]
+
+ f1 = pylab.figure(1)
+ s1 = f1.add_subplot(1,1,1)
+ s1.plot(data[10000:10200] )
+ s1.set_title(("Output Signal from Channel %d" % channel))
+
+ fftlen = 2048
+ winfunc = scipy.blackman
+ #winfunc = scipy.hamming
+
+ f2 = pylab.figure(2)
+ s2 = f2.add_subplot(1,1,1)
+ s2.psd(data, NFFT=fftlen,
+ Fs = nchans*fs,
+ noverlap=fftlen/4,
+ window = lambda d: d*winfunc(fftlen))
+ s2.set_title(("Output PSD from Channel %d" % channel))
+
+ f3 = pylab.figure(3)
+ s3 = f3.add_subplot(1,1,1)
+ s3.psd(snk_synth.data()[1000:], NFFT=fftlen,
+ Fs = nchans*fs,
+ noverlap=fftlen/4,
+ window = lambda d: d*winfunc(fftlen))
+ s3.set_title("Output of Synthesis Filter")
+
+ pylab.show()
+
+if __name__ == "__main__":
+ main()
diff --git a/gr-gcell/src/Makefile.am b/gr-gcell/src/Makefile.am
index 63dc156b1..60ec6cc73 100644
--- a/gr-gcell/src/Makefile.am
+++ b/gr-gcell/src/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2008,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -22,7 +22,7 @@ include $(top_srcdir)/Makefile.common
SUBDIRS = . examples
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(GCELL_INCLUDES) \
+AM_CPPFLAGS = $(GCELL_INCLUDES) $(STD_DEFINES_AND_INCLUDES) \
$(PYTHON_CPPFLAGS) $(WITH_INCLUDES)
# ----------------------------------------------------------------
diff --git a/gr-noaa/swig/Makefile.am b/gr-noaa/swig/Makefile.am
index 73645e92b..410b23fe6 100644
--- a/gr-noaa/swig/Makefile.am
+++ b/gr-noaa/swig/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -22,10 +22,10 @@
include $(top_srcdir)/Makefile.common
AM_CPPFLAGS = \
+ -I$(top_srcdir)/gr-noaa/lib \
$(STD_DEFINES_AND_INCLUDES) \
$(PYTHON_CPPFLAGS) \
- $(WITH_INCLUDES) \
- -I$(top_srcdir)/gr-noaa/lib
+ $(WITH_INCLUDES)
if PYTHON
# ----------------------------------------------------------------
diff --git a/gr-pager/swig/Makefile.am b/gr-pager/swig/Makefile.am
index 9e1a45219..c59bdb0f2 100644
--- a/gr-pager/swig/Makefile.am
+++ b/gr-pager/swig/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -22,10 +22,10 @@
include $(top_srcdir)/Makefile.common
AM_CPPFLAGS = \
+ -I$(top_srcdir)/gr-pager/lib \
$(STD_DEFINES_AND_INCLUDES) \
$(PYTHON_CPPFLAGS) \
- $(WITH_INCLUDES) \
- -I$(top_srcdir)/gr-pager/lib
+ $(WITH_INCLUDES)
##############################
# SWIG interface and library
diff --git a/gr-qtgui/src/lib/Makefile.am b/gr-qtgui/src/lib/Makefile.am
index 4ba637ad6..1ee3c8e3d 100644
--- a/gr-qtgui/src/lib/Makefile.am
+++ b/gr-qtgui/src/lib/Makefile.am
@@ -21,8 +21,8 @@
include $(top_srcdir)/Makefile.common
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
- $(QT_INCLUDES) -I. $(WITH_INCLUDES)
+AM_CPPFLAGS = -I. $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
+ $(QT_INCLUDES) $(WITH_INCLUDES)
# Only include these files in the build if qtgui passes configure checks
# This is mostly to help make distcheck pass
diff --git a/gr-uhd/grc/.gitignore b/gr-uhd/grc/.gitignore
index c95275d8d..d8ab9bd0c 100644
--- a/gr-uhd/grc/.gitignore
+++ b/gr-uhd/grc/.gitignore
@@ -1,4 +1,4 @@
-/uhd_mimo*.xml
+/uhd_multi*.xml
/uhd_single*.xml
/Makefile
/Makefile.in
diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am
index a19a28f03..d424ca709 100644
--- a/gr-uhd/grc/Makefile.am
+++ b/gr-uhd/grc/Makefile.am
@@ -23,31 +23,37 @@ include $(top_srcdir)/Makefile.common
grcblocksdir = $(grc_blocksdir)
-generated_uhd_mimo_blocks = \
- uhd_mimo_source.xml \
- uhd_mimo_sink.xml
+generated_uhd_multi_usrp_blocks = \
+ uhd_multi_usrp_source.xml \
+ uhd_multi_usrp_sink.xml
generated_uhd_single_usrp_blocks = \
uhd_single_usrp_source.xml \
uhd_single_usrp_sink.xml
BUILT_SOURCES = \
- $(generated_uhd_mimo_blocks) \
+ $(generated_uhd_multi_usrp_blocks) \
$(generated_uhd_single_usrp_blocks)
dist_grcblocks_DATA = \
- $(BUILT_SOURCES) \
+ uhd_block_tree.xml \
+ $(BUILT_SOURCES)
+
+# add the deprecated files
+dist_grcblocks_DATA += \
+ uhd_mimo_source.xml \
+ uhd_mimo_sink.xml \
uhd_simple_source.xml \
uhd_simple_sink.xml
########################################################################
-# Rules for generating the mimo source and sink blocks
+# Rules for generating the source and sink xml wrappers
########################################################################
EXTRA_DIST = \
- $(srcdir)/gen_uhd_mimo_blocks_xml.py \
+ $(srcdir)/gen_uhd_multi_usrp_blocks_xml.py \
$(srcdir)/gen_uhd_single_usrp_blocks_xml.py
-$(generated_uhd_mimo_blocks): $(srcdir)/gen_uhd_mimo_blocks_xml.py
+$(generated_uhd_multi_usrp_blocks): $(srcdir)/gen_uhd_multi_usrp_blocks_xml.py
@echo "generating $@..."
$(PYTHON) $< $@
diff --git a/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py b/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py
deleted file mode 100755
index 7e61563cc..000000000
--- a/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/usr/bin/env python
-"""
-Copyright 2010 Free Software Foundation, Inc.
-
-This file is part of GNU Radio
-
-GNU Radio Companion 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 2
-of the License, or (at your option) any later version.
-
-GNU Radio Companion 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 this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-"""
-
-MAIN_TMPL = """\
-<?xml version="1.0"?>
-<block>
- <name>UHD MIMO $sourk.title()</name>
- <key>uhd_mimo_$(sourk)</key>
- <category>UHD</category>
- <import>from gnuradio import uhd</import>
- <make>uhd.mimo_$(sourk)(\$nchan, \$args, uhd.io_type_t.\$type.type)
-self.\$(id).set_samp_rate_all(\$samp_rate)
-#for $n in range($max_nchan)
-\#if \$nchan() > $n
-self.\$(id).set_subdev_spec($n, \$sd_spec$(n))
-self.\$(id).set_center_freq($n, \$center_freq$(n))
-self.\$(id).set_gain($n, \$gain$(n))
- \#if \$ant$(n)()
-self.\$(id).set_antenna($n, \$ant$(n))
- \#end if
-\#end if
-#end for
-</make>
- <callback>set_samp_rate(\$samp_rate)</callback>
- #for $n in range($max_nchan)
- <callback>set_center_freq($n, \$center_freq$(n))</callback>
- <callback>set_gain($n, \$gain$(n))</callback>
- <callback>set_antenna($n, \$ant$(n))</callback>
- #end for
- <param>
- <name>Input Type</name>
- <key>type</key>
- <type>enum</type>
- <option>
- <name>Complex</name>
- <key>complex</key>
- <opt>type:COMPLEX_FLOAT32</opt>
- <opt>vlen:1</opt>
- </option>
- <option>
- <name>Short</name>
- <key>short</key>
- <opt>type:COMPLEX_INT16</opt>
- <opt>vlen:2</opt>
- </option>
- </param>
- <param>
- <name>Num Channels</name>
- <key>nchan</key>
- <value>2</value>
- <type>int</type>
- #for $n in range(2, $max_nchan+1)
- <option>
- <name>$n Channels</name>
- <key>$n</key>
- </option>
- #end for
- </param>
- <param>
- <name>Args</name>
- <key>args</key>
- <value>addr=192.168.10.2 192.168.20.2</value>
- <type>string</type>
- </param>
- <param>
- <name>Samp Rate (Sps)</name>
- <key>samp_rate</key>
- <value>samp_rate</value>
- <type>real</type>
- </param>
- $params
- <check>$max_nchan >= \$nchan</check>
- <check>\$nchan >= 0</check>
- <$sourk>
- <name>$direction</name>
- <type>\$type</type>
- <vlen>\$type.vlen</vlen>
- <nports>\$nchan</nports>
- </$sourk>
- <doc>
-The UHD $sourk.title() Block:
-
-Args:
-Args is a delimited string used to locate UHD devices on your system. \\
-If left blank, the first UHD device found will be used. \\
-Used args to specify a specfic device. \\
-USRP2 Example: addr=192.168.10.2
-
-Sample rate:
-The sample rate is the number of samples per second input by this block. \\
-The UHD device driver will try its best to match the requested sample rate. \\
-If the requested rate is not possible, the UHD block will print an error at runtime.
-
-Antenna:
-For subdevices/daughterboards with only one antenna, this may be left blank. \\
-Otherwise, the user should specify one of the possible antenna choices. \\
-See the daughterboard application notes for the possible antenna choices.
- </doc>
-</block>
-"""
-
-PARAMS_TMPL = """
- <param>
- <name>Ch$(n): Subdev Spec</name>
- <key>sd_spec$(n)</key>
- <value></value>
- <type>string</type>
- <hide>
- \#if not \$nchan() > $n
- all
- \#elif \$sd_spec$(n)()
- none
- \#else
- part
- \#end if
- </hide>
- </param>
- <param>
- <name>Ch$(n): Center Freq (Hz)</name>
- <key>center_freq$(n)</key>
- <value>0</value>
- <type>real</type>
- <hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
- </param>
- <param>
- <name>Ch$(n): Gain (dB)</name>
- <key>gain$(n)</key>
- <value>0</value>
- <type>real</type>
- <hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
- </param>
- <param>
- <name>Ch$(n): Antenna</name>
- <key>ant$(n)</key>
- <value></value>
- <type>string</type>
- <hide>
- \#if not \$nchan() > $n
- all
- \#elif \$ant$(n)()
- none
- \#else
- part
- \#end if
- </hide>
- </param>
-"""
-
-def parse_tmpl(_tmpl, **kwargs):
- from Cheetah import Template
- return str(Template.Template(_tmpl, kwargs))
-
-max_num_channels = 8
-
-if __name__ == '__main__':
- import sys
- for file in sys.argv[1:]:
- if 'source' in file:
- sourk = 'source'
- direction = 'out'
- elif 'sink' in file:
- sourk = 'sink'
- direction = 'in'
- else: raise Exception, 'is %s a source or sink?'%file
-
- params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)])
- open(file, 'w').write(parse_tmpl(MAIN_TMPL,
- max_nchan=max_num_channels,
- params=params,
- sourk=sourk,
- direction=direction,
- ))
diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
new file mode 100755
index 000000000..112d88159
--- /dev/null
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -0,0 +1,293 @@
+#!/usr/bin/env python
+"""
+Copyright 2010 Free Software Foundation, Inc.
+
+This file is part of GNU Radio
+
+GNU Radio Companion 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 2
+of the License, or (at your option) any later version.
+
+GNU Radio Companion 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 this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+"""
+
+MAIN_TMPL = """\
+<?xml version="1.0"?>
+<block>
+ <name>UHD: Multi USRP $sourk.title()</name>
+ <key>uhd_multi_usrp_$(sourk)</key>
+ <import>from gnuradio import uhd</import>
+ <make>uhd.multi_usrp_$(sourk)(
+ device_addr=\$dev_addr,
+ io_type=uhd.io_type_t.\$type.type,
+ num_channels=\$nchan,
+)
+\#if \$sync()
+_clk_cfg = uhd.clock_config_t()
+_clk_cfg.ref_source = uhd.clock_config_t.REF_SMA
+_clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA
+_clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS
+self.\$(id).set_clock_config(_clk_cfg, uhd.ALL_MBOARDS);
+self.\$(id).set_time_unknown_pps(uhd.time_spec_t())
+\#end if
+#for $m in range($max_mboards)
+\#if \$num_mboards() > $m and \$sd_spec$(m)()
+self.\$(id).set_subdev_spec(\$sd_spec$(m), $m)
+\#end if
+#end for
+self.\$(id).set_samp_rate(\$samp_rate)
+#for $n in range($max_nchan)
+\#if \$nchan() > $n
+self.\$(id).set_center_freq(\$center_freq$(n), $n)
+self.\$(id).set_gain(\$gain$(n), $n)
+ \#if \$ant$(n)()
+self.\$(id).set_antenna(\$ant$(n), $n)
+ \#end if
+ \#if \$bw$(n)()
+self.\$(id).set_bandwidth(\$bw$(n), $n)
+ \#end if
+\#end if
+#end for
+</make>
+ <callback>set_samp_rate(\$samp_rate)</callback>
+ #for $n in range($max_nchan)
+ <callback>set_center_freq(\$center_freq$(n), $n)</callback>
+ <callback>set_gain(\$gain$(n), $n)</callback>
+ <callback>set_antenna(\$ant$(n), $n)</callback>
+ <callback>set_bandwidth(\$bw$(n), $n)</callback>
+ #end for
+ <param>
+ <name>Input Type</name>
+ <key>type</key>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>type:COMPLEX_FLOAT32</opt>
+ <opt>vlen:1</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>type:COMPLEX_INT16</opt>
+ <opt>vlen:2</opt>
+ </option>
+ </param>
+ <param>
+ <name>Device Addr</name>
+ <key>dev_addr</key>
+ <value>addr=192.168.10.2</value>
+ <type>string</type>
+ <hide>
+ \#if \$dev_addr()
+ none
+ \#else
+ part
+ \#end if
+ </hide>
+ </param>
+ <param>
+ <name>Sync</name>
+ <key>sync</key>
+ <value>sync</value>
+ <type>enum</type>
+ <hide>\#if \$sync() then 'none' else 'part'#</hide>
+ <option>
+ <name>unknown PPS</name>
+ <key>sync</key>
+ </option>
+ <option>
+ <name>don't sync</name>
+ <key></key>
+ </option>
+ </param>
+ <param>
+ <name>Num Mboards</name>
+ <key>num_mboards</key>
+ <value>2</value>
+ <type>int</type>
+ #for $m in range(1, $max_mboards+1)
+ <option>
+ <name>$(m)</name>
+ <key>$m</key>
+ </option>
+ #end for
+ </param>
+ #for $m in range($max_mboards)
+ <param>
+ <name>Mb$(m): Subdev Spec</name>
+ <key>sd_spec$(m)</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ \#if not \$num_mboards() > $m
+ all
+ \#elif \$sd_spec$(m)()
+ none
+ \#else
+ part
+ \#end if
+ </hide>
+ </param>
+ #end for
+ <param>
+ <name>Num Channels</name>
+ <key>nchan</key>
+ <value>2</value>
+ <type>int</type>
+ #for $n in range(1, $max_nchan+1)
+ <option>
+ <name>$(n)</name>
+ <key>$n</key>
+ </option>
+ #end for
+ </param>
+ <param>
+ <name>Samp Rate (Sps)</name>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ <type>real</type>
+ </param>
+ $params
+ <check>$max_nchan >= \$nchan</check>
+ <check>\$nchan > 0</check>
+ <check>$max_mboards >= \$num_mboards</check>
+ <check>\$num_mboards > 0</check>
+ <check>\$nchan >= \$num_mboards</check>
+ <$sourk>
+ <name>$direction</name>
+ <type>\$type</type>
+ <vlen>\$type.vlen</vlen>
+ <nports>\$nchan</nports>
+ </$sourk>
+ <doc>
+The UHD Multi USRP $sourk.title() Block:
+
+Device Address:
+The device address is a delimited string used to locate UHD devices on your system. \\
+If left blank, the first UHD device found will be used. \\
+Used args to specify a specfic device.
+USRP2 Example: addr=192.168.10.2 192.168.10.3
+
+Num Motherboards:
+Selects the number of USRP motherboards in this multi-USRP configuration.
+
+Subdevice specification:
+Each motherboard should have its own subdevice specification \\
+and all subdevice specifications should be the same length. \\
+Select the subdevice or subdevices for each channel using a markup string. \\
+The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\
+If left blank, the UHD will try to select the first subdevice on your system. \\
+See the application notes for further details.
+Single channel example: :AB
+Dual channel example: :A :B
+
+Num Channels:
+Selects the total number of channels in this multi-USRP configuration.
+Ex: 4 motherboards with 2 channels per board = 8 channels total
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \\
+The UHD device driver will try its best to match the requested sample rate. \\
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Center frequency:
+The center frequency is the overall frequency of the RF chain. \\
+For greater control of how the UHD tunes elements in the RF chain, \\
+pass a tune_request_t object rather than a simple target frequency.
+Tuning with an LO offset example: uhd.tune_request_t(freq, lo_off)
+
+Antenna:
+For subdevices with only one antenna, this may be left blank. \\
+Otherwise, the user should specify one of the possible antenna choices. \\
+See the daughterboard application notes for the possible antenna choices.
+
+Bandwidth:
+To use the default bandwidth filter setting, this should be zero. \\
+Only certain subdevices have configurable bandwidth filters. \\
+See the daughterboard application notes for possible configurations.
+ </doc>
+</block>
+"""
+
+PARAMS_TMPL = """
+ <param>
+ <name>Ch$(n): Center Freq (Hz)</name>
+ <key>center_freq$(n)</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch$(n): Gain (dB)</name>
+ <key>gain$(n)</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch$(n): Antenna</name>
+ <key>ant$(n)</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ \#if not \$nchan() > $n
+ all
+ \#elif \$ant$(n)()
+ none
+ \#else
+ part
+ \#end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch$(n): Bandwidth (Hz)</name>
+ <key>bw$(n)</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>
+ \#if not \$nchan() > $n
+ all
+ \#elif \$bw$(n)()
+ none
+ \#else
+ part
+ \#end if
+ </hide>
+ </param>
+"""
+
+def parse_tmpl(_tmpl, **kwargs):
+ from Cheetah import Template
+ return str(Template.Template(_tmpl, kwargs))
+
+max_num_mboards = 4
+max_num_channels = max_num_mboards*4
+
+if __name__ == '__main__':
+ import sys
+ for file in sys.argv[1:]:
+ if 'source' in file:
+ sourk = 'source'
+ direction = 'out'
+ elif 'sink' in file:
+ sourk = 'sink'
+ direction = 'in'
+ else: raise Exception, 'is %s a source or sink?'%file
+
+ params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)])
+ open(file, 'w').write(parse_tmpl(MAIN_TMPL,
+ max_nchan=max_num_channels,
+ max_mboards=max_num_mboards,
+ params=params,
+ sourk=sourk,
+ direction=direction,
+ ))
diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 5b3cb5b5a..7337c71d7 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -24,10 +24,22 @@ MAIN_TMPL = """\
<block>
<name>UHD: Single USRP $sourk.title()</name>
<key>uhd_single_usrp_$(sourk)</key>
- <category>UHD</category>
<import>from gnuradio import uhd</import>
- <make>uhd.single_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan)
+ <make>uhd.single_usrp_$(sourk)(
+ device_addr=\$dev_addr,
+ io_type=uhd.io_type_t.\$type.type,
+ num_channels=\$nchan,
+)
+\#if \$ref_clk()
+_clk_cfg = uhd.clock_config_t()
+_clk_cfg.ref_source = uhd.clock_config_t.REF_SMA
+_clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA
+_clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS
+self.\$(id).set_clock_config(_clk_cfg);
+\#end if
+\#if \$sd_spec()
self.\$(id).set_subdev_spec(\$sd_spec)
+\#end if
self.\$(id).set_samp_rate(\$samp_rate)
#for $n in range($max_nchan)
\#if \$nchan() > $n
@@ -36,6 +48,9 @@ self.\$(id).set_gain(\$gain$(n), $n)
\#if \$ant$(n)()
self.\$(id).set_antenna(\$ant$(n), $n)
\#end if
+ \#if \$bw$(n)()
+self.\$(id).set_bandwidth(\$bw$(n), $n)
+ \#end if
\#end if
#end for
</make>
@@ -44,6 +59,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
<callback>set_center_freq(\$center_freq$(n), $n)</callback>
<callback>set_gain(\$gain$(n), $n)</callback>
<callback>set_antenna(\$ant$(n), $n)</callback>
+ <callback>set_bandwidth(\$bw$(n), $n)</callback>
#end for
<param>
<name>Input Type</name>
@@ -95,6 +111,21 @@ self.\$(id).set_antenna(\$ant$(n), $n)
</hide>
</param>
<param>
+ <name>Ref Clock</name>
+ <key>ref_clk</key>
+ <value></value>
+ <type>enum</type>
+ <hide>\#if \$ref_clk() then 'none' else 'part'#</hide>
+ <option>
+ <name>External</name>
+ <key>ext</key>
+ </option>
+ <option>
+ <name>Internal</name>
+ <key></key>
+ </option>
+ </param>
+ <param>
<name>Subdev Spec</name>
<key>sd_spec</key>
<value></value>
@@ -115,7 +146,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
</param>
$params
<check>$max_nchan >= \$nchan</check>
- <check>\$nchan >= 0</check>
+ <check>\$nchan > 0</check>
<check>(len((\$sd_spec).split()) or 1) == \$nchan</check>
<$sourk>
<name>$direction</name>
@@ -133,11 +164,6 @@ Used args to specify a specfic device.
USRP2 Example: addr=192.168.10.2
USRP1 Example: serial=12345678
-Sample rate:
-The sample rate is the number of samples per second input by this block. \\
-The UHD device driver will try its best to match the requested sample rate. \\
-If the requested rate is not possible, the UHD block will print an error at runtime.
-
Subdevice specification:
Select the subdevice or subdevices for each channel using a markup string. \\
The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\
@@ -146,10 +172,26 @@ See the application notes for further details.
Single channel example: A:AB
Dual channel example: A:AB B:0
+Sample rate:
+The sample rate is the number of samples per second input by this block. \\
+The UHD device driver will try its best to match the requested sample rate. \\
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Center frequency:
+The center frequency is the overall frequency of the RF chain. \\
+For greater control of how the UHD tunes elements in the RF chain, \\
+pass a tune_request_t object rather than a simple target frequency.
+Tuning with an LO offset example: uhd.tune_request_t(freq, lo_off)
+
Antenna:
-For subdevices/daughterboards with only one antenna, this may be left blank. \\
+For subdevices with only one antenna, this may be left blank. \\
Otherwise, the user should specify one of the possible antenna choices. \\
See the daughterboard application notes for the possible antenna choices.
+
+Bandwidth:
+To use the default bandwidth filter setting, this should be zero. \\
+Only certain subdevices have configurable bandwidth filters. \\
+See the daughterboard application notes for possible configurations.
</doc>
</block>
"""
@@ -184,6 +226,21 @@ PARAMS_TMPL = """
\#end if
</hide>
</param>
+ <param>
+ <name>Ch$(n): Bandwidth (Hz)</name>
+ <key>bw$(n)</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>
+ \#if not \$nchan() > $n
+ all
+ \#elif \$bw$(n)()
+ none
+ \#else
+ part
+ \#end if
+ </hide>
+ </param>
"""
def parse_tmpl(_tmpl, **kwargs):
diff --git a/gr-uhd/grc/uhd_block_tree.xml b/gr-uhd/grc/uhd_block_tree.xml
new file mode 100644
index 000000000..e8c4f069d
--- /dev/null
+++ b/gr-uhd/grc/uhd_block_tree.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Block Tree for uhd blocks.
+###################################################
+ -->
+<cat>
+ <name></name> <!-- Blank for Root Name -->
+ <cat>
+ <name>UHD</name>
+ <block>uhd_single_usrp_source</block>
+ <block>uhd_single_usrp_sink</block>
+ <block>uhd_multi_usrp_source</block>
+ <block>uhd_multi_usrp_sink</block>
+ </cat>
+ <cat>
+ <name>UHD (DEPRECATED)</name>
+ <block>uhd_simple_source</block>
+ <block>uhd_simple_sink</block>
+ <block>uhd_mimo_source</block>
+ <block>uhd_mimo_sink</block>
+ </cat>
+</cat>
diff --git a/gr-uhd/grc/uhd_mimo_sink.xml b/gr-uhd/grc/uhd_mimo_sink.xml
new file mode 100644
index 000000000..13865c913
--- /dev/null
+++ b/gr-uhd/grc/uhd_mimo_sink.xml
@@ -0,0 +1,549 @@
+<?xml version="1.0"?>
+<block>
+ <name>UHD MIMO Sink (DEPRECATED)</name>
+ <key>uhd_mimo_sink</key>
+ <import>from gnuradio import uhd</import>
+ <make>uhd.mimo_sink($nchan, $args, uhd.io_type_t.$type.type)
+self.$(id).set_samp_rate_all($samp_rate)
+#if $nchan() > 0
+self.$(id).set_subdev_spec(0, $sd_spec0)
+self.$(id).set_center_freq(0, $center_freq0)
+self.$(id).set_gain(0, $gain0)
+ #if $ant0()
+self.$(id).set_antenna(0, $ant0)
+ #end if
+#end if
+#if $nchan() > 1
+self.$(id).set_subdev_spec(1, $sd_spec1)
+self.$(id).set_center_freq(1, $center_freq1)
+self.$(id).set_gain(1, $gain1)
+ #if $ant1()
+self.$(id).set_antenna(1, $ant1)
+ #end if
+#end if
+#if $nchan() > 2
+self.$(id).set_subdev_spec(2, $sd_spec2)
+self.$(id).set_center_freq(2, $center_freq2)
+self.$(id).set_gain(2, $gain2)
+ #if $ant2()
+self.$(id).set_antenna(2, $ant2)
+ #end if
+#end if
+#if $nchan() > 3
+self.$(id).set_subdev_spec(3, $sd_spec3)
+self.$(id).set_center_freq(3, $center_freq3)
+self.$(id).set_gain(3, $gain3)
+ #if $ant3()
+self.$(id).set_antenna(3, $ant3)
+ #end if
+#end if
+#if $nchan() > 4
+self.$(id).set_subdev_spec(4, $sd_spec4)
+self.$(id).set_center_freq(4, $center_freq4)
+self.$(id).set_gain(4, $gain4)
+ #if $ant4()
+self.$(id).set_antenna(4, $ant4)
+ #end if
+#end if
+#if $nchan() > 5
+self.$(id).set_subdev_spec(5, $sd_spec5)
+self.$(id).set_center_freq(5, $center_freq5)
+self.$(id).set_gain(5, $gain5)
+ #if $ant5()
+self.$(id).set_antenna(5, $ant5)
+ #end if
+#end if
+#if $nchan() > 6
+self.$(id).set_subdev_spec(6, $sd_spec6)
+self.$(id).set_center_freq(6, $center_freq6)
+self.$(id).set_gain(6, $gain6)
+ #if $ant6()
+self.$(id).set_antenna(6, $ant6)
+ #end if
+#end if
+#if $nchan() > 7
+self.$(id).set_subdev_spec(7, $sd_spec7)
+self.$(id).set_center_freq(7, $center_freq7)
+self.$(id).set_gain(7, $gain7)
+ #if $ant7()
+self.$(id).set_antenna(7, $ant7)
+ #end if
+#end if
+</make>
+ <callback>set_samp_rate($samp_rate)</callback>
+ <callback>set_center_freq(0, $center_freq0)</callback>
+ <callback>set_gain(0, $gain0)</callback>
+ <callback>set_antenna(0, $ant0)</callback>
+ <callback>set_center_freq(1, $center_freq1)</callback>
+ <callback>set_gain(1, $gain1)</callback>
+ <callback>set_antenna(1, $ant1)</callback>
+ <callback>set_center_freq(2, $center_freq2)</callback>
+ <callback>set_gain(2, $gain2)</callback>
+ <callback>set_antenna(2, $ant2)</callback>
+ <callback>set_center_freq(3, $center_freq3)</callback>
+ <callback>set_gain(3, $gain3)</callback>
+ <callback>set_antenna(3, $ant3)</callback>
+ <callback>set_center_freq(4, $center_freq4)</callback>
+ <callback>set_gain(4, $gain4)</callback>
+ <callback>set_antenna(4, $ant4)</callback>
+ <callback>set_center_freq(5, $center_freq5)</callback>
+ <callback>set_gain(5, $gain5)</callback>
+ <callback>set_antenna(5, $ant5)</callback>
+ <callback>set_center_freq(6, $center_freq6)</callback>
+ <callback>set_gain(6, $gain6)</callback>
+ <callback>set_antenna(6, $ant6)</callback>
+ <callback>set_center_freq(7, $center_freq7)</callback>
+ <callback>set_gain(7, $gain7)</callback>
+ <callback>set_antenna(7, $ant7)</callback>
+ <param>
+ <name>Input Type</name>
+ <key>type</key>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>type:COMPLEX_FLOAT32</opt>
+ <opt>vlen:1</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>type:COMPLEX_INT16</opt>
+ <opt>vlen:2</opt>
+ </option>
+ </param>
+ <param>
+ <name>Num Channels</name>
+ <key>nchan</key>
+ <value>2</value>
+ <type>int</type>
+ <option>
+ <name>2 Channels</name>
+ <key>2</key>
+ </option>
+ <option>
+ <name>3 Channels</name>
+ <key>3</key>
+ </option>
+ <option>
+ <name>4 Channels</name>
+ <key>4</key>
+ </option>
+ <option>
+ <name>5 Channels</name>
+ <key>5</key>
+ </option>
+ <option>
+ <name>6 Channels</name>
+ <key>6</key>
+ </option>
+ <option>
+ <name>7 Channels</name>
+ <key>7</key>
+ </option>
+ <option>
+ <name>8 Channels</name>
+ <key>8</key>
+ </option>
+ </param>
+ <param>
+ <name>Args</name>
+ <key>args</key>
+ <value>addr=192.168.10.2 192.168.20.2</value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>Samp Rate (Sps)</name>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ <type>real</type>
+ </param>
+
+ <param>
+ <name>Ch0: Subdev Spec</name>
+ <key>sd_spec0</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 0
+ all
+ #elif $sd_spec0()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch0: Center Freq (Hz)</name>
+ <key>center_freq0</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch0: Gain (dB)</name>
+ <key>gain0</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch0: Antenna</name>
+ <key>ant0</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 0
+ all
+ #elif $ant0()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch1: Subdev Spec</name>
+ <key>sd_spec1</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 1
+ all
+ #elif $sd_spec1()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch1: Center Freq (Hz)</name>
+ <key>center_freq1</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch1: Gain (dB)</name>
+ <key>gain1</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch1: Antenna</name>
+ <key>ant1</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 1
+ all
+ #elif $ant1()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch2: Subdev Spec</name>
+ <key>sd_spec2</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 2
+ all
+ #elif $sd_spec2()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch2: Center Freq (Hz)</name>
+ <key>center_freq2</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch2: Gain (dB)</name>
+ <key>gain2</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch2: Antenna</name>
+ <key>ant2</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 2
+ all
+ #elif $ant2()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch3: Subdev Spec</name>
+ <key>sd_spec3</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 3
+ all
+ #elif $sd_spec3()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch3: Center Freq (Hz)</name>
+ <key>center_freq3</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch3: Gain (dB)</name>
+ <key>gain3</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch3: Antenna</name>
+ <key>ant3</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 3
+ all
+ #elif $ant3()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch4: Subdev Spec</name>
+ <key>sd_spec4</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 4
+ all
+ #elif $sd_spec4()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch4: Center Freq (Hz)</name>
+ <key>center_freq4</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch4: Gain (dB)</name>
+ <key>gain4</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch4: Antenna</name>
+ <key>ant4</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 4
+ all
+ #elif $ant4()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch5: Subdev Spec</name>
+ <key>sd_spec5</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 5
+ all
+ #elif $sd_spec5()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch5: Center Freq (Hz)</name>
+ <key>center_freq5</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch5: Gain (dB)</name>
+ <key>gain5</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch5: Antenna</name>
+ <key>ant5</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 5
+ all
+ #elif $ant5()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch6: Subdev Spec</name>
+ <key>sd_spec6</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 6
+ all
+ #elif $sd_spec6()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch6: Center Freq (Hz)</name>
+ <key>center_freq6</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch6: Gain (dB)</name>
+ <key>gain6</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch6: Antenna</name>
+ <key>ant6</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 6
+ all
+ #elif $ant6()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch7: Subdev Spec</name>
+ <key>sd_spec7</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 7
+ all
+ #elif $sd_spec7()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch7: Center Freq (Hz)</name>
+ <key>center_freq7</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch7: Gain (dB)</name>
+ <key>gain7</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch7: Antenna</name>
+ <key>ant7</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 7
+ all
+ #elif $ant7()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <check>8 >= $nchan</check>
+ <check>$nchan >= 0</check>
+ <sink>
+ <name>in</name>
+ <type>$type</type>
+ <vlen>$type.vlen</vlen>
+ <nports>$nchan</nports>
+ </sink>
+ <doc>
+The UHD Sink Block:
+
+Args:
+Args is a delimited string used to locate UHD devices on your system. \
+If left blank, the first UHD device found will be used. \
+Used args to specify a specfic device. \
+USRP2 Example: addr=192.168.10.2
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \
+The UHD device driver will try its best to match the requested sample rate. \
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Antenna:
+For subdevices/daughterboards with only one antenna, this may be left blank. \
+Otherwise, the user should specify one of the possible antenna choices. \
+See the daughterboard application notes for the possible antenna choices.
+ </doc>
+</block>
diff --git a/gr-uhd/grc/uhd_mimo_source.xml b/gr-uhd/grc/uhd_mimo_source.xml
new file mode 100644
index 000000000..6167838b0
--- /dev/null
+++ b/gr-uhd/grc/uhd_mimo_source.xml
@@ -0,0 +1,549 @@
+<?xml version="1.0"?>
+<block>
+ <name>UHD MIMO Source (DEPRECATED)</name>
+ <key>uhd_mimo_source</key>
+ <import>from gnuradio import uhd</import>
+ <make>uhd.mimo_source($nchan, $args, uhd.io_type_t.$type.type)
+self.$(id).set_samp_rate_all($samp_rate)
+#if $nchan() > 0
+self.$(id).set_subdev_spec(0, $sd_spec0)
+self.$(id).set_center_freq(0, $center_freq0)
+self.$(id).set_gain(0, $gain0)
+ #if $ant0()
+self.$(id).set_antenna(0, $ant0)
+ #end if
+#end if
+#if $nchan() > 1
+self.$(id).set_subdev_spec(1, $sd_spec1)
+self.$(id).set_center_freq(1, $center_freq1)
+self.$(id).set_gain(1, $gain1)
+ #if $ant1()
+self.$(id).set_antenna(1, $ant1)
+ #end if
+#end if
+#if $nchan() > 2
+self.$(id).set_subdev_spec(2, $sd_spec2)
+self.$(id).set_center_freq(2, $center_freq2)
+self.$(id).set_gain(2, $gain2)
+ #if $ant2()
+self.$(id).set_antenna(2, $ant2)
+ #end if
+#end if
+#if $nchan() > 3
+self.$(id).set_subdev_spec(3, $sd_spec3)
+self.$(id).set_center_freq(3, $center_freq3)
+self.$(id).set_gain(3, $gain3)
+ #if $ant3()
+self.$(id).set_antenna(3, $ant3)
+ #end if
+#end if
+#if $nchan() > 4
+self.$(id).set_subdev_spec(4, $sd_spec4)
+self.$(id).set_center_freq(4, $center_freq4)
+self.$(id).set_gain(4, $gain4)
+ #if $ant4()
+self.$(id).set_antenna(4, $ant4)
+ #end if
+#end if
+#if $nchan() > 5
+self.$(id).set_subdev_spec(5, $sd_spec5)
+self.$(id).set_center_freq(5, $center_freq5)
+self.$(id).set_gain(5, $gain5)
+ #if $ant5()
+self.$(id).set_antenna(5, $ant5)
+ #end if
+#end if
+#if $nchan() > 6
+self.$(id).set_subdev_spec(6, $sd_spec6)
+self.$(id).set_center_freq(6, $center_freq6)
+self.$(id).set_gain(6, $gain6)
+ #if $ant6()
+self.$(id).set_antenna(6, $ant6)
+ #end if
+#end if
+#if $nchan() > 7
+self.$(id).set_subdev_spec(7, $sd_spec7)
+self.$(id).set_center_freq(7, $center_freq7)
+self.$(id).set_gain(7, $gain7)
+ #if $ant7()
+self.$(id).set_antenna(7, $ant7)
+ #end if
+#end if
+</make>
+ <callback>set_samp_rate($samp_rate)</callback>
+ <callback>set_center_freq(0, $center_freq0)</callback>
+ <callback>set_gain(0, $gain0)</callback>
+ <callback>set_antenna(0, $ant0)</callback>
+ <callback>set_center_freq(1, $center_freq1)</callback>
+ <callback>set_gain(1, $gain1)</callback>
+ <callback>set_antenna(1, $ant1)</callback>
+ <callback>set_center_freq(2, $center_freq2)</callback>
+ <callback>set_gain(2, $gain2)</callback>
+ <callback>set_antenna(2, $ant2)</callback>
+ <callback>set_center_freq(3, $center_freq3)</callback>
+ <callback>set_gain(3, $gain3)</callback>
+ <callback>set_antenna(3, $ant3)</callback>
+ <callback>set_center_freq(4, $center_freq4)</callback>
+ <callback>set_gain(4, $gain4)</callback>
+ <callback>set_antenna(4, $ant4)</callback>
+ <callback>set_center_freq(5, $center_freq5)</callback>
+ <callback>set_gain(5, $gain5)</callback>
+ <callback>set_antenna(5, $ant5)</callback>
+ <callback>set_center_freq(6, $center_freq6)</callback>
+ <callback>set_gain(6, $gain6)</callback>
+ <callback>set_antenna(6, $ant6)</callback>
+ <callback>set_center_freq(7, $center_freq7)</callback>
+ <callback>set_gain(7, $gain7)</callback>
+ <callback>set_antenna(7, $ant7)</callback>
+ <param>
+ <name>Input Type</name>
+ <key>type</key>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>type:COMPLEX_FLOAT32</opt>
+ <opt>vlen:1</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>type:COMPLEX_INT16</opt>
+ <opt>vlen:2</opt>
+ </option>
+ </param>
+ <param>
+ <name>Num Channels</name>
+ <key>nchan</key>
+ <value>2</value>
+ <type>int</type>
+ <option>
+ <name>2 Channels</name>
+ <key>2</key>
+ </option>
+ <option>
+ <name>3 Channels</name>
+ <key>3</key>
+ </option>
+ <option>
+ <name>4 Channels</name>
+ <key>4</key>
+ </option>
+ <option>
+ <name>5 Channels</name>
+ <key>5</key>
+ </option>
+ <option>
+ <name>6 Channels</name>
+ <key>6</key>
+ </option>
+ <option>
+ <name>7 Channels</name>
+ <key>7</key>
+ </option>
+ <option>
+ <name>8 Channels</name>
+ <key>8</key>
+ </option>
+ </param>
+ <param>
+ <name>Args</name>
+ <key>args</key>
+ <value>addr=192.168.10.2 192.168.20.2</value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>Samp Rate (Sps)</name>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ <type>real</type>
+ </param>
+
+ <param>
+ <name>Ch0: Subdev Spec</name>
+ <key>sd_spec0</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 0
+ all
+ #elif $sd_spec0()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch0: Center Freq (Hz)</name>
+ <key>center_freq0</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch0: Gain (dB)</name>
+ <key>gain0</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch0: Antenna</name>
+ <key>ant0</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 0
+ all
+ #elif $ant0()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch1: Subdev Spec</name>
+ <key>sd_spec1</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 1
+ all
+ #elif $sd_spec1()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch1: Center Freq (Hz)</name>
+ <key>center_freq1</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch1: Gain (dB)</name>
+ <key>gain1</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch1: Antenna</name>
+ <key>ant1</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 1
+ all
+ #elif $ant1()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch2: Subdev Spec</name>
+ <key>sd_spec2</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 2
+ all
+ #elif $sd_spec2()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch2: Center Freq (Hz)</name>
+ <key>center_freq2</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch2: Gain (dB)</name>
+ <key>gain2</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch2: Antenna</name>
+ <key>ant2</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 2
+ all
+ #elif $ant2()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch3: Subdev Spec</name>
+ <key>sd_spec3</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 3
+ all
+ #elif $sd_spec3()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch3: Center Freq (Hz)</name>
+ <key>center_freq3</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch3: Gain (dB)</name>
+ <key>gain3</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch3: Antenna</name>
+ <key>ant3</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 3
+ all
+ #elif $ant3()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch4: Subdev Spec</name>
+ <key>sd_spec4</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 4
+ all
+ #elif $sd_spec4()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch4: Center Freq (Hz)</name>
+ <key>center_freq4</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch4: Gain (dB)</name>
+ <key>gain4</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch4: Antenna</name>
+ <key>ant4</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 4
+ all
+ #elif $ant4()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch5: Subdev Spec</name>
+ <key>sd_spec5</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 5
+ all
+ #elif $sd_spec5()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch5: Center Freq (Hz)</name>
+ <key>center_freq5</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch5: Gain (dB)</name>
+ <key>gain5</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch5: Antenna</name>
+ <key>ant5</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 5
+ all
+ #elif $ant5()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch6: Subdev Spec</name>
+ <key>sd_spec6</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 6
+ all
+ #elif $sd_spec6()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch6: Center Freq (Hz)</name>
+ <key>center_freq6</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch6: Gain (dB)</name>
+ <key>gain6</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch6: Antenna</name>
+ <key>ant6</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 6
+ all
+ #elif $ant6()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <param>
+ <name>Ch7: Subdev Spec</name>
+ <key>sd_spec7</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 7
+ all
+ #elif $sd_spec7()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+ <param>
+ <name>Ch7: Center Freq (Hz)</name>
+ <key>center_freq7</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch7: Gain (dB)</name>
+ <key>gain7</key>
+ <value>0</value>
+ <type>real</type>
+ <hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Ch7: Antenna</name>
+ <key>ant7</key>
+ <value></value>
+ <type>string</type>
+ <hide>
+ #if not $nchan() > 7
+ all
+ #elif $ant7()
+ none
+ #else
+ part
+ #end if
+ </hide>
+ </param>
+
+ <check>8 >= $nchan</check>
+ <check>$nchan >= 0</check>
+ <source>
+ <name>out</name>
+ <type>$type</type>
+ <vlen>$type.vlen</vlen>
+ <nports>$nchan</nports>
+ </source>
+ <doc>
+The UHD Source Block:
+
+Args:
+Args is a delimited string used to locate UHD devices on your system. \
+If left blank, the first UHD device found will be used. \
+Used args to specify a specfic device. \
+USRP2 Example: addr=192.168.10.2
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \
+The UHD device driver will try its best to match the requested sample rate. \
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Antenna:
+For subdevices/daughterboards with only one antenna, this may be left blank. \
+Otherwise, the user should specify one of the possible antenna choices. \
+See the daughterboard application notes for the possible antenna choices.
+ </doc>
+</block>
diff --git a/gr-uhd/grc/uhd_simple_sink.xml b/gr-uhd/grc/uhd_simple_sink.xml
index 66dc5bf14..ee6051432 100644
--- a/gr-uhd/grc/uhd_simple_sink.xml
+++ b/gr-uhd/grc/uhd_simple_sink.xml
@@ -7,7 +7,6 @@
<block>
<name>UHD Simple Sink (DEPRECATED)</name>
<key>uhd_simple_sink</key>
- <category>UHD</category>
<import>from gnuradio import uhd</import>
<make>uhd.simple_sink($args, uhd.io_type_t.$type.type)
self.$(id).set_subdev_spec($sd_spec)
diff --git a/gr-uhd/grc/uhd_simple_source.xml b/gr-uhd/grc/uhd_simple_source.xml
index 00c60f41d..825981d66 100644
--- a/gr-uhd/grc/uhd_simple_source.xml
+++ b/gr-uhd/grc/uhd_simple_source.xml
@@ -7,7 +7,6 @@
<block>
<name>UHD Simple Source (DEPRECATED)</name>
<key>uhd_simple_source</key>
- <category>UHD</category>
<import>from gnuradio import uhd</import>
<make>uhd.simple_source($args, uhd.io_type_t.$type.type)
self.$(id).set_subdev_spec($sd_spec)
diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am
index 1260201a5..b4b1abfc6 100644
--- a/gr-uhd/lib/Makefile.am
+++ b/gr-uhd/lib/Makefile.am
@@ -29,13 +29,17 @@ AM_CPPFLAGS = \
lib_LTLIBRARIES = libgnuradio-uhd.la
libgnuradio_uhd_la_SOURCES = \
- utils.cc \
+ uhd_multi_usrp_source.cc \
+ uhd_multi_usrp_sink.cc \
+ uhd_single_usrp_source.cc \
+ uhd_single_usrp_sink.cc
+
+# add the deprecated sources
+libgnuradio_uhd_la_SOURCES += \
uhd_mimo_source.cc \
uhd_mimo_sink.cc \
uhd_simple_source.cc \
- uhd_simple_sink.cc \
- uhd_single_usrp_source.cc \
- uhd_single_usrp_sink.cc
+ uhd_simple_sink.cc
libgnuradio_uhd_la_LIBADD = \
$(GNURADIO_CORE_LA) \
@@ -44,12 +48,9 @@ libgnuradio_uhd_la_LIBADD = \
libgnuradio_uhd_la_LDFLAGS = $(LTVERSIONFLAGS)
grinclude_HEADERS = \
- uhd_mimo_source.h \
- uhd_mimo_sink.h \
- uhd_simple_source.h \
- uhd_simple_sink.h \
+ uhd_multi_usrp_source.h \
+ uhd_multi_usrp_sink.h \
uhd_single_usrp_source.h \
uhd_single_usrp_sink.h
-noinst_HEADERS = \
- utils.h
+noinst_HEADERS =
diff --git a/gr-uhd/lib/uhd_mimo_sink.cc b/gr-uhd/lib/uhd_mimo_sink.cc
index 0a2ce1b0a..03d310b1e 100644
--- a/gr-uhd/lib/uhd_mimo_sink.cc
+++ b/gr-uhd/lib/uhd_mimo_sink.cc
@@ -23,7 +23,7 @@
#include <uhd_mimo_sink.h>
#include <gr_io_signature.h>
#include <stdexcept>
-#include "utils.h"
+//#include "utils.h"
/***********************************************************************
* UHD Sink
@@ -59,7 +59,7 @@ public:
void set_samp_rate_all(double rate){
_dev->set_tx_rate_all(rate);
- do_samp_rate_error_message(rate, get_samp_rate_all(), "TX");
+ //do_samp_rate_error_message(rate, get_samp_rate_all(), "TX");
}
double get_samp_rate_all(void){
@@ -68,7 +68,7 @@ public:
uhd::tune_result_t set_center_freq(size_t chan, double freq){
uhd::tune_result_t tr = _dev->set_tx_freq(chan, freq);
- do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX");
+ //do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX");
return tr;
}
diff --git a/gr-uhd/lib/uhd_mimo_sink.h b/gr-uhd/lib/uhd_mimo_sink.h
index 46679d973..28a530b60 100644
--- a/gr-uhd/lib/uhd_mimo_sink.h
+++ b/gr-uhd/lib/uhd_mimo_sink.h
@@ -34,7 +34,10 @@ boost::shared_ptr<uhd_mimo_sink> uhd_make_mimo_sink(
const uhd::io_type_t::tid_t &type
);
-class uhd_mimo_sink : public gr_sync_block{
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
+class UHD_DEPRECATED uhd_mimo_sink : public gr_sync_block{
public:
/*!
diff --git a/gr-uhd/lib/uhd_mimo_source.cc b/gr-uhd/lib/uhd_mimo_source.cc
index 62157142d..abd70ba36 100644
--- a/gr-uhd/lib/uhd_mimo_source.cc
+++ b/gr-uhd/lib/uhd_mimo_source.cc
@@ -23,7 +23,7 @@
#include <uhd_mimo_source.h>
#include <gr_io_signature.h>
#include <stdexcept>
-#include "utils.h"
+//#include "utils.h"
/***********************************************************************
* UHD Source
@@ -59,7 +59,7 @@ public:
void set_samp_rate_all(double rate){
_dev->set_rx_rate_all(rate);
- do_samp_rate_error_message(rate, get_samp_rate_all(), "RX");
+ //do_samp_rate_error_message(rate, get_samp_rate_all(), "RX");
}
double get_samp_rate_all(void){
@@ -68,7 +68,7 @@ public:
uhd::tune_result_t set_center_freq(size_t chan, double freq){
uhd::tune_result_t tr = _dev->set_rx_freq(chan, freq);
- do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX");
+ //do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX");
return tr;
}
diff --git a/gr-uhd/lib/uhd_mimo_source.h b/gr-uhd/lib/uhd_mimo_source.h
index fbd7f2c42..dc2927598 100644
--- a/gr-uhd/lib/uhd_mimo_source.h
+++ b/gr-uhd/lib/uhd_mimo_source.h
@@ -34,7 +34,10 @@ boost::shared_ptr<uhd_mimo_source> uhd_make_mimo_source(
const uhd::io_type_t::tid_t &type
);
-class uhd_mimo_source : public gr_sync_block{
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
+class UHD_DEPRECATED uhd_mimo_source : public gr_sync_block{
public:
/*!
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
new file mode 100644
index 000000000..ee16e2928
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2010 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.
+ */
+
+#include <uhd_multi_usrp_sink.h>
+#include <gr_io_signature.h>
+#include <stdexcept>
+
+/***********************************************************************
+ * UHD Multi USRP Sink
+ **********************************************************************/
+uhd_multi_usrp_sink::uhd_multi_usrp_sink(gr_io_signature_sptr sig)
+:gr_sync_block("uhd multi usrp sink", sig, gr_make_io_signature(0, 0, 0)){
+ /* NOP */
+}
+
+/***********************************************************************
+ * UHD Multi USRP Sink Impl
+ **********************************************************************/
+class uhd_multi_usrp_sink_impl : public uhd_multi_usrp_sink{
+public:
+ uhd_multi_usrp_sink_impl(
+ const std::string &device_addr,
+ const uhd::io_type_t &io_type,
+ size_t num_channels
+ ):
+ uhd_multi_usrp_sink(gr_make_io_signature(
+ num_channels, num_channels, io_type.size
+ )),
+ _type(io_type),
+ _nchan(num_channels)
+ {
+ _dev = uhd::usrp::multi_usrp::make(device_addr);
+ }
+
+ void set_subdev_spec(const std::string &spec, size_t mboard){
+ return _dev->set_tx_subdev_spec(spec, mboard);
+ }
+
+ void set_samp_rate(double rate){
+ _dev->set_tx_rate(rate);
+ }
+
+ double get_samp_rate(void){
+ return _dev->get_tx_rate();
+ }
+
+ uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ){
+ return _dev->set_tx_freq(tune_request, chan);
+ }
+
+ uhd::freq_range_t get_freq_range(size_t chan){
+ return _dev->get_tx_freq_range(chan);
+ }
+
+ void set_gain(float gain, size_t chan){
+ return _dev->set_tx_gain(gain, chan);
+ }
+
+ float get_gain(size_t chan){
+ return _dev->get_tx_gain(chan);
+ }
+
+ uhd::gain_range_t get_gain_range(size_t chan){
+ return _dev->get_tx_gain_range(chan);
+ }
+
+ void set_antenna(const std::string &ant, size_t chan){
+ return _dev->set_tx_antenna(ant, chan);
+ }
+
+ std::string get_antenna(size_t chan){
+ return _dev->get_tx_antenna(chan);
+ }
+
+ std::vector<std::string> get_antennas(size_t chan){
+ return _dev->get_tx_antennas(chan);
+ }
+
+ void set_bandwidth(double bandwidth, size_t chan){
+ return _dev->set_tx_bandwidth(bandwidth, chan);
+ }
+
+ void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){
+ return _dev->set_clock_config(clock_config, mboard);
+ }
+
+ uhd::time_spec_t get_time_now(void){
+ return _dev->get_time_now();
+ }
+
+ void set_time_next_pps(const uhd::time_spec_t &time_spec){
+ return _dev->set_time_next_pps(time_spec);
+ }
+
+ void set_time_unknown_pps(const uhd::time_spec_t &time_spec){
+ return _dev->set_time_unknown_pps(time_spec);
+ }
+
+ uhd::usrp::multi_usrp::sptr get_device(void){
+ return _dev;
+ }
+
+/***********************************************************************
+ * Work
+ **********************************************************************/
+ int work(
+ int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items
+ ){
+ uhd::tx_metadata_t metadata;
+ metadata.start_of_burst = true;
+
+ return _dev->get_device()->send(
+ input_items, noutput_items, metadata,
+ _type, uhd::device::SEND_MODE_FULL_BUFF, 1.0
+ );
+ }
+
+ //Send an empty start-of-burst packet to begin streaming.
+ //Set at a time in the near future so data will be sync'd.
+ bool start(void){
+ uhd::tx_metadata_t metadata;
+ metadata.start_of_burst = true;
+ metadata.has_time_spec = true;
+ //TODO: Time in the near future, must be less than source time in future
+ //because ethernet pause frames with throttle stream commands.
+ //It will be fixed with the invention of host-based flow control.
+ metadata.time_spec = get_time_now() + uhd::time_spec_t(0.05);
+
+ _dev->get_device()->send(
+ gr_vector_const_void_star(_nchan), 0, metadata,
+ _type, uhd::device::SEND_MODE_ONE_PACKET, 1.0
+ );
+ return true;
+ }
+
+ //Send an empty end-of-burst packet to end streaming.
+ //Ending the burst avoids an underflow error on stop.
+ bool stop(void){
+ uhd::tx_metadata_t metadata;
+ metadata.end_of_burst = true;
+
+ _dev->get_device()->send(
+ gr_vector_const_void_star(_nchan), 0, metadata,
+ _type, uhd::device::SEND_MODE_ONE_PACKET, 1.0
+ );
+ return true;
+ }
+
+protected:
+ uhd::usrp::multi_usrp::sptr _dev;
+ const uhd::io_type_t _type;
+ size_t _nchan;
+};
+
+/***********************************************************************
+ * Make UHD Multi USRP Sink
+ **********************************************************************/
+boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink(
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
+ size_t num_channels
+){
+ return boost::shared_ptr<uhd_multi_usrp_sink>(
+ new uhd_multi_usrp_sink_impl(device_addr, io_type, num_channels)
+ );
+}
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
new file mode 100644
index 000000000..370e59d0e
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2010 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.
+ */
+
+#ifndef INCLUDED_UHD_MULTI_USRP_SINK_H
+#define INCLUDED_UHD_MULTI_USRP_SINK_H
+
+#include <gr_sync_block.h>
+#include <uhd/usrp/multi_usrp.hpp>
+
+class uhd_multi_usrp_sink;
+
+boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink(
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
+ size_t num_channels
+);
+
+class uhd_multi_usrp_sink : public gr_sync_block{
+public:
+
+ /*!
+ * Set the IO signature for this block.
+ * \param sig the input signature
+ */
+ uhd_multi_usrp_sink(gr_io_signature_sptr sig);
+
+ /*!
+ * Set the subdevice specification.
+ * \param spec the subdev spec markup string
+ * \param mboard the motherboard index 0 to M-1
+ */
+ virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0;
+
+ /*!
+ * Set the sample rate for the usrp device.
+ * \param rate a new rate in Sps
+ */
+ virtual void set_samp_rate(double rate) = 0;
+
+ /*!
+ * Get the sample rate for the usrp device.
+ * This is the actual sample rate and may differ from the rate set.
+ * \return the actual rate in Sps
+ */
+ virtual double get_samp_rate(void) = 0;
+
+ /*!
+ * Tune the usrp device to the desired center frequency.
+ * \param tune_request the tune request instructions
+ * \param chan the channel index 0 to N-1
+ * \return a tune result with the actual frequencies
+ */
+ virtual uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ) = 0;
+
+ /*!
+ * Tune the usrp device to the desired center frequency.
+ * This is a wrapper around set center freq so that in this case,
+ * the user can pass a single frequency in the call through swig.
+ * \param freq the desired frequency in Hz
+ * \param chan the channel index 0 to N-1
+ * \return a tune result with the actual frequencies
+ */
+ uhd::tune_result_t set_center_freq(double freq, size_t chan){
+ return set_center_freq(uhd::tune_request_t(freq), chan);
+ }
+
+ /*!
+ * Get the tunable frequency range.
+ * \param chan the channel index 0 to N-1
+ * \return the frequency range in Hz
+ */
+ virtual uhd::freq_range_t get_freq_range(size_t chan) = 0;
+
+ /*!
+ * Set the gain for the dboard.
+ * \param gain the gain in dB
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_gain(float gain, size_t chan) = 0;
+
+ /*!
+ * Get the actual dboard gain setting.
+ * \param chan the channel index 0 to N-1
+ * \return the actual gain in dB
+ */
+ virtual float get_gain(size_t chan) = 0;
+
+ /*!
+ * Get the settable gain range.
+ * \param chan the channel index 0 to N-1
+ * \return the gain range in dB
+ */
+ virtual uhd::gain_range_t get_gain_range(size_t chan) = 0;
+
+ /*!
+ * Set the antenna to use.
+ * \param ant the antenna string
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_antenna(const std::string &ant, size_t chan) = 0;
+
+ /*!
+ * Get the antenna in use.
+ * \param chan the channel index 0 to N-1
+ * \return the antenna string
+ */
+ virtual std::string get_antenna(size_t chan) = 0;
+
+ /*!
+ * Get a list of possible antennas.
+ * \param chan the channel index 0 to N-1
+ * \return a vector of antenna strings
+ */
+ virtual std::vector<std::string> get_antennas(size_t chan) = 0;
+
+ /*!
+ * Set the subdevice bandpass filter.
+ * \param chan the channel index 0 to N-1
+ * \param bandwidth the filter bandwidth in Hz
+ */
+ virtual void set_bandwidth(double bandwidth, size_t chan) = 0;
+
+ /*!
+ * Set the clock configuration.
+ * \param clock_config the new configuration
+ * \param mboard the motherboard index 0 to M-1
+ */
+ virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0;
+
+ /*!
+ * Get the current time registers.
+ * \return the current usrp time
+ */
+ virtual uhd::time_spec_t get_time_now(void) = 0;
+
+ /*!
+ * Set the time registers at the next pps.
+ * \param time_spec the new time
+ */
+ virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0;
+
+ /*!
+ * Sync the time registers with an unknown pps edge.
+ * \param time_spec the new time
+ */
+ virtual void set_time_unknown_pps(const uhd::time_spec_t &time_spec) = 0;
+
+ /*!
+ * Get access to the underlying uhd device object.
+ * \return the multi usrp device object
+ */
+ virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0;
+};
+
+#endif /* INCLUDED_UHD_MULTI_USRP_SINK_H */
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
new file mode 100644
index 000000000..029a763e3
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2010 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.
+ */
+
+#include <uhd_multi_usrp_source.h>
+#include <gr_io_signature.h>
+#include <stdexcept>
+#include <iostream>
+#include <boost/format.hpp>
+
+/***********************************************************************
+ * UHD Multi USRP Source
+ **********************************************************************/
+uhd_multi_usrp_source::uhd_multi_usrp_source(gr_io_signature_sptr sig)
+:gr_sync_block("uhd multi_usrp source", gr_make_io_signature(0, 0, 0), sig){
+ /* NOP */
+}
+
+/***********************************************************************
+ * UHD Multi USRP Source Impl
+ **********************************************************************/
+class uhd_multi_usrp_source_impl : public uhd_multi_usrp_source{
+public:
+ uhd_multi_usrp_source_impl(
+ const std::string &device_addr,
+ const uhd::io_type_t &io_type,
+ size_t num_channels
+ ):
+ uhd_multi_usrp_source(gr_make_io_signature(
+ num_channels, num_channels, io_type.size
+ )),
+ _type(io_type)
+ {
+ _dev = uhd::usrp::multi_usrp::make(device_addr);
+ }
+
+ void set_subdev_spec(const std::string &spec, size_t mboard){
+ return _dev->set_rx_subdev_spec(spec, mboard);
+ }
+
+ void set_samp_rate(double rate){
+ _dev->set_rx_rate(rate);
+ }
+
+ double get_samp_rate(void){
+ return _dev->get_rx_rate();
+ }
+
+ uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ){
+ return _dev->set_rx_freq(tune_request, chan);
+ }
+
+ uhd::freq_range_t get_freq_range(size_t chan){
+ return _dev->get_rx_freq_range(chan);
+ }
+
+ void set_gain(float gain, size_t chan){
+ return _dev->set_rx_gain(gain, chan);
+ }
+
+ float get_gain(size_t chan){
+ return _dev->get_rx_gain(chan);
+ }
+
+ uhd::gain_range_t get_gain_range(size_t chan){
+ return _dev->get_rx_gain_range(chan);
+ }
+
+ void set_antenna(const std::string &ant, size_t chan){
+ return _dev->set_rx_antenna(ant, chan);
+ }
+
+ std::string get_antenna(size_t chan){
+ return _dev->get_rx_antenna(chan);
+ }
+
+ std::vector<std::string> get_antennas(size_t chan){
+ return _dev->get_rx_antennas(chan);
+ }
+
+ void set_bandwidth(double bandwidth, size_t chan){
+ return _dev->set_rx_bandwidth(bandwidth, chan);
+ }
+
+ void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){
+ return _dev->set_clock_config(clock_config, mboard);
+ }
+
+ uhd::time_spec_t get_time_now(void){
+ return _dev->get_time_now();
+ }
+
+ void set_time_next_pps(const uhd::time_spec_t &time_spec){
+ return _dev->set_time_next_pps(time_spec);
+ }
+
+ void set_time_unknown_pps(const uhd::time_spec_t &time_spec){
+ return _dev->set_time_unknown_pps(time_spec);
+ }
+
+ uhd::usrp::multi_usrp::sptr get_device(void){
+ return _dev;
+ }
+
+/***********************************************************************
+ * Work
+ **********************************************************************/
+ int work(
+ int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items
+ ){
+ uhd::rx_metadata_t metadata; //not passed out of this block
+
+ size_t num_samps = _dev->get_device()->recv(
+ output_items, noutput_items, metadata,
+ _type, uhd::device::RECV_MODE_FULL_BUFF, 1.0
+ );
+
+ switch(metadata.error_code){
+ case uhd::rx_metadata_t::ERROR_CODE_NONE:
+ return num_samps;
+
+ case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW:
+ //ignore overflows and try work again
+ return work(noutput_items, input_items, output_items);
+
+ default:
+ std::cout << boost::format(
+ "UHD source block got error code 0x%x"
+ ) % metadata.error_code << std::endl;
+ return num_samps;
+ }
+ }
+
+ bool start(void){
+ //setup a stream command that starts streaming slightly in the future
+ static const double reasonable_delay = 0.1; //order of magnitude over RTT
+ uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+ stream_cmd.stream_now = false;
+ stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(reasonable_delay);
+ _dev->issue_stream_cmd(stream_cmd);
+ return true;
+ }
+
+ bool stop(void){
+ _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
+ return true;
+ }
+
+private:
+ uhd::usrp::multi_usrp::sptr _dev;
+ const uhd::io_type_t _type;
+};
+
+
+/***********************************************************************
+ * Make UHD Multi USRP Source
+ **********************************************************************/
+boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source(
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
+ size_t num_channels
+){
+ return boost::shared_ptr<uhd_multi_usrp_source>(
+ new uhd_multi_usrp_source_impl(device_addr, io_type, num_channels)
+ );
+}
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
new file mode 100644
index 000000000..b3cbdae1f
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2010 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.
+ */
+
+#ifndef INCLUDED_UHD_MULTI_USRP_SOURCE_H
+#define INCLUDED_UHD_MULTI_USRP_SOURCE_H
+
+#include <gr_sync_block.h>
+#include <uhd/usrp/multi_usrp.hpp>
+
+class uhd_multi_usrp_source;
+
+boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source(
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
+ size_t num_channels
+);
+
+class uhd_multi_usrp_source : public gr_sync_block{
+public:
+
+ /*!
+ * Set the IO signature for this block.
+ * \param sig the output signature
+ */
+ uhd_multi_usrp_source(gr_io_signature_sptr sig);
+
+ /*!
+ * Set the subdevice specification.
+ * \param spec the subdev spec markup string
+ * \param mboard the motherboard index 0 to M-1
+ */
+ virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0;
+
+ /*!
+ * Set the sample rate for the usrp device.
+ * \param rate a new rate in Sps
+ */
+ virtual void set_samp_rate(double rate) = 0;
+
+ /*!
+ * Get the sample rate for the usrp device.
+ * This is the actual sample rate and may differ from the rate set.
+ * \return the actual rate in Sps
+ */
+ virtual double get_samp_rate(void) = 0;
+
+ /*!
+ * Tune the usrp device to the desired center frequency.
+ * \param tune_request the tune request instructions
+ * \param chan the channel index 0 to N-1
+ * \return a tune result with the actual frequencies
+ */
+ virtual uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ) = 0;
+
+ /*!
+ * Tune the usrp device to the desired center frequency.
+ * This is a wrapper around set center freq so that in this case,
+ * the user can pass a single frequency in the call through swig.
+ * \param freq the desired frequency in Hz
+ * \param chan the channel index 0 to N-1
+ * \return a tune result with the actual frequencies
+ */
+ uhd::tune_result_t set_center_freq(double freq, size_t chan){
+ return set_center_freq(uhd::tune_request_t(freq), chan);
+ }
+
+ /*!
+ * Get the tunable frequency range.
+ * \param chan the channel index 0 to N-1
+ * \return the frequency range in Hz
+ */
+ virtual uhd::freq_range_t get_freq_range(size_t chan) = 0;
+
+ /*!
+ * Set the gain for the dboard.
+ * \param gain the gain in dB
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_gain(float gain, size_t chan) = 0;
+
+ /*!
+ * Get the actual dboard gain setting.
+ * \param chan the channel index 0 to N-1
+ * \return the actual gain in dB
+ */
+ virtual float get_gain(size_t chan) = 0;
+
+ /*!
+ * Get the settable gain range.
+ * \param chan the channel index 0 to N-1
+ * \return the gain range in dB
+ */
+ virtual uhd::gain_range_t get_gain_range(size_t chan) = 0;
+
+ /*!
+ * Set the antenna to use.
+ * \param ant the antenna string
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_antenna(const std::string &ant, size_t chan) = 0;
+
+ /*!
+ * Get the antenna in use.
+ * \param chan the channel index 0 to N-1
+ * \return the antenna string
+ */
+ virtual std::string get_antenna(size_t chan) = 0;
+
+ /*!
+ * Get a list of possible antennas.
+ * \param chan the channel index 0 to N-1
+ * \return a vector of antenna strings
+ */
+ virtual std::vector<std::string> get_antennas(size_t chan) = 0;
+
+ /*!
+ * Set the subdevice bandpass filter.
+ * \param bandwidth the filter bandwidth in Hz
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_bandwidth(double bandwidth, size_t chan) = 0;
+
+ /*!
+ * Set the clock configuration.
+ * \param clock_config the new configuration
+ * \param mboard the motherboard index 0 to M-1
+ */
+ virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0;
+
+ /*!
+ * Get the current time registers.
+ * \return the current usrp time
+ */
+ virtual uhd::time_spec_t get_time_now(void) = 0;
+
+ /*!
+ * Set the time registers at the next pps.
+ * \param time_spec the new time
+ */
+ virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0;
+
+ /*!
+ * Sync the time registers with an unknown pps edge.
+ * \param time_spec the new time
+ */
+ virtual void set_time_unknown_pps(const uhd::time_spec_t &time_spec) = 0;
+
+ /*!
+ * Get access to the underlying uhd device object.
+ * \return the multi usrp device object
+ */
+ virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0;
+};
+
+#endif /* INCLUDED_UHD_MULTI_USRP_SOURCE_H */
diff --git a/gr-uhd/lib/uhd_simple_sink.cc b/gr-uhd/lib/uhd_simple_sink.cc
index 7b31218db..d7b04465d 100644
--- a/gr-uhd/lib/uhd_simple_sink.cc
+++ b/gr-uhd/lib/uhd_simple_sink.cc
@@ -23,7 +23,7 @@
#include <uhd_simple_sink.h>
#include <gr_io_signature.h>
#include <stdexcept>
-#include "utils.h"
+//#include "utils.h"
/***********************************************************************
* UHD Sink
@@ -56,7 +56,7 @@ public:
void set_samp_rate(double rate){
_dev->set_tx_rate(rate);
- do_samp_rate_error_message(rate, get_samp_rate(), "TX");
+ //do_samp_rate_error_message(rate, get_samp_rate(), "TX");
}
double get_samp_rate(void){
@@ -65,7 +65,7 @@ public:
uhd::tune_result_t set_center_freq(double freq){
uhd::tune_result_t tr = _dev->set_tx_freq(freq);
- do_tune_freq_error_message(freq, _dev->get_tx_freq(), "TX");
+ //do_tune_freq_error_message(freq, _dev->get_tx_freq(), "TX");
return tr;
}
diff --git a/gr-uhd/lib/uhd_simple_sink.h b/gr-uhd/lib/uhd_simple_sink.h
index 0abf30681..b239e3f21 100644
--- a/gr-uhd/lib/uhd_simple_sink.h
+++ b/gr-uhd/lib/uhd_simple_sink.h
@@ -33,7 +33,10 @@ boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink(
const uhd::io_type_t::tid_t &type
);
-class uhd_simple_sink : public gr_sync_block{
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
+class UHD_DEPRECATED uhd_simple_sink : public gr_sync_block{
public:
/*!
diff --git a/gr-uhd/lib/uhd_simple_source.cc b/gr-uhd/lib/uhd_simple_source.cc
index c1e11e85d..d74c8414d 100644
--- a/gr-uhd/lib/uhd_simple_source.cc
+++ b/gr-uhd/lib/uhd_simple_source.cc
@@ -25,7 +25,7 @@
#include <stdexcept>
#include <iostream>
#include <boost/format.hpp>
-#include "utils.h"
+//#include "utils.h"
/***********************************************************************
* UHD Source
@@ -59,7 +59,7 @@ public:
void set_samp_rate(double rate){
_dev->set_rx_rate(rate);
- do_samp_rate_error_message(rate, get_samp_rate(), "RX");
+ //do_samp_rate_error_message(rate, get_samp_rate(), "RX");
}
double get_samp_rate(void){
@@ -68,7 +68,7 @@ public:
uhd::tune_result_t set_center_freq(double freq){
uhd::tune_result_t tr = _dev->set_rx_freq(freq);
- do_tune_freq_error_message(freq, _dev->get_rx_freq(), "RX");
+ //do_tune_freq_error_message(freq, _dev->get_rx_freq(), "RX");
return tr;
}
diff --git a/gr-uhd/lib/uhd_simple_source.h b/gr-uhd/lib/uhd_simple_source.h
index b95c0cfd9..c524a024a 100644
--- a/gr-uhd/lib/uhd_simple_source.h
+++ b/gr-uhd/lib/uhd_simple_source.h
@@ -33,7 +33,10 @@ boost::shared_ptr<uhd_simple_source> uhd_make_simple_source(
const uhd::io_type_t::tid_t &type
);
-class uhd_simple_source : public gr_sync_block{
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
+class UHD_DEPRECATED uhd_simple_source : public gr_sync_block{
public:
/*!
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc
index 96f86c8db..622f506b5 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_single_usrp_sink.cc
@@ -22,10 +22,9 @@
#include <uhd_single_usrp_sink.h>
#include <gr_io_signature.h>
#include <stdexcept>
-#include "utils.h"
/***********************************************************************
- * UHD Single USPR Sink
+ * UHD Single USRP Sink
**********************************************************************/
uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig)
:gr_sync_block("uhd single usrp sink", sig, gr_make_io_signature(0, 0, 0)){
@@ -33,21 +32,22 @@ uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig)
}
/***********************************************************************
- * UHD Single USPR Sink Impl
+ * UHD Single USRP Sink Impl
**********************************************************************/
class uhd_single_usrp_sink_impl : public uhd_single_usrp_sink{
public:
uhd_single_usrp_sink_impl(
- const std::string &args,
- const uhd::io_type_t &type,
+ const std::string &device_addr,
+ const uhd::io_type_t &io_type,
size_t num_channels
- ) : uhd_single_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels)
+ ):
+ uhd_single_usrp_sink(gr_make_io_signature(
+ num_channels, num_channels, io_type.size
+ )),
+ _type(io_type),
+ _nchan(num_channels)
{
- _dev = uhd::usrp::single_usrp::make(args);
- }
-
- ~uhd_single_usrp_sink_impl(void){
- //NOP
+ _dev = uhd::usrp::single_usrp::make(device_addr);
}
void set_subdev_spec(const std::string &spec){
@@ -56,17 +56,16 @@ public:
void set_samp_rate(double rate){
_dev->set_tx_rate(rate);
- do_samp_rate_error_message(rate, get_samp_rate(), "TX");
}
double get_samp_rate(void){
return _dev->get_tx_rate();
}
- uhd::tune_result_t set_center_freq(double freq, size_t chan){
- uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan);
- do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX");
- return tr;
+ uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ){
+ return _dev->set_tx_freq(tune_request, chan);
}
uhd::freq_range_t get_freq_range(size_t chan){
@@ -97,6 +96,10 @@ public:
return _dev->get_tx_antennas(chan);
}
+ void set_bandwidth(double bandwidth, size_t chan){
+ return _dev->set_tx_bandwidth(bandwidth, chan);
+ }
+
void set_clock_config(const uhd::clock_config_t &clock_config){
return _dev->set_clock_config(clock_config);
}
@@ -167,14 +170,14 @@ protected:
};
/***********************************************************************
- * Make UHD Single USPR Sink
+ * Make UHD Single USRP Sink
**********************************************************************/
boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink(
- const std::string &args,
- const uhd::io_type_t::tid_t &type,
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
size_t num_channels
){
return boost::shared_ptr<uhd_single_usrp_sink>(
- new uhd_single_usrp_sink_impl(args, type, num_channels)
+ new uhd_single_usrp_sink_impl(device_addr, io_type, num_channels)
);
}
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.h b/gr-uhd/lib/uhd_single_usrp_sink.h
index bec788193..a4c4e6452 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.h
+++ b/gr-uhd/lib/uhd_single_usrp_sink.h
@@ -28,8 +28,8 @@
class uhd_single_usrp_sink;
boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink(
- const std::string &args,
- const uhd::io_type_t::tid_t &type,
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
size_t num_channels = 1
);
@@ -63,13 +63,29 @@ public:
/*!
* Tune the usrp device to the desired center frequency.
+ * \param tune_request the tune request instructions
+ * \param chan the channel index 0 to N-1
+ * \return a tune result with the actual frequencies
+ */
+ virtual uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ) = 0;
+
+ /*!
+ * Tune the usrp device to the desired center frequency.
+ * This is a wrapper around set center freq so that in this case,
+ * the user can pass a single frequency in the call through swig.
* \param freq the desired frequency in Hz
+ * \param chan the channel index 0 to N-1
* \return a tune result with the actual frequencies
*/
- virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+ uhd::tune_result_t set_center_freq(double freq, size_t chan){
+ return set_center_freq(uhd::tune_request_t(freq), chan);
+ }
/*!
* Get the tunable frequency range.
+ * \param chan the channel index 0 to N-1
* \return the frequency range in Hz
*/
virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
@@ -77,17 +93,20 @@ public:
/*!
* Set the gain for the dboard.
* \param gain the gain in dB
+ * \param chan the channel index 0 to N-1
*/
virtual void set_gain(float gain, size_t chan = 0) = 0;
/*!
* Get the actual dboard gain setting.
+ * \param chan the channel index 0 to N-1
* \return the actual gain in dB
*/
virtual float get_gain(size_t chan = 0) = 0;
/*!
* Get the settable gain range.
+ * \param chan the channel index 0 to N-1
* \return the gain range in dB
*/
virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
@@ -95,22 +114,32 @@ public:
/*!
* Set the antenna to use.
* \param ant the antenna string
+ * \param chan the channel index 0 to N-1
*/
virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
/*!
* Get the antenna in use.
+ * \param chan the channel index 0 to N-1
* \return the antenna string
*/
virtual std::string get_antenna(size_t chan = 0) = 0;
/*!
* Get a list of possible antennas.
+ * \param chan the channel index 0 to N-1
* \return a vector of antenna strings
*/
virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
/*!
+ * Set the subdevice bandpass filter.
+ * \param bandwidth the filter bandwidth in Hz
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0;
+
+ /*!
* Set the clock configuration.
* \param clock_config the new configuration
*/
diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc
index b5e39b5a4..907e8be54 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.cc
+++ b/gr-uhd/lib/uhd_single_usrp_source.cc
@@ -24,10 +24,9 @@
#include <stdexcept>
#include <iostream>
#include <boost/format.hpp>
-#include "utils.h"
/***********************************************************************
- * UHD Single USPR Source
+ * UHD Single USRP Source
**********************************************************************/
uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig)
:gr_sync_block("uhd single_usrp source", gr_make_io_signature(0, 0, 0), sig){
@@ -35,17 +34,21 @@ uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig)
}
/***********************************************************************
- * UHD Single USPR Source Impl
+ * UHD Single USRP Source Impl
**********************************************************************/
class uhd_single_usrp_source_impl : public uhd_single_usrp_source{
public:
uhd_single_usrp_source_impl(
- const std::string &args,
- const uhd::io_type_t &type,
+ const std::string &device_addr,
+ const uhd::io_type_t &io_type,
size_t num_channels
- ) : uhd_single_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type)
+ ):
+ uhd_single_usrp_source(gr_make_io_signature(
+ num_channels, num_channels, io_type.size
+ )),
+ _type(io_type)
{
- _dev = uhd::usrp::single_usrp::make(args);
+ _dev = uhd::usrp::single_usrp::make(device_addr);
}
void set_subdev_spec(const std::string &spec){
@@ -54,17 +57,16 @@ public:
void set_samp_rate(double rate){
_dev->set_rx_rate(rate);
- do_samp_rate_error_message(rate, get_samp_rate(), "RX");
}
double get_samp_rate(void){
return _dev->get_rx_rate();
}
- uhd::tune_result_t set_center_freq(double freq, size_t chan){
- uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan);
- do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX");
- return tr;
+ uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ){
+ return _dev->set_rx_freq(tune_request, chan);
}
uhd::freq_range_t get_freq_range(size_t chan){
@@ -95,6 +97,10 @@ public:
return _dev->get_rx_antennas(chan);
}
+ void set_bandwidth(double bandwidth, size_t chan){
+ return _dev->set_rx_bandwidth(bandwidth, chan);
+ }
+
void set_clock_config(const uhd::clock_config_t &clock_config){
return _dev->set_clock_config(clock_config);
}
@@ -163,14 +169,14 @@ private:
/***********************************************************************
- * Make UHD Single USPR Source
+ * Make UHD Single USRP Source
**********************************************************************/
boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source(
- const std::string &args,
- const uhd::io_type_t::tid_t &type,
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
size_t num_channels
){
return boost::shared_ptr<uhd_single_usrp_source>(
- new uhd_single_usrp_source_impl(args, type, num_channels)
+ new uhd_single_usrp_source_impl(device_addr, io_type, num_channels)
);
}
diff --git a/gr-uhd/lib/uhd_single_usrp_source.h b/gr-uhd/lib/uhd_single_usrp_source.h
index 196b7c675..495f8c611 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.h
+++ b/gr-uhd/lib/uhd_single_usrp_source.h
@@ -28,8 +28,8 @@
class uhd_single_usrp_source;
boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source(
- const std::string &args,
- const uhd::io_type_t::tid_t &type,
+ const std::string &device_addr,
+ const uhd::io_type_t::tid_t &io_type,
size_t num_channels = 1
);
@@ -63,13 +63,29 @@ public:
/*!
* Tune the usrp device to the desired center frequency.
+ * \param tune_request the tune request instructions
+ * \param chan the channel index 0 to N-1
+ * \return a tune result with the actual frequencies
+ */
+ virtual uhd::tune_result_t set_center_freq(
+ const uhd::tune_request_t tune_request, size_t chan
+ ) = 0;
+
+ /*!
+ * Tune the usrp device to the desired center frequency.
+ * This is a wrapper around set center freq so that in this case,
+ * the user can pass a single frequency in the call through swig.
* \param freq the desired frequency in Hz
+ * \param chan the channel index 0 to N-1
* \return a tune result with the actual frequencies
*/
- virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+ uhd::tune_result_t set_center_freq(double freq, size_t chan){
+ return set_center_freq(uhd::tune_request_t(freq), chan);
+ }
/*!
* Get the tunable frequency range.
+ * \param chan the channel index 0 to N-1
* \return the frequency range in Hz
*/
virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
@@ -77,17 +93,20 @@ public:
/*!
* Set the gain for the dboard.
* \param gain the gain in dB
+ * \param chan the channel index 0 to N-1
*/
virtual void set_gain(float gain, size_t chan = 0) = 0;
/*!
* Get the actual dboard gain setting.
+ * \param chan the channel index 0 to N-1
* \return the actual gain in dB
*/
virtual float get_gain(size_t chan = 0) = 0;
/*!
* Get the settable gain range.
+ * \param chan the channel index 0 to N-1
* \return the gain range in dB
*/
virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
@@ -95,22 +114,32 @@ public:
/*!
* Set the antenna to use.
* \param ant the antenna string
+ * \param chan the channel index 0 to N-1
*/
virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
/*!
* Get the antenna in use.
+ * \param chan the channel index 0 to N-1
* \return the antenna string
*/
virtual std::string get_antenna(size_t chan = 0) = 0;
/*!
* Get a list of possible antennas.
+ * \param chan the channel index 0 to N-1
* \return a vector of antenna strings
*/
virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
/*!
+ * Set the subdevice bandpass filter.
+ * \param bandwidth the filter bandwidth in Hz
+ * \param chan the channel index 0 to N-1
+ */
+ virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0;
+
+ /*!
* Set the clock configuration.
* \param clock_config the new configuration
*/
diff --git a/gr-uhd/lib/utils.cc b/gr-uhd/lib/utils.cc
deleted file mode 100644
index da8352965..000000000
--- a/gr-uhd/lib/utils.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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.
- */
-
-#include "utils.h" //local include
-#include <uhd/utils/warning.hpp>
-#include <boost/format.hpp>
-#include <cmath>
-
-void do_samp_rate_error_message(
- double target_rate,
- double actual_rate,
- const std::string &xx
-){
- static const double max_allowed_error = 1.0; //Sps
- if (std::abs(target_rate - actual_rate) > max_allowed_error){
- uhd::print_warning(str(boost::format(
- "The hardware does not support the requested %s sample rate:\n"
- "Target sample rate: %f MSps\n"
- "Actual sample rate: %f MSps\n"
- ) % xx % (target_rate/1e6) % (actual_rate/1e6)));
- }
-}
-
-void do_tune_freq_error_message(
- double target_freq,
- double actual_freq,
- const std::string &xx
-){
- static const double max_allowed_error = 1.0; //Hz
- if (std::abs(target_freq - actual_freq) > max_allowed_error){
- uhd::print_warning(str(boost::format(
- "The hardware does not support the requested %s frequency:\n"
- "Target frequency: %f MHz\n"
- "Actual frequency: %f MHz\n"
- ) % xx % (target_freq/1e6) % (actual_freq/1e6)));
- }
-}
diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py
index 2fed17e57..0fdacb796 100644
--- a/gr-uhd/swig/__init__.py
+++ b/gr-uhd/swig/__init__.py
@@ -21,8 +21,20 @@
# The presence of this file turns this directory into a Python package
+########################################################################
# Add SWIG generated code to this namespace
+########################################################################
from uhd_swig import *
+########################################################################
# Add other content from pure-Python modules here
+########################################################################
+class tune_request_t(tune_request_t, float):
+ """
+ Make the python tune request object inherit from float
+ so that it can be passed in GRC as a frequency parameter.
+ The type checking in GRC will accept the tune request.
+ """
+ def __new__(self, *args): return float.__new__(self)
+ def __float__(self): return self.target_freq
diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i
index d755dfeee..d332bb617 100644
--- a/gr-uhd/swig/uhd_swig.i
+++ b/gr-uhd/swig/uhd_swig.i
@@ -20,6 +20,27 @@
* Boston, MA 02110-1301, USA.
*/
+////////////////////////////////////////////////////////////////////////
+// Language independent exception handler
+////////////////////////////////////////////////////////////////////////
+%include exception.i
+
+%exception {
+ try {
+ $action
+ }
+ catch(std::exception &e) {
+ SWIG_exception(SWIG_RuntimeError, e.what());
+ }
+ catch(...) {
+ SWIG_exception(SWIG_RuntimeError, "Unknown exception");
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////
+// standard includes
+////////////////////////////////////////////////////////////////////////
%include "gnuradio.i"
%include "std_string.i"
%include "std_vector.i"
@@ -28,36 +49,63 @@ namespace std {
%template(StringVector) vector<string>;
}
+////////////////////////////////////////////////////////////////////////
+// block headers
+////////////////////////////////////////////////////////////////////////
%{
-#include <uhd_mimo_source.h>
-#include <uhd_mimo_sink.h>
-#include <uhd_simple_source.h>
-#include <uhd_simple_sink.h>
+#include <uhd_mimo_source.h> //deprecated
+#include <uhd_mimo_sink.h> //deprecated
+#include <uhd_simple_source.h> //deprecated
+#include <uhd_simple_sink.h> //deprecated
+
+#include <uhd_multi_usrp_source.h>
+#include <uhd_multi_usrp_sink.h>
#include <uhd_single_usrp_source.h>
#include <uhd_single_usrp_sink.h>
%}
+////////////////////////////////////////////////////////////////////////
+// used types
+////////////////////////////////////////////////////////////////////////
%include <uhd/config.hpp>
%include <uhd/types/ranges.hpp>
+%include <uhd/types/tune_request.hpp>
%include <uhd/types/tune_result.hpp>
%include <uhd/types/io_type.hpp>
%include <uhd/types/time_spec.hpp>
%include <uhd/types/clock_config.hpp>
-GR_SWIG_BLOCK_MAGIC(uhd,mimo_source)
-%include <uhd_mimo_source.h>
+////////////////////////////////////////////////////////////////////////
+// block magic
+////////////////////////////////////////////////////////////////////////
+GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) //deprecated
+%include <uhd_mimo_source.h> //deprecated
-GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink)
-%include <uhd_mimo_sink.h>
+GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink) //deprecated
+%include <uhd_mimo_sink.h> //deprecated
-GR_SWIG_BLOCK_MAGIC(uhd,simple_source)
-%include <uhd_simple_source.h>
+GR_SWIG_BLOCK_MAGIC(uhd,simple_source) //deprecated
+%include <uhd_simple_source.h> //deprecated
-GR_SWIG_BLOCK_MAGIC(uhd,simple_sink)
-%include <uhd_simple_sink.h>
+GR_SWIG_BLOCK_MAGIC(uhd,simple_sink) //deprecated
+%include <uhd_simple_sink.h> //deprecated
+
+GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_source)
+%include <uhd_multi_usrp_source.h>
+
+GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_sink)
+%include <uhd_multi_usrp_sink.h>
GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_source)
%include <uhd_single_usrp_source.h>
GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_sink)
%include <uhd_single_usrp_sink.h>
+
+////////////////////////////////////////////////////////////////////////
+// helpful constants
+////////////////////////////////////////////////////////////////////////
+%{
+static const size_t ALL_MBOARDS = uhd::usrp::multi_usrp::ALL_MBOARDS;
+%}
+static const size_t ALL_MBOARDS;
diff --git a/gr-usrp/apps/Makefile.am b/gr-usrp/apps/Makefile.am
index 92938061f..0f3a21bb4 100644
--- a/gr-usrp/apps/Makefile.am
+++ b/gr-usrp/apps/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2008,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -22,19 +22,20 @@
include $(top_srcdir)/Makefile.common
# For compiling within the GNU Radio build tree
-AM_CPPFLAGS=$(STD_DEFINES_AND_INCLUDES) \
- -I$(top_srcdir)/gr-usrp/src \
- $(USRP_INCLUDES) \
- $(WITH_INCLUDES)
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/gr-usrp/src \
+ $(USRP_INCLUDES) \
+ $(STD_DEFINES_AND_INCLUDES) \
+ $(WITH_INCLUDES)
GR_USRP_LA=$(top_builddir)/gr-usrp/src/libgnuradio-usrp.la
# For compiling outside the tree, these will get fished out by pkgconfig
LDADD = \
+ $(GR_USRP_LA) \
$(BOOST_LDFLAGS) \
- $(BOOST_PROGRAM_OPTIONS_LIB) \
- $(GR_USRP_LA)
+ $(BOOST_PROGRAM_OPTIONS_LIB)
noinst_PROGRAMS = \
usrp_rx_cfile \
diff --git a/gr-usrp/src/Makefile.am b/gr-usrp/src/Makefile.am
index 572a22485..db5be4ade 100644
--- a/gr-usrp/src/Makefile.am
+++ b/gr-usrp/src/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -34,9 +34,9 @@ noinst_PYTHON = qa_usrp.py
# The straight C++ library
AM_CPPFLAGS = \
+ $(USRP_INCLUDES) \
$(STD_DEFINES_AND_INCLUDES) \
$(PYTHON_CPPFLAGS) \
- $(USRP_INCLUDES) \
$(USB_INCLUDES) \
$(WITH_INCLUDES)
diff --git a/gr-usrp2/src/Makefile.am b/gr-usrp2/src/Makefile.am
index 03b6d0dd9..0d55d73ba 100644
--- a/gr-usrp2/src/Makefile.am
+++ b/gr-usrp2/src/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -42,10 +42,10 @@ DISTCLEANFILES = run_tests
# libgr-usrp.so
# ----------------------------------------------------------------------
AM_CPPFLAGS = \
- $(STD_DEFINES_AND_INCLUDES) \
$(GRUEL_INCLUDES) \
- $(PYTHON_CPPFLAGS) \
$(USRP2_INCLUDES) \
+ $(STD_DEFINES_AND_INCLUDES) \
+ $(PYTHON_CPPFLAGS) \
$(WITH_INCLUDES)
lib_LTLIBRARIES = libgnuradio-usrp2.la
diff --git a/gr-wxgui/src/python/constants.py b/gr-wxgui/src/python/constants.py
index 9612f36dd..070be0808 100644
--- a/gr-wxgui/src/python/constants.py
+++ b/gr-wxgui/src/python/constants.py
@@ -66,6 +66,7 @@ X_PER_DIV_KEY = 'x_per_div'
Y_DIVS_KEY = 'y_divs'
Y_OFF_KEY = 'y_off'
Y_PER_DIV_KEY = 'y_per_div'
+Y_AXIS_LABEL = 'y_axis_label'
MAXIMUM_KEY = 'maximum'
MINIMUM_KEY = 'minimum'
NUM_BINS_KEY = 'num_bins'
diff --git a/gr-wxgui/src/python/scope_window.py b/gr-wxgui/src/python/scope_window.py
index a9917782f..89a808cec 100644
--- a/gr-wxgui/src/python/scope_window.py
+++ b/gr-wxgui/src/python/scope_window.py
@@ -435,6 +435,7 @@ class scope_window(wx.Panel, pubsub.pubsub):
use_persistence,
persist_alpha,
trig_mode,
+ y_axis_label,
):
pubsub.pubsub.__init__(self)
#check num inputs
@@ -471,6 +472,7 @@ class scope_window(wx.Panel, pubsub.pubsub):
self[T_DIVS_KEY] = 8
self[X_DIVS_KEY] = 8
self[Y_DIVS_KEY] = 8
+ self[Y_AXIS_LABEL] = y_axis_label
self[FRAME_RATE_KEY] = frame_rate
self[TRIGGER_LEVEL_KEY] = 0
self[TRIGGER_CHANNEL_KEY] = 0
@@ -676,7 +678,7 @@ class scope_window(wx.Panel, pubsub.pubsub):
self.plotter.set_x_label('Time', 's')
self.plotter.set_x_grid(self.get_t_min(), self.get_t_max(), self[T_PER_DIV_KEY], True)
#update the y axis
- self.plotter.set_y_label('Counts')
+ self.plotter.set_y_label(self[Y_AXIS_LABEL])
self.plotter.set_y_grid(self.get_y_min(), self.get_y_max(), self[Y_PER_DIV_KEY])
#redraw current sample
self.handle_samples()
diff --git a/gr-wxgui/src/python/scopesink_gl.py b/gr-wxgui/src/python/scopesink_gl.py
index 15be23d5a..5ae897400 100644
--- a/gr-wxgui/src/python/scopesink_gl.py
+++ b/gr-wxgui/src/python/scopesink_gl.py
@@ -77,6 +77,7 @@ class _scope_sink_base(gr.hier_block2, common.wxgui_hb):
ac_couple=False,
num_inputs=1,
trig_mode=scope_window.DEFAULT_TRIG_MODE,
+ y_axis_label='Counts',
frame_rate=scope_window.DEFAULT_FRAME_RATE,
use_persistence=False,
persist_alpha=None,
@@ -134,6 +135,7 @@ class _scope_sink_base(gr.hier_block2, common.wxgui_hb):
v_offset=v_offset,
xy_mode=xy_mode,
trig_mode=trig_mode,
+ y_axis_label=y_axis_label,
ac_couple_key=AC_COUPLE_KEY,
trigger_level_key=TRIGGER_LEVEL_KEY,
trigger_mode_key=TRIGGER_MODE_KEY,
diff --git a/grc/base/Param.py b/grc/base/Param.py
index e56eac36e..5cd0f9d6d 100644
--- a/grc/base/Param.py
+++ b/grc/base/Param.py
@@ -94,7 +94,7 @@ class Param(Element):
try: assert set(opt_keys) == set(option.get_opt_keys())
except AssertionError: raise Exception, 'Opt keys "%s" are not identical across all options.'%opt_keys
#if a value is specified, it must be in the options keys
- self._value = value or self.get_option_keys()[0]
+ self._value = value if value or value in self.get_option_keys() else self.get_option_keys()[0]
try: assert self.get_value() in self.get_option_keys()
except AssertionError: raise Exception, 'The value "%s" is not in the possible values of "%s".'%(self.get_value(), self.get_option_keys())
else: self._value = value or ''
diff --git a/grc/blocks/wxgui_scopesink2.xml b/grc/blocks/wxgui_scopesink2.xml
index 50cd977be..ef0377373 100644
--- a/grc/blocks/wxgui_scopesink2.xml
+++ b/grc/blocks/wxgui_scopesink2.xml
@@ -21,6 +21,7 @@ scopesink2.$(type.fcn)(
xy_mode=$xy_mode,
num_inputs=$num_inputs,
trig_mode=$trig_mode,
+ y_axis_label=$y_axis_label,
#if $win_size()
size=$win_size,
#end if
@@ -156,6 +157,12 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
<key>gr.gr_TRIG_MODE_STRIPCHART</key>
</option>
</param>
+ <param>
+ <name>Y Axis Label</name>
+ <key>y_axis_label</key>
+ <value>Counts</value>
+ <type>string</type>
+ </param>
<check>not $win_size or len($win_size) == 2</check>
<check>not $xy_mode or '$type' == 'complex' or $num_inputs != 1</check>
<sink>
diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am
index 1bcd26e90..5c3302f19 100644
--- a/gruel/src/lib/Makefile.am
+++ b/gruel/src/lib/Makefile.am
@@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common
SUBDIRS = pmt msg
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
-
+AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \
+ $(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
TESTS = test_gruel
diff --git a/gruel/src/lib/msg/Makefile.am b/gruel/src/lib/msg/Makefile.am
index 13a657067..9dbaf10f5 100644
--- a/gruel/src/lib/msg/Makefile.am
+++ b/gruel/src/lib/msg/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2009 Free Software Foundation, Inc.
+# Copyright 2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -21,7 +21,8 @@
include $(top_srcdir)/Makefile.common
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) \
+ $(BOOST_CPPFLAGS) $(WITH_INCLUDES)
noinst_LTLIBRARIES = libmsg.la
diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am
index 8750cbdf8..d3efc1afa 100644
--- a/gruel/src/lib/pmt/Makefile.am
+++ b/gruel/src/lib/pmt/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2008,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -21,8 +21,8 @@
include $(top_srcdir)/Makefile.common
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
-
+AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \
+ $(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
noinst_LTLIBRARIES = libpmt.la
diff --git a/usrp/host/lib/Makefile.am b/usrp/host/lib/Makefile.am
index 23889fc85..b8b60fa98 100644
--- a/usrp/host/lib/Makefile.am
+++ b/usrp/host/lib/Makefile.am
@@ -33,7 +33,7 @@ libusrp_la_common_LIBADD = \
# darwin fusb requires gruel (for threading)
if FUSB_TECH_darwin
-AM_CPPFLAGS = $(common_INCLUDES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(GRUEL_INCLUDES) $(common_INCLUDES) $(BOOST_CPPFLAGS) $(WITH_INCLUDES)
libusrp_la_LIBADD = $(libusrp_la_common_LIBADD) $(GRUEL_LA)
libusrp_la_LDFLAGS = $(libusrp_la_common_LDFLAGS) -framework CoreFoundation
else
diff --git a/usrp/host/swig/Makefile.am b/usrp/host/swig/Makefile.am
index d2e6b8bc1..c846f267b 100644
--- a/usrp/host/swig/Makefile.am
+++ b/usrp/host/swig/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2001,2003,2004,2006,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2001,2003,2004,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common
AM_CPPFLAGS = \
$(USRP_INCLUDES) \
- $(PYTHON_CPPFLAGS) \
-I$(srcdir) \
+ $(PYTHON_CPPFLAGS) \
$(USB_INCLUDES) \
$(WITH_INCLUDES)
diff --git a/usrp2/host/apps/Makefile.am b/usrp2/host/apps/Makefile.am
index 4a26898fa..087ab9e31 100644
--- a/usrp2/host/apps/Makefile.am
+++ b/usrp2/host/apps/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2007, 2008 Free Software Foundation, Inc.
+# Copyright 2007,2008,2010 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,9 +19,9 @@ include $(top_srcdir)/Makefile.common
AM_CPPFLAGS = \
$(USRP2_INCLUDES) \
+ $(GRUEL_INCLUDES) \
$(STD_DEFINES_AND_INCLUDES) \
- $(CPPUNIT_INCLUDES) \
- $(GRUEL_INCLUDES)
+ $(CPPUNIT_INCLUDES)
LDADD = \
$(USRP2_LA) \
diff --git a/usrp2/host/lib/Makefile.am b/usrp2/host/lib/Makefile.am
index 209cb7095..85bec4673 100644
--- a/usrp2/host/lib/Makefile.am
+++ b/usrp2/host/lib/Makefile.am
@@ -19,10 +19,10 @@ include $(top_srcdir)/Makefile.common
AM_CPPFLAGS = \
$(USRP2_INCLUDES) \
- $(BOOST_CPPFLAGS) \
+ $(GRUEL_INCLUDES) \
$(STD_DEFINES_AND_INCLUDES) \
- $(CPPUNIT_INCLUDES) \
- $(GRUEL_INCLUDES)
+ $(BOOST_CPPFLAGS) \
+ $(CPPUNIT_INCLUDES)
bin_PROGRAMS = usrp2_socket_opener
usrp2_socket_opener_SOURCES = usrp2_socket_opener.cc