diff options
335 files changed, 8155 insertions, 810 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..b11bb113a --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +/configure +/Makefile.in +/config.log +/config.h +/ltmain.sh +/Makefile +/config.status +/stamp-h1 +/config.h.in +/autom4te.cache +/libtool +/missing +/aclocal.m4 +/install-sh +/depcomp +/py-compile +/compile +/build +/run_tests.sh +/*-stamp diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 000000000..16f775e32 --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,15 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/libtool.m4 +/lt~obsolete.m4 +/ltsugar.m4 +/ltversion.m4 +/ltoptions.m4 diff --git a/config/grc_gnuradio_examples.m4 b/config/grc_gnuradio_examples.m4 index 7de55666d..3225f3ab5 100644 --- a/config/grc_gnuradio_examples.m4 +++ b/config/grc_gnuradio_examples.m4 @@ -39,6 +39,7 @@ AC_DEFUN([GRC_GNURADIO_EXAMPLES],[ gnuradio-examples/python/multi_usrp/Makefile \ gnuradio-examples/python/network/Makefile \ gnuradio-examples/python/ofdm/Makefile \ + gnuradio-examples/python/pfb/Makefile \ gnuradio-examples/python/usrp/Makefile \ gnuradio-examples/python/usrp2/Makefile \ ]) diff --git a/debian/.gitignore b/debian/.gitignore new file mode 100644 index 000000000..ca163135c --- /dev/null +++ b/debian/.gitignore @@ -0,0 +1,2 @@ +/changelog +/*.log diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..9ee645401 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +/Makefile.in +/Makefile diff --git a/docs/doxygen/.gitignore b/docs/doxygen/.gitignore new file mode 100644 index 000000000..f44627c9d --- /dev/null +++ b/docs/doxygen/.gitignore @@ -0,0 +1,13 @@ +/Makefile +/Makefile.in +/html +/latex +/xml +/man +/Doxyfile +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/docs/doxygen/other/.gitignore b/docs/doxygen/other/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/docs/doxygen/other/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/docs/doxygen/xml-swig/.gitignore b/docs/doxygen/xml-swig/.gitignore new file mode 100644 index 000000000..4671390b0 --- /dev/null +++ b/docs/doxygen/xml-swig/.gitignore @@ -0,0 +1,16 @@ +/Makefile +/Makefile.in +/html +/latex +/man +/Doxyfile +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.xml +/combine.xslt +/compound.xsd +/index.xsd diff --git a/docs/exploring-gnuradio/.gitignore b/docs/exploring-gnuradio/.gitignore new file mode 100644 index 000000000..b6e6030ca --- /dev/null +++ b/docs/exploring-gnuradio/.gitignore @@ -0,0 +1 @@ +/exploring-gnuradio.html diff --git a/docs/howto-write-a-block/.gitignore b/docs/howto-write-a-block/.gitignore new file mode 100644 index 000000000..719ea5d4f --- /dev/null +++ b/docs/howto-write-a-block/.gitignore @@ -0,0 +1 @@ +/howto-write-a-block.html diff --git a/gcell/.gitignore b/gcell/.gitignore new file mode 100644 index 000000000..a55308950 --- /dev/null +++ b/gcell/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/gcell.pc +/gcell_spu.pc diff --git a/gcell/apps/.gitignore b/gcell/apps/.gitignore new file mode 100644 index 000000000..b80e1a92c --- /dev/null +++ b/gcell/apps/.gitignore @@ -0,0 +1,12 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/test_all +/benchmark_nop +/benchmark_dma +/benchmark_roundtrip diff --git a/gcell/apps/spu/.gitignore b/gcell/apps/spu/.gitignore new file mode 100644 index 000000000..c50e521a3 --- /dev/null +++ b/gcell/apps/spu/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/*.a +/*.la +/*.lo +/.deps +/.libs +/benchmark_procs diff --git a/gcell/ibm/.gitignore b/gcell/ibm/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gcell/ibm/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gcell/include/.gitignore b/gcell/include/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gcell/include/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gcell/include/gcell/.gitignore b/gcell/include/gcell/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gcell/include/gcell/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gcell/include/gcell/spu/.gitignore b/gcell/include/gcell/spu/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gcell/include/gcell/spu/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gcell/lib/.gitignore b/gcell/lib/.gitignore new file mode 100644 index 000000000..3531485fb --- /dev/null +++ b/gcell/lib/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.a +/*.o diff --git a/gcell/lib/general/.gitignore b/gcell/lib/general/.gitignore new file mode 100644 index 000000000..3531485fb --- /dev/null +++ b/gcell/lib/general/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.a +/*.o diff --git a/gcell/lib/general/spu/.gitignore b/gcell/lib/general/spu/.gitignore new file mode 100644 index 000000000..3531485fb --- /dev/null +++ b/gcell/lib/general/spu/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.a +/*.o diff --git a/gcell/lib/runtime/.gitignore b/gcell/lib/runtime/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gcell/lib/runtime/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gcell/lib/runtime/spu/.gitignore b/gcell/lib/runtime/spu/.gitignore new file mode 100644 index 000000000..36b575570 --- /dev/null +++ b/gcell/lib/runtime/spu/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/*.a +/*.la +/*.lo +/.deps +/.libs +/test_spu +/gcell_spu_main +/gcell_qa diff --git a/gcell/lib/spu/.gitignore b/gcell/lib/spu/.gitignore new file mode 100644 index 000000000..547d22090 --- /dev/null +++ b/gcell/lib/spu/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.a +/*.o +/gcell_general_qa +/gcell_runtime_qa +/gcell_all diff --git a/gcell/lib/wrapper/.gitignore b/gcell/lib/wrapper/.gitignore new file mode 100644 index 000000000..3531485fb --- /dev/null +++ b/gcell/lib/wrapper/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.a +/*.o diff --git a/gcell/lib/wrapper/spu/.gitignore b/gcell/lib/wrapper/spu/.gitignore new file mode 100644 index 000000000..3531485fb --- /dev/null +++ b/gcell/lib/wrapper/spu/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.a +/*.o diff --git a/gnuradio-core/.gitignore b/gnuradio-core/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gnuradio-core/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gnuradio-core/src/.gitignore b/gnuradio-core/src/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gnuradio-core/src/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-core/src/gen_interpolator_taps/.gitignore b/gnuradio-core/src/gen_interpolator_taps/.gitignore new file mode 100644 index 000000000..363c633e1 --- /dev/null +++ b/gnuradio-core/src/gen_interpolator_taps/.gitignore @@ -0,0 +1,7 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/gen_interpolator_taps diff --git a/gnuradio-core/src/lib/.gitignore b/gnuradio-core/src/lib/.gitignore new file mode 100644 index 000000000..e3bc1ee6a --- /dev/null +++ b/gnuradio-core/src/lib/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/gnuradio-config-info diff --git a/gnuradio-core/src/lib/filter/.gitignore b/gnuradio-core/src/lib/filter/.gitignore new file mode 100644 index 000000000..2d009f154 --- /dev/null +++ b/gnuradio-core/src/lib/filter/.gitignore @@ -0,0 +1,214 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/generate-stamp +/# +/--- +/generate +/files: +/don't +/go +/in +/CVS +/--- +/GrFIRfilterCCC.cc +/GrFIRfilterCCC.h +/GrFIRfilterCCF.cc +/GrFIRfilterCCF.h +/GrFIRfilterFCC.cc +/GrFIRfilterFCC.h +/GrFIRfilterFFF.cc +/GrFIRfilterFFF.h +/GrFIRfilterFSF.cc +/GrFIRfilterFSF.h +/GrFIRfilterSCC.cc +/GrFIRfilterSCC.h +/GrFIRfilterSIS.cc +/GrFIRfilterSIS.h +/GrFreqXlatingFIRfilterCCC.cc +/GrFreqXlatingFIRfilterCCC.h +/GrFreqXlatingFIRfilterCCF.cc +/GrFreqXlatingFIRfilterCCF.h +/GrFreqXlatingFIRfilterFCC.cc +/GrFreqXlatingFIRfilterFCC.h +/GrFreqXlatingFIRfilterFCF.cc +/GrFreqXlatingFIRfilterFCF.h +/GrFreqXlatingFIRfilterSCC.cc +/GrFreqXlatingFIRfilterSCC.h +/GrFreqXlatingFIRfilterSCF.cc +/GrFreqXlatingFIRfilterSCF.h +/gr_fir_CCC.cc +/gr_fir_CCC.h +/gr_fir_CCC_generic.cc +/gr_fir_CCC_generic.h +/gr_fir_CCF.cc +/gr_fir_CCF.h +/gr_fir_CCF_generic.cc +/gr_fir_CCF_generic.h +/gr_fir_FCC.cc +/gr_fir_FCC.h +/gr_fir_FCC_generic.cc +/gr_fir_FCC_generic.h +/gr_fir_FFF.cc +/gr_fir_FFF.h +/gr_fir_FFF_generic.cc +/gr_fir_FFF_generic.h +/gr_fir_FSF.cc +/gr_fir_FSF.h +/gr_fir_FSF_generic.cc +/gr_fir_FSF_generic.h +/gr_fir_SCC.cc +/gr_fir_SCC.h +/gr_fir_SCC_generic.cc +/gr_fir_SCC_generic.h +/gr_fir_SIS.cc +/gr_fir_SIS.h +/gr_fir_SIS_generic.cc +/gr_fir_SIS_generic.h +/gr_fir_sysconfig.cc +/gr_fir_sysconfig.h +/gr_fir_sysconfig_generic.cc +/gr_fir_sysconfig_generic.h +/gr_fir_util.cc +/gr_fir_util.h +/GrFIRfilterCCC.i +/GrFIRfilterCCF.i +/GrFIRfilterFCC.i +/GrFIRfilterFFF.i +/GrFIRfilterFSF.i +/GrFIRfilterSCC.i +/GrFIRfilterSIS.i +/GrFreqXlatingFIRfilterCCC.i +/GrFreqXlatingFIRfilterCCF.i +/GrFreqXlatingFIRfilterFCC.i +/GrFreqXlatingFIRfilterFCF.i +/GrFreqXlatingFIRfilterSCC.i +/GrFreqXlatingFIRfilterSCF.i +/# +/--- +/end +/generated +/files +/--- +/filter_generated.i +/gr_fir_ccc.cc +/gr_fir_ccc.h +/gr_fir_ccc_generic.cc +/gr_fir_ccc_generic.h +/gr_fir_ccf.cc +/gr_fir_ccf.h +/gr_fir_ccf_generic.cc +/gr_fir_ccf_generic.h +/gr_fir_fcc.cc +/gr_fir_fcc.h +/gr_fir_fcc_generic.cc +/gr_fir_fcc_generic.h +/gr_fir_fff.cc +/gr_fir_fff.h +/gr_fir_fff_generic.cc +/gr_fir_fff_generic.h +/gr_fir_fsf.cc +/gr_fir_fsf.h +/gr_fir_fsf_generic.cc +/gr_fir_fsf_generic.h +/gr_fir_scc.cc +/gr_fir_scc.h +/gr_fir_scc_generic.cc +/gr_fir_scc_generic.h +/gr_fir_filter_ccc.cc +/gr_fir_filter_ccc.h +/gr_fir_filter_ccc.i +/gr_fir_filter_ccf.cc +/gr_fir_filter_ccf.h +/gr_fir_filter_ccf.i +/gr_fir_filter_fcc.cc +/gr_fir_filter_fcc.h +/gr_fir_filter_fcc.i +/gr_fir_filter_fff.cc +/gr_fir_filter_fff.h +/gr_fir_filter_fff.i +/gr_fir_filter_fsf.cc +/gr_fir_filter_fsf.h +/gr_fir_filter_fsf.i +/gr_fir_filter_scc.cc +/gr_fir_filter_scc.h +/gr_fir_filter_scc.i +/gr_freq_xlating_fir_filter_ccc.cc +/gr_freq_xlating_fir_filter_ccc.h +/gr_freq_xlating_fir_filter_ccc.i +/gr_freq_xlating_fir_filter_ccf.cc +/gr_freq_xlating_fir_filter_ccf.h +/gr_freq_xlating_fir_filter_ccf.i +/gr_freq_xlating_fir_filter_fcc.cc +/gr_freq_xlating_fir_filter_fcc.h +/gr_freq_xlating_fir_filter_fcc.i +/gr_freq_xlating_fir_filter_fcf.cc +/gr_freq_xlating_fir_filter_fcf.h +/gr_freq_xlating_fir_filter_fcf.i +/gr_freq_xlating_fir_filter_scc.cc +/gr_freq_xlating_fir_filter_scc.h +/gr_freq_xlating_fir_filter_scc.i +/gr_freq_xlating_fir_filter_scf.cc +/gr_freq_xlating_fir_filter_scf.h +/gr_freq_xlating_fir_filter_scf.i +/gr_interp_fir_filter_ccc.cc +/gr_interp_fir_filter_ccc.h +/gr_interp_fir_filter_ccc.i +/gr_interp_fir_filter_ccf.cc +/gr_interp_fir_filter_ccf.h +/gr_interp_fir_filter_ccf.i +/gr_interp_fir_filter_fcc.cc +/gr_interp_fir_filter_fcc.h +/gr_interp_fir_filter_fcc.i +/gr_interp_fir_filter_fff.cc +/gr_interp_fir_filter_fff.h +/gr_interp_fir_filter_fff.i +/gr_interp_fir_filter_fsf.cc +/gr_interp_fir_filter_fsf.h +/gr_interp_fir_filter_fsf.i +/gr_interp_fir_filter_scc.cc +/gr_interp_fir_filter_scc.h +/gr_interp_fir_filter_scc.i +/gr_rational_resampler_ccc.cc +/gr_rational_resampler_ccc.h +/gr_rational_resampler_ccc.i +/gr_rational_resampler_ccf.cc +/gr_rational_resampler_ccf.h +/gr_rational_resampler_ccf.i +/gr_rational_resampler_fcc.cc +/gr_rational_resampler_fcc.h +/gr_rational_resampler_fcc.i +/gr_rational_resampler_fff.cc +/gr_rational_resampler_fff.h +/gr_rational_resampler_fff.i +/gr_rational_resampler_fsf.cc +/gr_rational_resampler_fsf.h +/gr_rational_resampler_fsf.i +/gr_rational_resampler_scc.cc +/gr_rational_resampler_scc.h +/gr_rational_resampler_scc.i +/gr_rational_resampler_base_ccc.cc +/gr_rational_resampler_base_ccc.h +/gr_rational_resampler_base_ccc.i +/gr_rational_resampler_base_ccf.cc +/gr_rational_resampler_base_ccf.h +/gr_rational_resampler_base_ccf.i +/gr_rational_resampler_base_fcc.cc +/gr_rational_resampler_base_fcc.h +/gr_rational_resampler_base_fcc.i +/gr_rational_resampler_base_fff.cc +/gr_rational_resampler_base_fff.h +/gr_rational_resampler_base_fff.i +/gr_rational_resampler_base_fsf.cc +/gr_rational_resampler_base_fsf.h +/gr_rational_resampler_base_fsf.i +/gr_rational_resampler_base_scc.cc +/gr_rational_resampler_base_scc.h +/gr_rational_resampler_base_scc.i +/stamp-* diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am index e230e88b5..838f69b92 100644 --- a/gnuradio-core/src/lib/filter/Makefile.am +++ b/gnuradio-core/src/lib/filter/Makefile.am @@ -201,7 +201,11 @@ libfilter_la_common_SOURCES = \ complex_dotprod_generic.cc \ ccomplex_dotprod_generic.cc \ float_dotprod_generic.c \ - short_dotprod_generic.c + short_dotprod_generic.c \ + gr_pfb_channelizer_ccf.cc \ + gr_pfb_decimator_ccf.cc \ + gr_pfb_interpolator_ccf.cc \ + gr_pfb_arb_resampler_ccf.cc libfilter_qa_la_common_SOURCES = \ qa_filter.cc \ @@ -276,7 +280,11 @@ grinclude_HEADERS = \ qa_filter.h \ short_dotprod_generic.h \ short_dotprod_x86.h \ - sse_debug.h + sse_debug.h \ + gr_pfb_channelizer_ccf.h \ + gr_pfb_decimator_ccf.h \ + gr_pfb_interpolator_ccf.h \ + gr_pfb_arb_resampler_ccf.h noinst_HEADERS = \ assembly.h \ @@ -327,6 +335,10 @@ swiginclude_HEADERS = \ gr_iir_filter_ffd.i \ gr_single_pole_iir_filter_ff.i \ gr_single_pole_iir_filter_cc.i \ + gr_pfb_channelizer_ccf.i \ + gr_pfb_decimator_ccf.i \ + gr_pfb_interpolator_ccf.i \ + gr_pfb_arb_resampler_ccf.i \ $(GENERATED_I) endif diff --git a/gnuradio-core/src/lib/filter/filter.i b/gnuradio-core/src/lib/filter/filter.i index 7931a4d53..16b8005be 100644 --- a/gnuradio-core/src/lib/filter/filter.i +++ b/gnuradio-core/src/lib/filter/filter.i @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2004,2005,2006,2007 Free Software Foundation, Inc. + * Copyright 2004,2005,2006,2007,2009 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -32,6 +32,10 @@ #include <gr_fractional_interpolator_cc.h> #include <gr_goertzel_fc.h> #include <gr_cma_equalizer_cc.h> +#include <gr_pfb_channelizer_ccf.h> +#include <gr_pfb_decimator_ccf.h> +#include <gr_pfb_interpolator_ccf.h> +#include <gr_pfb_arb_resampler_ccf.h> %} %include "gr_iir_filter_ffd.i" @@ -45,5 +49,12 @@ %include "gr_fractional_interpolator_cc.i" %include "gr_goertzel_fc.i" %include "gr_cma_equalizer_cc.i" +%include "gr_pfb_channelizer_ccf.i" +%include "gr_pfb_decimator_ccf.i" +%include "gr_pfb_interpolator_ccf.i" +%include "gr_pfb_arb_resampler_ccf.i" +%include "gr_pfb_decimator_ccf.i" +%include "gr_pfb_interpolator_ccf.i" +%include "gr_pfb_arb_resampler_ccf.i" %include "filter_generated.i" diff --git a/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc new file mode 100644 index 000000000..bfc4c0467 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc @@ -0,0 +1,196 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_arb_resampler_ccf.h> +#include <gr_fir_ccf.h> +#include <gr_fir_util.h> +#include <gr_io_signature.h> + +gr_pfb_arb_resampler_ccf_sptr gr_make_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size) +{ + return gr_pfb_arb_resampler_ccf_sptr (new gr_pfb_arb_resampler_ccf (rate, taps, + filter_size)); +} + + +gr_pfb_arb_resampler_ccf::gr_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size) + : gr_block ("pfb_arb_resampler_ccf", + gr_make_io_signature (1, 1, sizeof(gr_complex)), + gr_make_io_signature (1, 1, sizeof(gr_complex))), + d_updated (false) +{ + /* The number of filters is specified by the user as the filter size; + this is also the interpolation rate of the filter. We use it and the + rate provided to determine the decimation rate. This acts as a + rational resampler. The flt_rate is calculated as the residual + between the integer decimation rate and the real decimation rate and + will be used to determine to interpolation point of the resampling + process. + */ + d_int_rate = filter_size; + d_dec_rate = (unsigned int)floor(d_int_rate/rate); + d_flt_rate = (d_int_rate/rate) - d_dec_rate; + + // The accumulator keeps track of overflow to increment the stride correctly. + d_acc = 0; + + // Store the last filter between calls to work + d_last_filter = 0; + + d_filters = std::vector<gr_fir_ccf*>(d_int_rate); + + // Create an FIR filter for each channel and zero out the taps + std::vector<float> vtaps(0, d_int_rate); + for(unsigned int i = 0; i < d_int_rate; i++) { + d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps); + } + + // Now, actually set the filters' taps + set_taps(taps); +} + +gr_pfb_arb_resampler_ccf::~gr_pfb_arb_resampler_ccf () +{ + for(unsigned int i = 0; i < d_int_rate; i++) { + delete d_filters[i]; + } +} + +void +gr_pfb_arb_resampler_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_int_rate); + + // Create d_numchan vectors to store each channel's taps + d_taps.resize(d_int_rate); + + // 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_int_rate*d_taps_per_filter) { + tmp_taps.push_back(0.0); + } + + // Partition the filter + for(i = 0; i < d_int_rate; 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_int_rate]; // 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); + + d_updated = true; +} + +void +gr_pfb_arb_resampler_ccf::print_taps() +{ + unsigned int i, j; + for(i = 0; i < d_int_rate; i++) { + printf("filter[%d]: [", i); + for(j = 0; j < d_taps_per_filter; j++) { + printf(" %.4e", d_taps[i][j]); + } + printf("]\n"); + } +} + +int +gr_pfb_arb_resampler_ccf::general_work (int noutput_items, + gr_vector_int &ninput_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]; + + if (d_updated) { + d_updated = false; + return 0; // history requirements may have changed. + } + + int i = 0, j, count = 0; + gr_complex o0, o1; + + // Restore the last filter position + j = d_last_filter; + + // produce output as long as we can and there are enough input samples + while((i < noutput_items) && (count < ninput_items[0]-1)) { + + // start j by wrapping around mod the number of channels + while((j < d_int_rate) && (i < noutput_items)) { + // Take the current filter output + o0 = d_filters[j]->filter(&in[count]); + + // Take the next filter output; wrap around to 0 if necessary + if(j+1 == d_int_rate) + // Use the sample of the next input item through the first filter + o1 = d_filters[0]->filter(&in[count+1]); + else { + // Use the sample from the current input item through the nex filter + o1 = d_filters[j+1]->filter(&in[count]); + } + + //out[i] = o0; // nearest-neighbor approach + out[i] = o0 + (o1 - o0)*d_acc; // linearly interpolate between samples + i++; + + // Accumulate the position in the stream for the interpolated point. + // If it goes above 1, roll around to zero and increment the stride + // length this time by the decimation rate plus 1 for the increment + // due to the acculated position. + d_acc += d_flt_rate; + j += d_dec_rate + (int)floor(d_acc); + d_acc = fmodf(d_acc, 1.0); + } + if(i < noutput_items) { // keep state for next entry + count++; // we have fully consumed another input + j = j % d_int_rate; // roll filter around + } + } + + // Store the current filter position + d_last_filter = j; + + consume_each(count); + return i; +} diff --git a/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h new file mode 100644 index 000000000..b79a89fe9 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h @@ -0,0 +1,158 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_ARB_RESAMPLER_CCF_H +#define INCLUDED_GR_PFB_ARB_RESAMPLER_CCF_H + +#include <gr_block.h> + +class gr_pfb_arb_resampler_ccf; +typedef boost::shared_ptr<gr_pfb_arb_resampler_ccf> gr_pfb_arb_resampler_ccf_sptr; +gr_pfb_arb_resampler_ccf_sptr gr_make_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size=32); + +class gr_fir_ccf; + +/*! + * \class gr_pfb_arb_resampler_ccf + * + * \brief Polyphase filterbank arbitrary resampler with + * gr_complex input, gr_complex output and float taps + * + * \ingroup filter_blk + * + * This block takes in a signal stream and performs arbitrary + * resampling. The resampling rate can be any real + * number <EM>r</EM>. The resampling is done by constructing + * <EM>N</EM> filters where <EM>N</EM> is the interpolation rate. We + * then calculate <EM>D</EM> where <EM>D = floor(N/r)</EM>. + * + * Using <EM>N</EM> and <EM>D</EM>, we can perform rational resampling + * where <EM>N/D</EM> is a rational number close to the input rate + * <EM>r</EM> where we have <EM>N</EM> filters and we cycle through + * them as a polyphase filterbank with a stride of <EM>D</EM> so that + * <EM>i+1 = (i + D) % N</EM>. + * + * To get the arbitrary rate, we want to interpolate between two + * points. For each value out, we take an output from the current + * filter, <EM>i</EM>, and the next filter <EM>i+1</EM> and then + * linearly interpolate between the two based on the real resampling + * rate we want. + * + * The linear interpolation only provides us with an approximation to + * the real sampling rate specified. The error is a quantization error + * between the two filters we used as our interpolation points. To + * this end, the number of filters, <EM>N</EM>, used determines the + * quantization error; the larger <EM>N</EM>, the smaller the + * noise. You can design for a specified noise floor by setting the + * filter size (parameters <EM>filter_size</EM>). The size defaults to + * 32 filters, which is about as good as most implementations need. + * + * The trick with designing this filter is in how to specify the taps + * of the prototype filter. Like the PFB interpolator, the taps are + * specified using the interpolated filter rate. In this case, that + * rate is the input sample rate multiplied by the number of filters + * in the filterbank, which is also the interpolation rate. All other + * values should be relative to this rate. + * + * For example, for a 32-filter arbitrary resampler and using the + * GNU Radio's firdes utility to build the filter, we build a low-pass + * filter with a sampling rate of <EM>fs</EM>, a 3-dB bandwidth of + * <EM>BW</EM> and a transition bandwidth of <EM>TB</EM>. We can also + * specify the out-of-band attenuation to use, <EM>ATT</EM>, and the + * filter window function (a Blackman-harris window in this case). The + * first input is the gain of the filter, which we specify here as the + * interpolation rate (<EM>32</EM>). + * + * <B><EM>self._taps = gr.firdes.low_pass_2(32, 32*fs, BW, TB, + * attenuation_dB=ATT, window=gr.firdes.WIN_BLACKMAN_hARRIS)</EM></B> + * + * The theory behind this block can be found in Chapter 7.5 of + * the following book. + * + * <B><EM>f. harris, Multirate Signal Processing for Communication + * Systems," Upper Saddle River, NJ: Prentice Hall, Inc. 2004.</EM></B> + */ + +class gr_pfb_arb_resampler_ccf : public gr_block +{ + private: + /*! + * Build the polyphase filterbank arbitray resampler. + * \param rate (float) Specifies the resampling rate to use + * \param taps (vector/list of floats) The prototype filter to populate the filterbank. The taps + * should be generated at the filter_size sampling rate. + * \param filter_size (unsigned int) The number of filters in the filter bank. This is directly + related to quantization noise introduced during the resampling. + Defaults to 32 filters. + */ + friend gr_pfb_arb_resampler_ccf_sptr gr_make_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size); + + std::vector<gr_fir_ccf*> d_filters; + std::vector< std::vector<float> > d_taps; + unsigned int d_int_rate; // the number of filters (interpolation rate) + unsigned int d_dec_rate; // the stride through the filters (decimation rate) + float d_flt_rate; // residual rate for the linear interpolation + float d_acc; + unsigned int d_last_filter; + unsigned int d_taps_per_filter; + bool d_updated; + + /*! + * Build the polyphase filterbank arbitray resampler. + * \param rate (float) Specifies the resampling rate to use + * \param taps (vector/list of floats) The prototype filter to populate the filterbank. The taps + * should be generated at the filter_size sampling rate. + * \param filter_size (unsigned int) The number of filters in the filter bank. This is directly + related to quantization noise introduced during the resampling. + Defaults to 32 filters. + */ + gr_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size); + +public: + ~gr_pfb_arb_resampler_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. The taps + * should be generated at the interpolated sampling rate. + */ + void set_taps (const std::vector<float> &taps); + + /*! + * Print all of the filterbank taps to screen. + */ + void print_taps(); + + int general_work (int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif diff --git a/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i new file mode 100644 index 000000000..e365e0314 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i @@ -0,0 +1,41 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,pfb_arb_resampler_ccf); + +gr_pfb_arb_resampler_ccf_sptr gr_make_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size=32); + +class gr_pfb_arb_resampler_ccf : public gr_block +{ + private: + gr_pfb_arb_resampler_ccf (float rate, + const std::vector<float> &taps, + unsigned int filter_size); + + public: + ~gr_pfb_arb_resampler_ccf (); + + void set_taps (const std::vector<float> &taps); + void print_taps(); +}; diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc new file mode 100644 index 000000000..7be611e23 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc @@ -0,0 +1,150 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_channelizer_ccf.h> +#include <gr_fir_ccf.h> +#include <gr_fir_util.h> +#include <gri_fft.h> +#include <gr_io_signature.h> + +gr_pfb_channelizer_ccf_sptr gr_make_pfb_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps) +{ + return gr_pfb_channelizer_ccf_sptr (new gr_pfb_channelizer_ccf (numchans, taps)); +} + + +gr_pfb_channelizer_ccf::gr_pfb_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps) + : gr_sync_block ("pfb_channelizer_ccf", + gr_make_io_signature (numchans, numchans, sizeof(gr_complex)), + gr_make_io_signature (1, 1, numchans*sizeof(gr_complex))), + d_updated (false) +{ + d_numchans = numchans; + d_filters = std::vector<gr_fir_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] = gr_fir_util::create_gr_fir_ccf(vtaps); + } + + // Now, actually set the filters' taps + set_taps(taps); + + // Create the FFT to handle the output de-spinning of the channels + d_fft = new gri_fft_complex (d_numchans, false); +} + +gr_pfb_channelizer_ccf::~gr_pfb_channelizer_ccf () +{ + for(unsigned int i = 0; i < d_numchans; i++) { + delete d_filters[i]; + } +} + +void +gr_pfb_channelizer_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); + + d_updated = true; +} + +void +gr_pfb_channelizer_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_channelizer_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]; + + if (d_updated) { + d_updated = false; + return 0; // history requirements may have changed. + } + + for(int i = 0; i < noutput_items; i++) { + // Move through filters from bottom to top + for(int j = d_numchans-1; j >= 0; j--) { + // Take in the items from the first input stream to d_numchans + in = (gr_complex*)input_items[d_numchans - 1 - j]; + + // Filter current input stream from bottom filter to top + d_fft->get_inbuf()[j] = d_filters[j]->filter(&in[i]); + } + + // despin through FFT + d_fft->execute(); + memcpy(&out[d_numchans*i], d_fft->get_outbuf(), d_numchans*sizeof(gr_complex)); + } + + return noutput_items; +} diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h new file mode 100644 index 000000000..7d0a31c59 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h @@ -0,0 +1,144 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_CHANNELIZER_CCF_H +#define INCLUDED_GR_PFB_CHANNELIZER_CCF_H + +#include <gr_sync_block.h> + +class gr_pfb_channelizer_ccf; +typedef boost::shared_ptr<gr_pfb_channelizer_ccf> gr_pfb_channelizer_ccf_sptr; +gr_pfb_channelizer_ccf_sptr gr_make_pfb_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps); + +class gr_fir_ccf; +class gri_fft_complex; + + +/*! + * \class gr_pfb_channelizer_ccf + * + * \brief Polyphase filterbank channelizer with + * gr_complex input, gr_complex output and float taps + * + * \ingroup filter_blk + * + * This block takes in complex inputs and channelizes it to <EM>M</EM> + * channels of equal bandwidth. Each of the resulting channels is + * decimated to the new rate that is the input sampling rate + * <EM>fs</EM> divided by the number of channels, <EM>M</EM>. + * + * The PFB channelizer code takes the taps generated above and builds + * a set of filters. The set contains <EM>M</EM> number of filters + * and each filter contains ceil(taps.size()/decim) number of taps. + * Each tap from the filter prototype is sequentially inserted into + * the next filter. When all of the input taps are used, the remaining + * filters in the filterbank are filled out with 0's to make sure each + * filter has the same number of taps. + * + * Each filter operates using the gr_fir filter classs of GNU Radio, + * which takes the input stream at <EM>i</EM> and performs the inner + * product calculation to <EM>i+(n-1)</EM> where <EM>n</EM> is the + * number of filter taps. To efficiently handle this in the GNU Radio + * structure, each filter input must come from its own input + * stream. So the channelizer must be provided with <EM>M</EM> streams + * where the input stream has been deinterleaved. This is most easily + * done using the gr_stream_to_streams block. + * + * The output is then produced as a vector, where index <EM>i</EM> in + * the vector is the next sample from the <EM>i</EM>th channel. This + * is most easily handled by sending the output to a + * gr_vector_to_streams block to handle the conversion and passing + * <EM>M</EM> streams out. + * + * The input and output formatting is done using a hier_block2 called + * pfb_channelizer_ccf. This can take in a single stream and outputs + * <EM>M</EM> streams based on the behavior described above. + * + * The filter's taps should be based on the input sampling rate. + * + * For example, using the GNU Radio's firdes utility to building + * filters, we build a low-pass filter with a sampling rate of + * <EM>fs</EM>, a 3-dB bandwidth of <EM>BW</EM> and a transition + * bandwidth of <EM>TB</EM>. We can also specify the out-of-band + * attenuation to use, <EM>ATT</EM>, and the filter window + * function (a Blackman-harris window in this case). The first input + * is the gain of the filter, which we specify here as unity. + * + * <B><EM>self._taps = gr.firdes.low_pass_2(1, fs, BW, TB, + * attenuation_dB=ATT, window=gr.firdes.WIN_BLACKMAN_hARRIS)</EM></B> + * + * The theory behind this block can be found in Chapter 6 of + * the following book. + * + * <B><EM>f. harris, Multirate Signal Processing for Communication + * Systems," Upper Saddle River, NJ: Prentice Hall, Inc. 2004. + * + */ + +class gr_pfb_channelizer_ccf : public gr_sync_block +{ + private: + /*! + * Build the polyphase filterbank decimator. + * \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_channelizer_ccf_sptr gr_make_pfb_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps); + + std::vector<gr_fir_ccf*> d_filters; + std::vector< std::vector<float> > d_taps; + gri_fft_complex *d_fft; + unsigned int d_numchans; + unsigned int d_taps_per_filter; + bool d_updated; + + /*! + * Build the polyphase filterbank decimator. + * \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_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps); + +public: + ~gr_pfb_channelizer_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/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i new file mode 100644 index 000000000..4bef90e22 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i @@ -0,0 +1,38 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,pfb_channelizer_ccf); + +gr_pfb_channelizer_ccf_sptr gr_make_pfb_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps); + +class gr_pfb_channelizer_ccf : public gr_sync_block +{ + private: + gr_pfb_channelizer_ccf (unsigned int numchans, + const std::vector<float> &taps); + + public: + ~gr_pfb_channelizer_ccf (); + + void set_taps (const std::vector<float> &taps); +}; diff --git a/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc new file mode 100644 index 000000000..b334f5878 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc @@ -0,0 +1,174 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_decimator_ccf.h> +#include <gr_fir_ccf.h> +#include <gr_fir_util.h> +#include <gri_fft.h> +#include <gr_io_signature.h> +#include <gr_expj.h> + +gr_pfb_decimator_ccf_sptr gr_make_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel) +{ + return gr_pfb_decimator_ccf_sptr (new gr_pfb_decimator_ccf (decim, taps, channel)); +} + + +gr_pfb_decimator_ccf::gr_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel) + : gr_sync_block ("pfb_decimator_ccf", + gr_make_io_signature (decim, decim, sizeof(gr_complex)), + gr_make_io_signature (1, 1, sizeof(gr_complex))), + d_updated (false) +{ + d_rate = decim; + d_filters = std::vector<gr_fir_ccf*>(d_rate); + d_chan = channel; + d_rotator = new gr_complex[d_rate]; + + // Create an FIR filter for each channel and zero out the taps + std::vector<float> vtaps(0, d_rate); + for(unsigned int i = 0; i < d_rate; i++) { + d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps); + d_rotator[i] = gr_expj(i*2*M_PI*d_chan/d_rate); + } + + // Now, actually set the filters' taps + set_taps(taps); + + // Create the FFT to handle the output de-spinning of the channels + d_fft = new gri_fft_complex (d_rate, false); +} + +gr_pfb_decimator_ccf::~gr_pfb_decimator_ccf () +{ + for(unsigned int i = 0; i < d_rate; i++) { + delete d_filters[i]; + } +} + +void +gr_pfb_decimator_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_rate); + + // Create d_numchan vectors to store each channel's taps + d_taps.resize(d_rate); + + // 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_rate*d_taps_per_filter) { + tmp_taps.push_back(0.0); + } + + // Partition the filter + for(i = 0; i < d_rate; 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_rate]; // 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); + + d_updated = true; +} + +void +gr_pfb_decimator_ccf::print_taps() +{ + unsigned int i, j; + for(i = 0; i < d_rate; i++) { + printf("filter[%d]: [", i); + for(j = 0; j < d_taps_per_filter; j++) { + printf(" %.4e", d_taps[i][j]); + } + printf("]\n\n"); + } +} + +#define ROTATEFFT + +int +gr_pfb_decimator_ccf::work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + gr_complex *in; + gr_complex *out = (gr_complex *) output_items[0]; + + if (d_updated) { + d_updated = false; + return 0; // history requirements may have changed. + } + + int i; + for(i = 0; i < noutput_items; i++) { + // Move through filters from bottom to top + out[i] = 0; + for(int j = d_rate-1; j >= 0; j--) { + // Take in the items from the first input stream to d_rate + in = (gr_complex*)input_items[d_rate - 1 - j]; + + // Filter current input stream from bottom filter to top + // The rotate them by expj(j*k*2pi/M) where M is the number of filters + // (the decimation rate) and k is the channel number to extract + + // This is the real math that goes on; we abuse the FFT to do this quickly + // for decimation rates > N where N is a small number (~5): + // out[i] += d_filters[j]->filter(&in[i])*gr_expj(j*d_chan*2*M_PI/d_rate); +#ifdef ROTATEFFT + d_fft->get_inbuf()[j] = d_filters[j]->filter(&in[i]); +#else + out[i] += d_filters[j]->filter(&in[i])*d_rotator[i]; +#endif + } + +#ifdef ROTATEFFT + // Perform the FFT to do the complex multiply despinning for all channels + d_fft->execute(); + + // Select only the desired channel out + out[i] = d_fft->get_outbuf()[d_chan]; +#endif + + } + + return noutput_items; +} diff --git a/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h new file mode 100644 index 000000000..83997c0c9 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h @@ -0,0 +1,148 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_DECIMATOR_CCF_H +#define INCLUDED_GR_PFB_DECIMATOR_CCF_H + +#include <gr_sync_block.h> + +class gr_pfb_decimator_ccf; +typedef boost::shared_ptr<gr_pfb_decimator_ccf> gr_pfb_decimator_ccf_sptr; +gr_pfb_decimator_ccf_sptr gr_make_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel=0); + +class gr_fir_ccf; +class gri_fft_complex; + +/*! + * \class gr_pfb_decimator_ccf + * \brief Polyphase filterbank bandpass decimator with gr_complex + * input, gr_complex output and float taps + * + * \ingroup filter_blk + * + * This block takes in a signal stream and performs interger down- + * sampling (decimation) with a polyphase filterbank. The first input + * is the integer specifying how much to decimate by. The second + * input is a vector (Python list) of floating-point taps of the + * prototype filter. The third input specifies the channel to extract. + * By default, the zeroth channel is used, which is the baseband + * channel (first Nyquist zone). + * + * The <EM>channel</EM> parameter specifies which channel to use since + * this class is capable of bandpass decimation. Given a complex input + * stream at a sampling rate of <EM>fs</EM> and a decimation rate of + * <EM>decim</EM>, the input frequency domain is split into + * <EM>decim</EM> channels that represent the Nyquist zones. Using the + * polyphase filterbank, we can select any one of these channels to + * decimate. + * + * The output signal will be the basebanded and decimated signal from + * that channel. This concept is very similar to the PFB channelizer + * (see #gr_pfb_channelizer_ccf) where only a single channel is + * extracted at a time. + * + * The filter's taps should be based on the sampling rate before + * decimation. + * + * For example, using the GNU Radio's firdes utility to building + * filters, we build a low-pass filter with a sampling rate of + * <EM>fs</EM>, a 3-dB bandwidth of <EM>BW</EM> and a transition + * bandwidth of <EM>TB</EM>. We can also specify the out-of-band + * attenuation to use, <EM>ATT</EM>, and the filter window + * function (a Blackman-harris window in this case). The first input + * is the gain of the filter, which we specify here as unity. + * + * <B><EM>self._taps = gr.firdes.low_pass_2(1, fs, BW, TB, + * attenuation_dB=ATT, window=gr.firdes.WIN_BLACKMAN_hARRIS)</EM></B> + * + * The PFB decimator code takes the taps generated above and builds a + * set of filters. The set contains <EM>decim</EM> number of filters + * and each filter contains ceil(taps.size()/decim) number of taps. + * Each tap from the filter prototype is sequentially inserted into + * the next filter. When all of the input taps are used, the remaining + * filters in the filterbank are filled out with 0's to make sure each + * filter has the same number of taps. + * + * The theory behind this block can be found in Chapter 6 of + * the following book. + * + * <B><EM>f. harris, Multirate Signal Processing for Communication + * Systems," Upper Saddle River, NJ: Prentice Hall, Inc. 2004.</EM></B> + */ + +class gr_pfb_decimator_ccf : public gr_sync_block +{ + private: + /*! + * Build the polyphase filterbank decimator. + * \param decim (unsigned integer) Specifies the decimation rate to use + * \param taps (vector/list of floats) The prototype filter to populate the filterbank. + * \param channel (unsigned integer) Selects the channel to return [default=0]. + */ + friend gr_pfb_decimator_ccf_sptr gr_make_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel); + + std::vector<gr_fir_ccf*> d_filters; + std::vector< std::vector<float> > d_taps; + gri_fft_complex *d_fft; + unsigned int d_rate; + unsigned int d_chan; + unsigned int d_taps_per_filter; + bool d_updated; + gr_complex *d_rotator; + + /*! + * Build the polyphase filterbank decimator. + * \param decim (unsigned integer) Specifies the decimation rate to use + * \param taps (vector/list of floats) The prototype filter to populate the filterbank. + * \param channel (unsigned integer) Selects the channel to return [default=0]. + */ + gr_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel); + +public: + ~gr_pfb_decimator_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(); + + //void set_channel (unsigned int channel); + + int work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif diff --git a/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i new file mode 100644 index 000000000..c4215fce1 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i @@ -0,0 +1,41 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,pfb_decimator_ccf); + +gr_pfb_decimator_ccf_sptr gr_make_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel); + +class gr_pfb_decimator_ccf : public gr_sync_block +{ + private: + gr_pfb_decimator_ccf (unsigned int decim, + const std::vector<float> &taps, + unsigned int channel); + + public: + ~gr_pfb_decimator_ccf (); + + void set_taps (const std::vector<float> &taps); + //void set_channel (unsigned int channel); +}; diff --git a/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc new file mode 100644 index 000000000..d5eba885c --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc @@ -0,0 +1,142 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_interpolator_ccf.h> +#include <gr_fir_ccf.h> +#include <gr_fir_util.h> +#include <gr_io_signature.h> + +gr_pfb_interpolator_ccf_sptr gr_make_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps) +{ + return gr_pfb_interpolator_ccf_sptr (new gr_pfb_interpolator_ccf (interp, taps)); +} + + +gr_pfb_interpolator_ccf::gr_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps) + : gr_sync_interpolator ("pfb_interpolator_ccf", + gr_make_io_signature (1, 1, sizeof(gr_complex)), + gr_make_io_signature (1, 1, sizeof(gr_complex)), + interp), + d_updated (false) +{ + d_rate = interp; + d_filters = std::vector<gr_fir_ccf*>(d_rate); + + // Create an FIR filter for each channel and zero out the taps + std::vector<float> vtaps(0, d_rate); + for(unsigned int i = 0; i < d_rate; i++) { + d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps); + } + + // Now, actually set the filters' taps + set_taps(taps); +} + +gr_pfb_interpolator_ccf::~gr_pfb_interpolator_ccf () +{ + for(unsigned int i = 0; i < d_rate; i++) { + delete d_filters[i]; + } +} + +void +gr_pfb_interpolator_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_rate); + + // Create d_numchan vectors to store each channel's taps + //std::vector< std::vector<float> > vtaps(d_rate); + d_taps.resize(d_rate); + + // 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_rate*d_taps_per_filter) { + tmp_taps.push_back(0.0); + } + + // Partition the filter + for(i = 0; i < d_rate; 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_rate]; // 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); + + d_updated = true; +} + +void +gr_pfb_interpolator_ccf::print_taps() +{ + unsigned int i, j; + for(i = 0; i < d_rate; 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_interpolator_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]; + + if (d_updated) { + d_updated = false; + return 0; // history requirements may have changed. + } + + int i = 0, count = 0; + + while(i < noutput_items) { + for(int j = 0; j < d_rate; j++) { + out[i] = d_filters[j]->filter(&in[count]); + i++; + } + count++; + } + + return i; +} diff --git a/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h new file mode 100644 index 000000000..50849d510 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h @@ -0,0 +1,129 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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_INTERPOLATOR_CCF_H +#define INCLUDED_GR_PFB_INTERPOLATOR_CCF_H + +#include <gr_sync_interpolator.h> + +class gr_pfb_interpolator_ccf; +typedef boost::shared_ptr<gr_pfb_interpolator_ccf> gr_pfb_interpolator_ccf_sptr; +gr_pfb_interpolator_ccf_sptr gr_make_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps); + +class gr_fir_ccf; + +/*! + * \class gr_pfb_interpolator_ccf + * \brief Polyphase filterbank interpolator with gr_complex input, + * gr_complex output and float taps + * + * \ingroup filter_blk + * + * This block takes in a signal stream and performs interger up- + * sampling (interpolation) with a polyphase filterbank. The first + * input is the integer specifying how much to interpolate by. The + * second input is a vector (Python list) of floating-point taps of + * the prototype filter. + * + * The filter's taps should be based on the interpolation rate + * specified. That is, the bandwidth specified is relative to the + * bandwidth after interpolation. + * + * For example, using the GNU Radio's firdes utility to building + * filters, we build a low-pass filter with a sampling rate of + * <EM>fs</EM>, a 3-dB bandwidth of <EM>BW</EM> and a transition + * bandwidth of <EM>TB</EM>. We can also specify the out-of-band + * attenuation to use, ATT, and the filter window function (a + * Blackman-harris window in this case). The first input is the gain, + * which is also specified as the interpolation rate so that the + * output levels are the same as the input (this creates an overall + * increase in power). + * + * <B><EM>self._taps = gr.firdes.low_pass_2(interp, interp*fs, BW, TB, + * attenuation_dB=ATT, window=gr.firdes.WIN_BLACKMAN_hARRIS)</EM></B> + * + * The PFB interpolator code takes the taps generated above and builds + * a set of filters. The set contains <EM>interp</EM> number of + * filters and each filter contains ceil(taps.size()/interp) number of + * taps. Each tap from the filter prototype is sequentially inserted + * into the next filter. When all of the input taps are used, the + * remaining filters in the filterbank are filled out with 0's to make + * sure each filter has the same number of taps. + * + * The theory behind this block can be found in Chapter 7.1 of the + * following book. + * + * <B><EM>f. harris, <EM>Multirate Signal Processing for Communication + * Systems</EM>," Upper Saddle River, NJ: Prentice Hall, + * Inc. 2004.</EM></B> + */ + +class gr_pfb_interpolator_ccf : public gr_sync_interpolator +{ + private: + /*! + * Build the polyphase filterbank interpolator. + * \param interp (unsigned integer) Specifies the interpolation rate to use + * \param taps (vector/list of floats) The prototype filter to populate the filterbank. The taps + * should be generated at the interpolated sampling rate. + */ + friend gr_pfb_interpolator_ccf_sptr gr_make_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps); + + std::vector<gr_fir_ccf*> d_filters; + std::vector< std::vector<float> > d_taps; + unsigned int d_rate; + unsigned int d_taps_per_filter; + bool d_updated; + + /*! + * Construct a Polyphase filterbank interpolator + * \param interp (unsigned integer) Specifies the interpolation rate to use + * \param taps (vector/list of floats) The prototype filter to populate the filterbank. The taps + * should be generated at the interpolated sampling rate. + */ + gr_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps); + +public: + ~gr_pfb_interpolator_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. The taps + * should be generated at the interpolated sampling rate. + */ + 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/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i new file mode 100644 index 000000000..cf4302d45 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i @@ -0,0 +1,39 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,pfb_interpolator_ccf); + +gr_pfb_interpolator_ccf_sptr gr_make_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps); + +class gr_pfb_interpolator_ccf : public gr_sync_interpolator +{ + private: + gr_pfb_interpolator_ccf (unsigned int interp, + const std::vector<float> &taps); + + public: + ~gr_pfb_interpolator_ccf (); + + void set_taps (const std::vector<float> &taps); + void print_taps(); +}; diff --git a/gnuradio-core/src/lib/g72x/.gitignore b/gnuradio-core/src/lib/g72x/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gnuradio-core/src/lib/g72x/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-core/src/lib/general/.gitignore b/gnuradio-core/src/lib/general/.gitignore new file mode 100644 index 000000000..4f3696f58 --- /dev/null +++ b/gnuradio-core/src/lib/general/.gitignore @@ -0,0 +1,323 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/generate-stamp +/gr_constants.cc +/GrFIRfilterCCC.cc +/GrFIRfilterCCC.h +/GrFIRfilterCCF.cc +/GrFIRfilterCCF.h +/GrFIRfilterFCC.cc +/GrFIRfilterFCC.h +/GrFIRfilterFFF.cc +/GrFIRfilterFFF.h +/GrFIRfilterFSF.cc +/GrFIRfilterFSF.h +/GrFIRfilterSCC.cc +/GrFIRfilterSCC.h +/GrFIRfilterSIS.cc +/GrFIRfilterSIS.h +/GrFreqXlatingFIRfilterCCC.cc +/GrFreqXlatingFIRfilterCCC.h +/GrFreqXlatingFIRfilterCCF.cc +/GrFreqXlatingFIRfilterCCF.h +/GrFreqXlatingFIRfilterFCC.cc +/GrFreqXlatingFIRfilterFCC.h +/GrFreqXlatingFIRfilterFCF.cc +/GrFreqXlatingFIRfilterFCF.h +/GrFreqXlatingFIRfilterSCC.cc +/GrFreqXlatingFIRfilterSCC.h +/GrFreqXlatingFIRfilterSCF.cc +/GrFreqXlatingFIRfilterSCF.h +/gr_fir_CCC.cc +/gr_fir_CCC.h +/gr_fir_CCC_generic.cc +/gr_fir_CCC_generic.h +/gr_fir_CCF.cc +/gr_fir_CCF.h +/gr_fir_CCF_generic.cc +/gr_fir_CCF_generic.h +/gr_fir_FCC.cc +/gr_fir_FCC.h +/gr_fir_FCC_generic.cc +/gr_fir_FCC_generic.h +/gr_fir_FFF.cc +/gr_fir_FFF.h +/gr_fir_FFF_generic.cc +/gr_fir_FFF_generic.h +/gr_fir_FSF.cc +/gr_fir_FSF.h +/gr_fir_FSF_generic.cc +/gr_fir_FSF_generic.h +/gr_fir_SCC.cc +/gr_fir_SCC.h +/gr_fir_SCC_generic.cc +/gr_fir_SCC_generic.h +/gr_fir_SIS.cc +/gr_fir_SIS.h +/gr_fir_SIS_generic.cc +/gr_fir_SIS_generic.h +/gr_fir_sysconfig.cc +/gr_fir_sysconfig.h +/gr_fir_sysconfig_generic.cc +/gr_fir_sysconfig_generic.h +/gr_fir_util.cc +/gr_fir_util.h +/GrFIRfilterCCC.i +/GrFIRfilterCCF.i +/GrFIRfilterFCC.i +/GrFIRfilterFFF.i +/GrFIRfilterFSF.i +/GrFIRfilterSCC.i +/GrFIRfilterSIS.i +/GrFreqXlatingFIRfilterCCC.i +/GrFreqXlatingFIRfilterCCF.i +/GrFreqXlatingFIRfilterFCC.i +/GrFreqXlatingFIRfilterFCF.i +/GrFreqXlatingFIRfilterSCC.i +/GrFreqXlatingFIRfilterSCF.i +/# --- generated files --- +/gr_add_cc.cc +/gr_add_cc.h +/gr_add_cc.i +/gr_add_const_c.cc +/gr_add_const_c.h +/gr_add_const_c.i +/gr_add_const_cc.cc +/gr_add_const_cc.h +/gr_add_const_cc.i +/gr_add_const_f.cc +/gr_add_const_f.h +/gr_add_const_f.i +/gr_add_const_ff.cc +/gr_add_const_ff.h +/gr_add_const_ff.i +/gr_add_const_i.cc +/gr_add_const_i.h +/gr_add_const_i.i +/gr_add_const_ii.cc +/gr_add_const_ii.h +/gr_add_const_ii.i +/gr_add_const_s.cc +/gr_add_const_s.h +/gr_add_const_s.i +/gr_add_const_sf.cc +/gr_add_const_sf.h +/gr_add_const_sf.i +/gr_add_const_ss.cc +/gr_add_const_ss.h +/gr_add_const_ss.i +/gr_add_const_vcc.cc +/gr_add_const_vcc.h +/gr_add_const_vcc.i +/gr_add_const_vff.cc +/gr_add_const_vff.h +/gr_add_const_vff.i +/gr_add_const_vii.cc +/gr_add_const_vii.h +/gr_add_const_vii.i +/gr_add_const_vss.cc +/gr_add_const_vss.h +/gr_add_const_vss.i +/gr_add_ff.cc +/gr_add_ff.h +/gr_add_ff.i +/gr_add_ii.cc +/gr_add_ii.h +/gr_add_ii.i +/gr_add_ss.cc +/gr_add_ss.h +/gr_add_ss.i +/gr_add_vcc.cc +/gr_add_vcc.h +/gr_add_vcc.i +/gr_add_vff.cc +/gr_add_vff.h +/gr_add_vff.i +/gr_add_vii.cc +/gr_add_vii.h +/gr_add_vii.i +/gr_add_vss.cc +/gr_add_vss.h +/gr_add_vss.i +/gr_divide_cc.cc +/gr_divide_cc.h +/gr_divide_cc.i +/gr_divide_ff.cc +/gr_divide_ff.h +/gr_divide_ff.i +/gr_divide_ii.cc +/gr_divide_ii.h +/gr_divide_ii.i +/gr_divide_ss.cc +/gr_divide_ss.h +/gr_divide_ss.i +/gr_multiply_cc.cc +/gr_multiply_cc.h +/gr_multiply_cc.i +/gr_multiply_const_cc.cc +/gr_multiply_const_cc.h +/gr_multiply_const_cc.i +/gr_multiply_const_ff.cc +/gr_multiply_const_ff.h +/gr_multiply_const_ff.i +/gr_multiply_const_ii.cc +/gr_multiply_const_ii.h +/gr_multiply_const_ii.i +/gr_multiply_const_ss.cc +/gr_multiply_const_ss.h +/gr_multiply_const_ss.i +/gr_multiply_ff.cc +/gr_multiply_ff.h +/gr_multiply_ff.i +/gr_multiply_ii.cc +/gr_multiply_ii.h +/gr_multiply_ii.i +/gr_multiply_ss.cc +/gr_multiply_ss.h +/gr_multiply_ss.i +/gr_multiply_vcc.cc +/gr_multiply_vcc.h +/gr_multiply_vcc.i +/gr_multiply_vff.cc +/gr_multiply_vff.h +/gr_multiply_vff.i +/gr_multiply_vii.cc +/gr_multiply_vii.h +/gr_multiply_vii.i +/gr_multiply_vss.cc +/gr_multiply_vss.h +/gr_multiply_vss.i +/gr_multiply_const_vcc.cc +/gr_multiply_const_vcc.h +/gr_multiply_const_vcc.i +/gr_multiply_const_vff.cc +/gr_multiply_const_vff.h +/gr_multiply_const_vff.i +/gr_multiply_const_vii.cc +/gr_multiply_const_vii.h +/gr_multiply_const_vii.i +/gr_multiply_const_vss.cc +/gr_multiply_const_vss.h +/gr_multiply_const_vss.i +/gr_noise_source_c.cc +/gr_noise_source_c.h +/gr_noise_source_c.i +/gr_noise_source_f.cc +/gr_noise_source_f.h +/gr_noise_source_f.i +/gr_noise_source_i.cc +/gr_noise_source_i.h +/gr_noise_source_i.i +/gr_noise_source_s.cc +/gr_noise_source_s.h +/gr_noise_source_s.i +/gr_sig_source_c.cc +/gr_sig_source_c.h +/gr_sig_source_c.i +/gr_sig_source_f.cc +/gr_sig_source_f.h +/gr_sig_source_f.i +/gr_sig_source_i.cc +/gr_sig_source_i.h +/gr_sig_source_i.i +/gr_sig_source_s.cc +/gr_sig_source_s.h +/gr_sig_source_s.i +/gr_sub_cc.cc +/gr_sub_cc.h +/gr_sub_cc.i +/gr_sub_ff.cc +/gr_sub_ff.h +/gr_sub_ff.i +/gr_sub_ii.cc +/gr_sub_ii.h +/gr_sub_ii.i +/gr_sub_ss.cc +/gr_sub_ss.h +/gr_sub_ss.i +/gr_vector_sink_b.cc +/gr_vector_sink_b.h +/gr_vector_sink_b.i +/gr_vector_sink_c.cc +/gr_vector_sink_c.h +/gr_vector_sink_c.i +/gr_vector_sink_f.cc +/gr_vector_sink_f.h +/gr_vector_sink_f.i +/gr_vector_sink_i.cc +/gr_vector_sink_i.h +/gr_vector_sink_i.i +/gr_vector_sink_s.cc +/gr_vector_sink_s.h +/gr_vector_sink_s.i +/gr_vector_source_b.cc +/gr_vector_source_b.h +/gr_vector_source_b.i +/gr_vector_source_c.cc +/gr_vector_source_c.h +/gr_vector_source_c.i +/gr_vector_source_f.cc +/gr_vector_source_f.h +/gr_vector_source_f.i +/gr_vector_source_i.cc +/gr_vector_source_i.h +/gr_vector_source_i.i +/gr_vector_source_s.cc +/gr_vector_source_s.h +/gr_vector_source_s.i +/gr_mute_cc.cc +/gr_mute_cc.h +/gr_mute_cc.i +/gr_mute_ff.cc +/gr_mute_ff.h +/gr_mute_ff.i +/gr_mute_ii.cc +/gr_mute_ii.h +/gr_mute_ii.i +/gr_mute_ss.cc +/gr_mute_ss.h +/gr_mute_ss.i +/gr_chunks_to_symbols_bc.cc +/gr_chunks_to_symbols_bc.h +/gr_chunks_to_symbols_bc.i +/gr_chunks_to_symbols_bf.cc +/gr_chunks_to_symbols_bf.h +/gr_chunks_to_symbols_bf.i +/gr_chunks_to_symbols_ic.cc +/gr_chunks_to_symbols_ic.h +/gr_chunks_to_symbols_ic.i +/gr_chunks_to_symbols_if.cc +/gr_chunks_to_symbols_if.h +/gr_chunks_to_symbols_if.i +/gr_chunks_to_symbols_sc.cc +/gr_chunks_to_symbols_sc.h +/gr_chunks_to_symbols_sc.i +/gr_chunks_to_symbols_sf.cc +/gr_chunks_to_symbols_sf.h +/gr_chunks_to_symbols_sf.i +/gr_packed_to_unpacked_bb.cc +/gr_packed_to_unpacked_bb.h +/gr_packed_to_unpacked_bb.i +/gr_packed_to_unpacked_ii.cc +/gr_packed_to_unpacked_ii.h +/gr_packed_to_unpacked_ii.i +/gr_packed_to_unpacked_ss.cc +/gr_packed_to_unpacked_ss.h +/gr_packed_to_unpacked_ss.i +/gr_unpacked_to_packed_bb.cc +/gr_unpacked_to_packed_bb.h +/gr_unpacked_to_packed_bb.i +/gr_unpacked_to_packed_ii.cc +/gr_unpacked_to_packed_ii.h +/gr_unpacked_to_packed_ii.i +/gr_unpacked_to_packed_ss.cc +/gr_unpacked_to_packed_ss.h +/gr_unpacked_to_packed_ss.i +/# --- end generated files --- diff --git a/gnuradio-core/src/lib/gengen/.gitignore b/gnuradio-core/src/lib/gengen/.gitignore new file mode 100644 index 000000000..ecd4cb0d5 --- /dev/null +++ b/gnuradio-core/src/lib/gengen/.gitignore @@ -0,0 +1,418 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/generate-stamp +/GrFIRfilterCCC.cc +/GrFIRfilterCCC.h +/GrFIRfilterCCF.cc +/GrFIRfilterCCF.h +/GrFIRfilterFCC.cc +/GrFIRfilterFCC.h +/GrFIRfilterFFF.cc +/GrFIRfilterFFF.h +/GrFIRfilterFSF.cc +/GrFIRfilterFSF.h +/GrFIRfilterSCC.cc +/GrFIRfilterSCC.h +/GrFIRfilterSIS.cc +/GrFIRfilterSIS.h +/GrFreqXlatingFIRfilterCCC.cc +/GrFreqXlatingFIRfilterCCC.h +/GrFreqXlatingFIRfilterCCF.cc +/GrFreqXlatingFIRfilterCCF.h +/GrFreqXlatingFIRfilterFCC.cc +/GrFreqXlatingFIRfilterFCC.h +/GrFreqXlatingFIRfilterFCF.cc +/GrFreqXlatingFIRfilterFCF.h +/GrFreqXlatingFIRfilterSCC.cc +/GrFreqXlatingFIRfilterSCC.h +/GrFreqXlatingFIRfilterSCF.cc +/GrFreqXlatingFIRfilterSCF.h +/gr_fir_CCC.cc +/gr_fir_CCC.h +/gr_fir_CCC_generic.cc +/gr_fir_CCC_generic.h +/gr_fir_CCF.cc +/gr_fir_CCF.h +/gr_fir_CCF_generic.cc +/gr_fir_CCF_generic.h +/gr_fir_FCC.cc +/gr_fir_FCC.h +/gr_fir_FCC_generic.cc +/gr_fir_FCC_generic.h +/gr_fir_FFF.cc +/gr_fir_FFF.h +/gr_fir_FFF_generic.cc +/gr_fir_FFF_generic.h +/gr_fir_FSF.cc +/gr_fir_FSF.h +/gr_fir_FSF_generic.cc +/gr_fir_FSF_generic.h +/gr_fir_SCC.cc +/gr_fir_SCC.h +/gr_fir_SCC_generic.cc +/gr_fir_SCC_generic.h +/gr_fir_SIS.cc +/gr_fir_SIS.h +/gr_fir_SIS_generic.cc +/gr_fir_SIS_generic.h +/gr_fir_sysconfig.cc +/gr_fir_sysconfig.h +/gr_fir_sysconfig_generic.cc +/gr_fir_sysconfig_generic.h +/gr_fir_util.cc +/gr_fir_util.h +/GrFIRfilterCCC.i +/GrFIRfilterCCF.i +/GrFIRfilterFCC.i +/GrFIRfilterFFF.i +/GrFIRfilterFSF.i +/GrFIRfilterSCC.i +/GrFIRfilterSIS.i +/GrFreqXlatingFIRfilterCCC.i +/GrFreqXlatingFIRfilterCCF.i +/GrFreqXlatingFIRfilterFCC.i +/GrFreqXlatingFIRfilterFCF.i +/GrFreqXlatingFIRfilterSCC.i +/GrFreqXlatingFIRfilterSCF.i +/# --- generated files --- +/gr_add_cc.cc +/gr_add_cc.h +/gr_add_cc.i +/gr_add_const_c.cc +/gr_add_const_cc.cc +/gr_add_const_cc.h +/gr_add_const_cc.i +/gr_add_const_c.h +/gr_add_const_c.i +/gr_add_const_f.cc +/gr_add_const_ff.cc +/gr_add_const_ff.h +/gr_add_const_ff.i +/gr_add_const_f.h +/gr_add_const_f.i +/gr_add_const_i.cc +/gr_add_const_i.h +/gr_add_const_i.i +/gr_add_const_ii.cc +/gr_add_const_ii.h +/gr_add_const_ii.i +/gr_add_const_s.cc +/gr_add_const_sf.cc +/gr_add_const_sf.h +/gr_add_const_sf.i +/gr_add_const_s.h +/gr_add_const_s.i +/gr_add_const_ss.cc +/gr_add_const_ss.h +/gr_add_const_ss.i +/gr_add_const_vcc.cc +/gr_add_const_vcc.h +/gr_add_const_vcc.i +/gr_add_const_vff.cc +/gr_add_const_vff.h +/gr_add_const_vff.i +/gr_add_const_vii.cc +/gr_add_const_vii.h +/gr_add_const_vii.i +/gr_add_const_vss.cc +/gr_add_const_vss.h +/gr_add_const_vss.i +/gr_add_ff.cc +/gr_add_ff.h +/gr_add_ff.i +/gr_add_ii.cc +/gr_add_ii.h +/gr_add_ii.i +/gr_add_ss.cc +/gr_add_ss.h +/gr_add_ss.i +/gr_and_bb.cc +/gr_and_bb.h +/gr_and_bb.i +/gr_and_ii.cc +/gr_and_ii.h +/gr_and_ii.i +/gr_and_ss.cc +/gr_and_ss.h +/gr_and_ss.i +/gr_argmax_fs.cc +/gr_argmax_fs.h +/gr_argmax_fs.i +/gr_argmax_is.cc +/gr_argmax_is.h +/gr_argmax_is.i +/gr_argmax_ss.cc +/gr_argmax_ss.h +/gr_argmax_ss.i +/gr_chunks_to_symbols_bc.cc +/gr_chunks_to_symbols_bc.h +/gr_chunks_to_symbols_bc.i +/gr_chunks_to_symbols_bf.cc +/gr_chunks_to_symbols_bf.h +/gr_chunks_to_symbols_bf.i +/gr_chunks_to_symbols_ic.cc +/gr_chunks_to_symbols_ic.h +/gr_chunks_to_symbols_ic.i +/gr_chunks_to_symbols_if.cc +/gr_chunks_to_symbols_if.h +/gr_chunks_to_symbols_if.i +/gr_chunks_to_symbols_sc.cc +/gr_chunks_to_symbols_sc.h +/gr_chunks_to_symbols_sc.i +/gr_chunks_to_symbols_sf.cc +/gr_chunks_to_symbols_sf.h +/gr_chunks_to_symbols_sf.i +/gr_divide_cc.cc +/gr_divide_cc.h +/gr_divide_cc.i +/gr_divide_ff.cc +/gr_divide_ff.h +/gr_divide_ff.i +/gr_divide_ii.cc +/gr_divide_ii.h +/gr_divide_ii.i +/gr_divide_ss.cc +/gr_divide_ss.h +/gr_divide_ss.i +/gr_integrate_cc.cc +/gr_integrate_cc.h +/gr_integrate_cc.i +/gr_integrate_ff.cc +/gr_integrate_ff.h +/gr_integrate_ff.i +/gr_integrate_ii.cc +/gr_integrate_ii.h +/gr_integrate_ii.i +/gr_integrate_ss.cc +/gr_integrate_ss.h +/gr_integrate_ss.i +/gr_max_ff.cc +/gr_max_ff.h +/gr_max_ff.i +/gr_max_ii.cc +/gr_max_ii.h +/gr_max_ii.i +/gr_max_ss.cc +/gr_max_ss.h +/gr_max_ss.i +/gr_multiply_cc.cc +/gr_multiply_cc.h +/gr_multiply_cc.i +/gr_multiply_const_cc.cc +/gr_multiply_const_cc.h +/gr_multiply_const_cc.i +/gr_multiply_const_ff.cc +/gr_multiply_const_ff.h +/gr_multiply_const_ff.i +/gr_multiply_const_ii.cc +/gr_multiply_const_ii.h +/gr_multiply_const_ii.i +/gr_multiply_const_ss.cc +/gr_multiply_const_ss.h +/gr_multiply_const_ss.i +/gr_multiply_const_vcc.cc +/gr_multiply_const_vcc.h +/gr_multiply_const_vcc.i +/gr_multiply_const_vff.cc +/gr_multiply_const_vff.h +/gr_multiply_const_vff.i +/gr_multiply_const_vii.cc +/gr_multiply_const_vii.h +/gr_multiply_const_vii.i +/gr_multiply_const_vss.cc +/gr_multiply_const_vss.h +/gr_multiply_const_vss.i +/gr_multiply_ff.cc +/gr_multiply_ff.h +/gr_multiply_ff.i +/gr_multiply_ii.cc +/gr_multiply_ii.h +/gr_multiply_ii.i +/gr_multiply_ss.cc +/gr_multiply_ss.h +/gr_multiply_ss.i +/gr_mute_cc.cc +/gr_mute_cc.h +/gr_mute_cc.i +/gr_mute_ff.cc +/gr_mute_ff.h +/gr_mute_ff.i +/gr_mute_ii.cc +/gr_mute_ii.h +/gr_mute_ii.i +/gr_mute_ss.cc +/gr_mute_ss.h +/gr_mute_ss.i +/gr_noise_source_c.cc +/gr_noise_source_c.h +/gr_noise_source_c.i +/gr_noise_source_f.cc +/gr_noise_source_f.h +/gr_noise_source_f.i +/gr_noise_source_i.cc +/gr_noise_source_i.h +/gr_noise_source_i.i +/gr_noise_source_s.cc +/gr_noise_source_s.h +/gr_noise_source_s.i +/gr_not_bb.cc +/gr_not_bb.h +/gr_not_bb.i +/gr_not_ii.cc +/gr_not_ii.h +/gr_not_ii.i +/gr_not_ss.cc +/gr_not_ss.h +/gr_not_ss.i +/gr_or_bb.cc +/gr_or_bb.h +/gr_or_bb.i +/gr_or_ii.cc +/gr_or_ii.h +/gr_or_ii.i +/gr_or_ss.cc +/gr_or_ss.h +/gr_or_ss.i +/gr_packed_to_unpacked_bb.cc +/gr_packed_to_unpacked_bb.h +/gr_packed_to_unpacked_bb.i +/gr_packed_to_unpacked_ii.cc +/gr_packed_to_unpacked_ii.h +/gr_packed_to_unpacked_ii.i +/gr_packed_to_unpacked_ss.cc +/gr_packed_to_unpacked_ss.h +/gr_packed_to_unpacked_ss.i +/gr_peak_detector_fb.cc +/gr_peak_detector_fb.h +/gr_peak_detector_fb.i +/gr_peak_detector_ff.cc +/gr_peak_detector_ff.h +/gr_peak_detector_ff.i +/gr_peak_detector_ib.cc +/gr_peak_detector_ib.h +/gr_peak_detector_ib.i +/gr_peak_detector_ii.cc +/gr_peak_detector_ii.h +/gr_peak_detector_ii.i +/gr_peak_detector_sb.cc +/gr_peak_detector_sb.h +/gr_peak_detector_sb.i +/gr_peak_detector_ss.cc +/gr_peak_detector_ss.h +/gr_peak_detector_ss.i +/gr_prefix.cc +/gr_sample_and_hold_bb.cc +/gr_sample_and_hold_bb.h +/gr_sample_and_hold_bb.i +/gr_sample_and_hold_ff.cc +/gr_sample_and_hold_ff.h +/gr_sample_and_hold_ff.i +/gr_sample_and_hold_ii.cc +/gr_sample_and_hold_ii.h +/gr_sample_and_hold_ii.i +/gr_sample_and_hold_ss.cc +/gr_sample_and_hold_ss.h +/gr_sample_and_hold_ss.i +/gr_sig_source_c.cc +/gr_sig_source_c.h +/gr_sig_source_c.i +/gr_sig_source_f.cc +/gr_sig_source_f.h +/gr_sig_source_f.i +/gr_sig_source_i.cc +/gr_sig_source_i.h +/gr_sig_source_i.i +/gr_sig_source_s.cc +/gr_sig_source_s.h +/gr_sig_source_s.i +/gr_sub_cc.cc +/gr_sub_cc.h +/gr_sub_cc.i +/gr_sub_ff.cc +/gr_sub_ff.h +/gr_sub_ff.i +/gr_sub_ii.cc +/gr_sub_ii.h +/gr_sub_ii.i +/gr_sub_ss.cc +/gr_sub_ss.h +/gr_sub_ss.i +/gr_unpacked_to_packed_bb.cc +/gr_unpacked_to_packed_bb.h +/gr_unpacked_to_packed_bb.i +/gr_unpacked_to_packed_ii.cc +/gr_unpacked_to_packed_ii.h +/gr_unpacked_to_packed_ii.i +/gr_unpacked_to_packed_ss.cc +/gr_unpacked_to_packed_ss.h +/gr_unpacked_to_packed_ss.i +/gr_vector_sink_b.cc +/gr_vector_sink_b.h +/gr_vector_sink_b.i +/gr_vector_sink_c.cc +/gr_vector_sink_c.h +/gr_vector_sink_c.i +/gr_vector_sink_f.cc +/gr_vector_sink_f.h +/gr_vector_sink_f.i +/gr_vector_sink_i.cc +/gr_vector_sink_i.h +/gr_vector_sink_i.i +/gr_vector_sink_s.cc +/gr_vector_sink_s.h +/gr_vector_sink_s.i +/gr_vector_source_b.cc +/gr_vector_source_b.h +/gr_vector_source_b.i +/gr_vector_source_c.cc +/gr_vector_source_c.h +/gr_vector_source_c.i +/gr_vector_source_f.cc +/gr_vector_source_f.h +/gr_vector_source_f.i +/gr_vector_source_i.cc +/gr_vector_source_i.h +/gr_vector_source_i.i +/gr_vector_source_s.cc +/gr_vector_source_s.h +/gr_vector_source_s.i +/gr_xor_bb.cc +/gr_xor_bb.h +/gr_xor_bb.i +/gr_xor_ii.cc +/gr_xor_ii.h +/gr_xor_ii.i +/gr_xor_ss.cc +/gr_xor_ss.h +/gr_xor_ss.i +/gr_moving_average_cc.cc +/gr_moving_average_cc.h +/gr_moving_average_cc.i +/gr_moving_average_ff.cc +/gr_moving_average_ff.h +/gr_moving_average_ff.i +/gr_moving_average_ss.cc +/gr_moving_average_ss.h +/gr_moving_average_ss.i +/gr_moving_average_ii.cc +/gr_moving_average_ii.h +/gr_moving_average_ii.i +/gr_and_const_bb.cc +/gr_and_const_ss.h +/gr_and_const_ss.i +/gr_and_const_ii.cc +/gr_and_const_bb.h +/gr_and_const_ss.cc +/gr_and_const_bb.i +/gr_and_const_ii.h +/gr_and_const_ii.i +/# --- end generated files --- +/stamp-* +/gengen_generated.i diff --git a/gnuradio-core/src/lib/hier/.gitignore b/gnuradio-core/src/lib/hier/.gitignore new file mode 100644 index 000000000..89a768d46 --- /dev/null +++ b/gnuradio-core/src/lib/hier/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.libs +/.deps diff --git a/gnuradio-core/src/lib/io/.gitignore b/gnuradio-core/src/lib/io/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gnuradio-core/src/lib/io/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-core/src/lib/missing/.gitignore b/gnuradio-core/src/lib/missing/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gnuradio-core/src/lib/missing/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-core/src/lib/reed-solomon/.gitignore b/gnuradio-core/src/lib/reed-solomon/.gitignore new file mode 100644 index 000000000..f137f5c67 --- /dev/null +++ b/gnuradio-core/src/lib/reed-solomon/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/rstest diff --git a/gnuradio-core/src/lib/runtime/.gitignore b/gnuradio-core/src/lib/runtime/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gnuradio-core/src/lib/runtime/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-core/src/lib/runtime/Makefile.am b/gnuradio-core/src/lib/runtime/Makefile.am index 14ab464ad..b0e804277 100644 --- a/gnuradio-core/src/lib/runtime/Makefile.am +++ b/gnuradio-core/src/lib/runtime/Makefile.am @@ -44,6 +44,7 @@ libruntime_la_SOURCES = \ gr_io_signature.cc \ gr_local_sighandler.cc \ gr_message.cc \ + gr_msg_accepter.cc \ gr_msg_handler.cc \ gr_msg_queue.cc \ gr_pagesize.cc \ @@ -96,6 +97,7 @@ grinclude_HEADERS = \ gr_io_signature.h \ gr_local_sighandler.h \ gr_message.h \ + gr_msg_accepter.h \ gr_msg_handler.h \ gr_msg_queue.h \ gr_pagesize.h \ diff --git a/gnuradio-core/src/lib/runtime/gr_basic_block.cc b/gnuradio-core/src/lib/runtime/gr_basic_block.cc index 71ccc0245..2fa1066cb 100644 --- a/gnuradio-core/src/lib/runtime/gr_basic_block.cc +++ b/gnuradio-core/src/lib/runtime/gr_basic_block.cc @@ -41,8 +41,7 @@ gr_basic_block_ncurrently_allocated() gr_basic_block::gr_basic_block(const std::string &name, gr_io_signature_sptr input_signature, gr_io_signature_sptr output_signature) - : gruel::msg_accepter_msgq(gruel::make_msg_queue(0)), - d_name(name), + : d_name(name), d_input_signature(input_signature), d_output_signature(output_signature), d_unique_id(s_next_id++), diff --git a/gnuradio-core/src/lib/runtime/gr_basic_block.h b/gnuradio-core/src/lib/runtime/gr_basic_block.h index 27ec0fd89..b8797fdc6 100644 --- a/gnuradio-core/src/lib/runtime/gr_basic_block.h +++ b/gnuradio-core/src/lib/runtime/gr_basic_block.h @@ -26,7 +26,7 @@ #include <gr_runtime_types.h> #include <gr_sptr_magic.h> #include <boost/enable_shared_from_this.hpp> -#include <gruel/msg_accepter_msgq.h> +#include <gr_msg_accepter.h> #include <string> /*! @@ -40,7 +40,7 @@ * signal processing functions. */ -class gr_basic_block : gruel::msg_accepter_msgq, public boost::enable_shared_from_this<gr_basic_block> +class gr_basic_block : public gr_msg_accepter, public boost::enable_shared_from_this<gr_basic_block> { protected: friend class gr_flowgraph; diff --git a/gnuradio-core/src/lib/runtime/gr_block_detail.cc b/gnuradio-core/src/lib/runtime/gr_block_detail.cc index ae1ea2562..d33dfed84 100644 --- a/gnuradio-core/src/lib/runtime/gr_block_detail.cc +++ b/gnuradio-core/src/lib/runtime/gr_block_detail.cc @@ -106,3 +106,10 @@ gr_block_detail::produce_each (int how_many_items) for (int i = 0; i < noutputs (); i++) d_output[i]->update_write_pointer (how_many_items); } + + +void +gr_block_detail::_post(pmt::pmt_t msg) +{ + d_tpb.insert_tail(msg); +} diff --git a/gnuradio-core/src/lib/runtime/gr_block_detail.h b/gnuradio-core/src/lib/runtime/gr_block_detail.h index 2856c402c..9d6358602 100644 --- a/gnuradio-core/src/lib/runtime/gr_block_detail.h +++ b/gnuradio-core/src/lib/runtime/gr_block_detail.h @@ -79,6 +79,12 @@ class gr_block_detail { void produce_each (int how_many_items); + /*! + * Accept msg, place in queue, arrange for thread to be awakened if it's not already. + */ + void _post(pmt::pmt_t msg); + + gr_tpb_detail d_tpb; // used by thread-per-block scheduler // ---------------------------------------------------------------------------- diff --git a/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc b/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc new file mode 100644 index 000000000..89876ae29 --- /dev/null +++ b/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc @@ -0,0 +1,59 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gr_msg_accepter.h> +#include <gr_block.h> +#include <gr_block_detail.h> +#include <gr_hier_block2.h> +#include <stdexcept> + +using namespace pmt; + +gr_msg_accepter::gr_msg_accepter() +{ +} + +gr_msg_accepter::~gr_msg_accepter() +{ + // NOP, required as virtual destructor +} + +void +gr_msg_accepter::post(pmt_t msg) +{ + // Notify derived class, handled case by case + gr_block *p = dynamic_cast<gr_block *>(this); + if (p) { + p->detail()->_post(msg); + return; + } + gr_hier_block2 *p2 = dynamic_cast<gr_hier_block2 *>(this); + if (p2){ + // FIXME do the right thing + return; + } + + throw std::runtime_error("unknown derived class"); +} diff --git a/gnuradio-core/src/lib/runtime/gr_msg_accepter.h b/gnuradio-core/src/lib/runtime/gr_msg_accepter.h new file mode 100644 index 000000000..79a631f3a --- /dev/null +++ b/gnuradio-core/src/lib/runtime/gr_msg_accepter.h @@ -0,0 +1,42 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef INCLUDED_GR_MSG_ACCEPTER_H +#define INCLUDED_GR_MSG_ACCEPTER_H + +#include <gruel/msg_accepter.h> +#include <gruel/pmt.h> + +/*! + * \brief Accepts messages and inserts them into a message queue, then notifies + * subclass gr_basic_block there is a message pending. + */ +class gr_msg_accepter : public gruel::msg_accepter +{ +public: + gr_msg_accepter(); + ~gr_msg_accepter(); + + void post(pmt::pmt_t msg); + +}; + +#endif /* INCLUDED_GR_MSG_ACCEPTER_H */ diff --git a/gnuradio-core/src/lib/runtime/gr_tpb_detail.cc b/gnuradio-core/src/lib/runtime/gr_tpb_detail.cc index 02e8deed8..c6311ccaa 100644 --- a/gnuradio-core/src/lib/runtime/gr_tpb_detail.cc +++ b/gnuradio-core/src/lib/runtime/gr_tpb_detail.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2008 Free Software Foundation, Inc. + * Copyright 2008,2009 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -27,6 +27,8 @@ #include <gr_block_detail.h> #include <gr_buffer.h> +using namespace pmt; + /* * We assume that no worker threads are ever running when the * graph structure is being manipulated, thus it's safe for us to poke @@ -65,3 +67,44 @@ gr_tpb_detail::notify_neighbors(gr_block_detail *d) notify_downstream(d); notify_upstream(d); } + +void +gr_tpb_detail::insert_tail(pmt::pmt_t msg) +{ + gruel::scoped_lock guard(mutex); + + msg_queue.push_back(msg); + + // wake up thread if BLKD_IN or BLKD_OUT + input_cond.notify_one(); + output_cond.notify_one(); +} + +pmt_t +gr_tpb_detail::delete_head_nowait() +{ + gruel::scoped_lock guard(mutex); + + if (empty_p()) + return pmt_t(); + + pmt_t m(msg_queue.front()); + msg_queue.pop_front(); + + return m; +} + +/* + * Caller must already be holding the mutex + */ +pmt_t +gr_tpb_detail::delete_head_nowait_already_holding_mutex() +{ + if (empty_p()) + return pmt_t(); + + pmt_t m(msg_queue.front()); + msg_queue.pop_front(); + + return m; +} diff --git a/gnuradio-core/src/lib/runtime/gr_tpb_detail.h b/gnuradio-core/src/lib/runtime/gr_tpb_detail.h index ab955240b..acfa264c7 100644 --- a/gnuradio-core/src/lib/runtime/gr_tpb_detail.h +++ b/gnuradio-core/src/lib/runtime/gr_tpb_detail.h @@ -22,6 +22,8 @@ #define INCLUDED_GR_TPB_DETAIL_H #include <gruel/thread.h> +#include <deque> +#include <gruel/pmt.h> class gr_block_detail; @@ -36,9 +38,12 @@ struct gr_tpb_detail { bool output_changed; gruel::condition_variable output_cond; - gr_tpb_detail() - : input_changed(false), output_changed(false) {} +private: + std::deque<pmt::pmt_t> msg_queue; +public: + gr_tpb_detail() + : input_changed(false), output_changed(false) { } //! Called by us to tell all our upstream blocks that their output may have changed. void notify_upstream(gr_block_detail *d); @@ -56,6 +61,23 @@ struct gr_tpb_detail { input_changed = false; output_changed = false; } + + //! is the queue empty? + bool empty_p() const { return msg_queue.empty(); } + + //| Acquires and release the mutex + void insert_tail(pmt::pmt_t msg); + + /*! + * \returns returns pmt at head of queue or pmt_t() if empty. + */ + pmt::pmt_t delete_head_nowait(); + + /*! + * \returns returns pmt at head of queue or pmt_t() if empty. + * Caller must already be holding the mutex + */ + pmt::pmt_t delete_head_nowait_already_holding_mutex(); private: diff --git a/gnuradio-core/src/lib/runtime/gr_tpb_thread_body.cc b/gnuradio-core/src/lib/runtime/gr_tpb_thread_body.cc index 458b16d64..03eef17d9 100644 --- a/gnuradio-core/src/lib/runtime/gr_tpb_thread_body.cc +++ b/gnuradio-core/src/lib/runtime/gr_tpb_thread_body.cc @@ -24,17 +24,26 @@ #include <gr_tpb_thread_body.h> #include <iostream> #include <boost/thread.hpp> +#include <gruel/pmt.h> + +using namespace pmt; gr_tpb_thread_body::gr_tpb_thread_body(gr_block_sptr block) : d_exec(block) { // std::cerr << "gr_tpb_thread_body: " << block << std::endl; - gr_block_detail *d = block->detail().get(); + gr_block_detail *d = block->detail().get(); gr_block_executor::state s; + pmt_t msg; + while (1){ boost::this_thread::interruption_point(); + + // handle any queued up messages + while ((msg = d->d_tpb.delete_head_nowait())) + block->handle_msg(msg); d->d_tpb.clear_changed(); s = d_exec.run_one_iteration(); @@ -55,16 +64,39 @@ gr_tpb_thread_body::gr_tpb_thread_body(gr_block_sptr block) case gr_block_executor::BLKD_IN: // Wait for input. { gruel::scoped_lock guard(d->d_tpb.mutex); - while(!d->d_tpb.input_changed) - d->d_tpb.input_cond.wait(guard); + while (!d->d_tpb.input_changed){ + + // wait for input or message + while(!d->d_tpb.input_changed && d->d_tpb.empty_p()) + d->d_tpb.input_cond.wait(guard); + + // handle all pending messages + while ((msg = d->d_tpb.delete_head_nowait_already_holding_mutex())){ + guard.unlock(); // release lock while processing msg + block->handle_msg(msg); + guard.lock(); + } + } } break; + case gr_block_executor::BLKD_OUT: // Wait for output buffer space. { gruel::scoped_lock guard(d->d_tpb.mutex); - while(!d->d_tpb.output_changed) - d->d_tpb.output_cond.wait(guard); + while (!d->d_tpb.output_changed){ + + // wait for output room or message + while(!d->d_tpb.output_changed && d->d_tpb.empty_p()) + d->d_tpb.output_cond.wait(guard); + + // handle all pending messages + while ((msg = d->d_tpb.delete_head_nowait_already_holding_mutex())){ + guard.unlock(); // release lock while processing msg + block->handle_msg(msg); + guard.lock(); + } + } } break; diff --git a/gnuradio-core/src/lib/swig/.gitignore b/gnuradio-core/src/lib/swig/.gitignore new file mode 100644 index 000000000..9d7d01056 --- /dev/null +++ b/gnuradio-core/src/lib/swig/.gitignore @@ -0,0 +1,36 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/swigrun.py +/swigrun_wrap.c +/Makefile.swigdeps.new +/gnuradio_swig_py_runtime.d +/gnuradio_swig_py_general.d +/gnuradio_swig_py_gengen.d +/gnuradio_swig_py_filter.d +/gnuradio_swig_py_io.d +/gnuradio_swig_bug_workaround.h +/gnuradio_swig_py_runtime.cc +/gnuradio_swig_py_runtime.h +/gnuradio_swig_py_runtime.py +/gnuradio_swig_py_general.cc +/gnuradio_swig_py_general.h +/gnuradio_swig_py_general.py +/gnuradio_swig_py_gengen.cc +/gnuradio_swig_py_gengen.h +/gnuradio_swig_py_gengen.py +/gnuradio_swig_py_filter.cc +/gnuradio_swig_py_filter.h +/gnuradio_swig_py_filter.py +/gnuradio_swig_py_io.cc +/gnuradio_swig_py_io.h +/gnuradio_swig_py_io.py +/gnuradio_swig_py_hier.cc +/gnuradio_swig_py_hier.h +/gnuradio_swig_py_hier.py diff --git a/gnuradio-core/src/lib/viterbi/.gitignore b/gnuradio-core/src/lib/viterbi/.gitignore new file mode 100644 index 000000000..85bb5cc04 --- /dev/null +++ b/gnuradio-core/src/lib/viterbi/.gitignore @@ -0,0 +1,6 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/encode +/decode diff --git a/gnuradio-core/src/python/.gitignore b/gnuradio-core/src/python/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gnuradio-core/src/python/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-core/src/python/bin/.gitignore b/gnuradio-core/src/python/bin/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gnuradio-core/src/python/bin/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-core/src/python/gnuradio/.gitignore b/gnuradio-core/src/python/gnuradio/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-core/src/python/gnuradio/blks2/.gitignore b/gnuradio-core/src/python/gnuradio/blks2/.gitignore new file mode 100644 index 000000000..b6950912c --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/blks2/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pyc diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/.gitignore b/gnuradio-core/src/python/gnuradio/blks2impl/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/blks2impl/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am index f07abd4c4..17be09cc7 100644 --- a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am +++ b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am @@ -47,6 +47,10 @@ grblkspython_PYTHON = \ ofdm_sync_pn.py \ ofdm_sync_pnac.py \ ofdm_sync_ml.py \ + pfb_arb_resampler.py \ + pfb_channelizer.py \ + pfb_decimator.py \ + pfb_interpolator.py \ pkt.py \ psk.py \ qam.py \ diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py new file mode 100644 index 000000000..b1b3dfcab --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 + +class pfb_arb_resampler_ccf(gr.hier_block2): + ''' + Convinience wrapper for the polyphase filterbank arbitrary resampler. + + The block takes a single complex stream in and outputs a single complex + stream out. As such, it requires no extra glue to handle the input/output + streams. This block is provided to be consistent with the interface to the + other PFB block. + ''' + def __init__(self, rate, taps, flt_size=32): + gr.hier_block2.__init__(self, "pfb_arb_resampler_ccf", + gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature + gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature + + self._rate = rate + self._taps = taps + self._size = flt_size + + self.pfb = gr.pfb_arb_resampler_ccf(self._rate, self._taps, self._size) + + self.connect(self, self.pfb) + self.connect(self.pfb, self) + + + + diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py new file mode 100644 index 000000000..c45ae4d1a --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 + +class pfb_channelizer_ccf(gr.hier_block2): + ''' + Make a Polyphase Filter channelizer (complex in, complex out, floating-point taps) + + This simplifies the interface by allowing a single input stream to connect to this block. + It will then output a stream for each channel. + ''' + def __init__(self, numchans, taps): + gr.hier_block2.__init__(self, "pfb_channelizer_ccf", + gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature + gr.io_signature(numchans, numchans, gr.sizeof_gr_complex)) # Output signature + + self._numchans = numchans + self._taps = taps + + self.s2ss = gr.stream_to_streams(gr.sizeof_gr_complex, self._numchans) + self.pfb = gr.pfb_channelizer_ccf(self._numchans, self._taps) + self.v2s = gr.vector_to_streams(gr.sizeof_gr_complex, self._numchans) + + self.connect(self, self.s2ss) + + for i in xrange(self._numchans): + self.connect((self.s2ss,i), (self.pfb,i)) + + # Get independent streams from the filterbank and send them out + self.connect(self.pfb, self.v2s) + + for i in xrange(self._numchans): + self.connect((self.v2s,i), (self,i)) + + + + diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py new file mode 100644 index 000000000..176d0473e --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 + +class pfb_decimator_ccf(gr.hier_block2): + ''' + Make a Polyphase Filter decimator (complex in, complex out, floating-point taps) + + This simplifies the interface by allowing a single input stream to connect to this block. + It will then output a stream that is the decimated output stream. + ''' + def __init__(self, decim, taps, channel=0): + gr.hier_block2.__init__(self, "pfb_decimator_ccf", + gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature + gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature + + self._decim = decim + self._taps = taps + self._channel = channel + + self.s2ss = gr.stream_to_streams(gr.sizeof_gr_complex, self._decim) + self.pfb = gr.pfb_decimator_ccf(self._decim, self._taps, self._channel) + + self.connect(self, self.s2ss) + + for i in xrange(self._decim): + self.connect((self.s2ss,i), (self.pfb,i)) + + self.connect(self.pfb, self) diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py new file mode 100644 index 000000000..db2944042 --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 + +class pfb_interpolator_ccf(gr.hier_block2): + ''' + Make a Polyphase Filter interpolator (complex in, complex out, floating-point taps) + + The block takes a single complex stream in and outputs a single complex + stream out. As such, it requires no extra glue to handle the input/output + streams. This block is provided to be consistent with the interface to the + other PFB block. + ''' + def __init__(self, interp, taps): + gr.hier_block2.__init__(self, "pfb_interpolator_ccf", + gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature + gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature + + self._interp = interp + self._taps = taps + + self.pfb = gr.pfb_interpolator_ccf(self._interp, self._taps) + + self.connect(self, self.pfb) + self.connect(self.pfb, self) + + + + diff --git a/gnuradio-core/src/python/gnuradio/gr/.gitignore b/gnuradio-core/src/python/gnuradio/gr/.gitignore new file mode 100644 index 000000000..bf03975bb --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/gr/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/run_tests diff --git a/gnuradio-core/src/python/gnuradio/gru/.gitignore b/gnuradio-core/src/python/gnuradio/gru/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/gru/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-core/src/python/gnuradio/gruimpl/.gitignore b/gnuradio-core/src/python/gnuradio/gruimpl/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/gruimpl/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-core/src/python/gnuradio/vocoder/.gitignore b/gnuradio-core/src/python/gnuradio/vocoder/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/vocoder/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gnuradio-core/src/tests/.gitignore b/gnuradio-core/src/tests/.gitignore new file mode 100644 index 000000000..8687003d4 --- /dev/null +++ b/gnuradio-core/src/tests/.gitignore @@ -0,0 +1,28 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/t1 +/test_dtv +/check_dups +/test_gr +/test_all +/exercise_correlator +/test_grbase +/test_vmcircbuf +/test_atsc +/test_general +/test_runtime +/test_filter +/benchmark_dotprod_fff +/benchmark_dotprod_ccc +/benchmark_dotprod_fcc +/benchmark_dotprod_scc +/benchmark_nco +/benchmark_dotprod_ccf +/benchmark_dotprod_fsf +/benchmark_vco diff --git a/gnuradio-core/src/utils/.gitignore b/gnuradio-core/src/utils/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gnuradio-core/src/utils/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-examples/.gitignore b/gnuradio-examples/.gitignore new file mode 100644 index 000000000..29ec71e01 --- /dev/null +++ b/gnuradio-examples/.gitignore @@ -0,0 +1,25 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/gnuradio.pc diff --git a/gnuradio-examples/c++/.gitignore b/gnuradio-examples/c++/.gitignore new file mode 100644 index 000000000..19dd0e0a5 --- /dev/null +++ b/gnuradio-examples/c++/.gitignore @@ -0,0 +1,5 @@ +/.deps +/.libs +/Makefile +/Makefile.in +/dialtone diff --git a/gnuradio-examples/c++/dial_tone/.gitignore b/gnuradio-examples/c++/dial_tone/.gitignore new file mode 100644 index 000000000..c5e345858 --- /dev/null +++ b/gnuradio-examples/c++/dial_tone/.gitignore @@ -0,0 +1,5 @@ +/.deps +/.libs +/Makefile +/Makefile.in +/dial_tone diff --git a/gnuradio-examples/python/.gitignore b/gnuradio-examples/python/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gnuradio-examples/python/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-examples/python/Makefile.am b/gnuradio-examples/python/Makefile.am index 3a1acf51d..ea03b438f 100644 --- a/gnuradio-examples/python/Makefile.am +++ b/gnuradio-examples/python/Makefile.am @@ -32,5 +32,6 @@ SUBDIRS = \ multi_usrp \ network \ ofdm \ + pfb \ usrp \ usrp2 diff --git a/gnuradio-examples/python/apps/.gitignore b/gnuradio-examples/python/apps/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gnuradio-examples/python/apps/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gnuradio-examples/python/apps/hf_explorer/.gitignore b/gnuradio-examples/python/apps/hf_explorer/.gitignore new file mode 100644 index 000000000..b6950912c --- /dev/null +++ b/gnuradio-examples/python/apps/hf_explorer/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pyc diff --git a/gnuradio-examples/python/apps/hf_radio/.gitignore b/gnuradio-examples/python/apps/hf_radio/.gitignore new file mode 100644 index 000000000..b6950912c --- /dev/null +++ b/gnuradio-examples/python/apps/hf_radio/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pyc diff --git a/gnuradio-examples/python/audio/.gitignore b/gnuradio-examples/python/audio/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gnuradio-examples/python/audio/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-examples/python/digital-bert/.gitignore b/gnuradio-examples/python/digital-bert/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gnuradio-examples/python/digital-bert/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gnuradio-examples/python/digital/.gitignore b/gnuradio-examples/python/digital/.gitignore new file mode 100644 index 000000000..ff40c06f3 --- /dev/null +++ b/gnuradio-examples/python/digital/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/*.dat diff --git a/gnuradio-examples/python/digital_voice/.gitignore b/gnuradio-examples/python/digital_voice/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gnuradio-examples/python/digital_voice/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-examples/python/mp-sched/.gitignore b/gnuradio-examples/python/mp-sched/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gnuradio-examples/python/mp-sched/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-examples/python/multi-antenna/.gitignore b/gnuradio-examples/python/multi-antenna/.gitignore new file mode 100644 index 000000000..ff40c06f3 --- /dev/null +++ b/gnuradio-examples/python/multi-antenna/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/*.dat diff --git a/gnuradio-examples/python/multi_usrp/.gitignore b/gnuradio-examples/python/multi_usrp/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gnuradio-examples/python/multi_usrp/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-examples/python/network/.gitignore b/gnuradio-examples/python/network/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gnuradio-examples/python/network/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gnuradio-examples/python/ofdm/.gitignore b/gnuradio-examples/python/ofdm/.gitignore new file mode 100644 index 000000000..2f6a10e95 --- /dev/null +++ b/gnuradio-examples/python/ofdm/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/*.pyc +/*.dat diff --git a/gnuradio-examples/python/pfb/.gitignore b/gnuradio-examples/python/pfb/.gitignore new file mode 100644 index 000000000..282522db0 --- /dev/null +++ b/gnuradio-examples/python/pfb/.gitignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/gnuradio-examples/python/pfb/Makefile.am b/gnuradio-examples/python/pfb/Makefile.am new file mode 100644 index 000000000..4aa9248ea --- /dev/null +++ b/gnuradio-examples/python/pfb/Makefile.am @@ -0,0 +1,31 @@ +# +# Copyright 2009 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 $(top_srcdir)/Makefile.common + +ourdatadir = $(exampledir)/pfb + +dist_ourdata_SCRIPTS = \ + channelize.py \ + chirp_channelize.py \ + decimate.py \ + interpolate.py \ + fmtest.py diff --git a/gnuradio-examples/python/pfb/channelize.py b/gnuradio-examples/python/pfb/channelize.py new file mode 100755 index 000000000..bc83fae27 --- /dev/null +++ b/gnuradio-examples/python/pfb/channelize.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 os, time +import scipy, pylab +from scipy import fftpack +from pylab import mlab + +class pfb_top_block(gr.top_block): + def __init__(self): + gr.top_block.__init__(self) + + self._N = 2000000 # number of samples to use + self._fs = 9000 # initial sampling rate + self._M = 9 # Number of channels to channelize + + # Create a set of taps for the PFB channelizer + self._taps = gr.firdes.low_pass_2(1, self._fs, 475.50, 50, + attenuation_dB=10, window=gr.firdes.WIN_BLACKMAN_hARRIS) + + # Calculate the number of taps per channel for our own information + tpc = scipy.ceil(float(len(self._taps)) / float(self._M)) + print "Number of taps: ", len(self._taps) + print "Number of channels: ", self._M + print "Taps per channel: ", tpc + + # Create a set of signals at different frequencies + # freqs lists the frequencies of the signals that get stored + # in the list "signals", which then get summed together + self.signals = list() + self.add = gr.add_cc() + freqs = [-4070, -3050, -2030, -1010, 10, 1020, 2040, 3060, 4080] + for i in xrange(len(freqs)): + self.signals.append(gr.sig_source_c(self._fs, gr.GR_SIN_WAVE, freqs[i], 1)) + self.connect(self.signals[i], (self.add,i)) + + self.head = gr.head(gr.sizeof_gr_complex, self._N) + + # Construct the channelizer filter + self.pfb = blks2.pfb_channelizer_ccf(self._M, self._taps) + + # Construct a vector sink for the input signal to the channelizer + self.snk_i = gr.vector_sink_c() + + # Connect the blocks + self.connect(self.add, self.head, self.pfb) + self.connect(self.add, self.snk_i) + + # Create a vector sink for each of M output channels of the filter and connect it + self.snks = list() + for i in xrange(self._M): + self.snks.append(gr.vector_sink_c()) + self.connect((self.pfb, i), self.snks[i]) + + +def main(): + tstart = time.time() + + tb = pfb_top_block() + tb.run() + + tend = time.time() + print "Run time: %f" % (tend - tstart) + + if 1: + fig_in = pylab.figure(1, figsize=(16,9), facecolor="w") + fig1 = pylab.figure(2, figsize=(16,9), facecolor="w") + fig2 = pylab.figure(3, figsize=(16,9), facecolor="w") + + Ns = 1000 + Ne = 10000 + + fftlen = 8192 + winfunc = scipy.blackman + fs = tb._fs + + # Plot the input signal on its own figure + d = tb.snk_i.data()[Ns:Ne] + spin_f = fig_in.add_subplot(2, 1, 1) + + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_in = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_in = scipy.arange(-fs/2.0, fs/2.0, fs/float(X_in.size)) + pin_f = spin_f.plot(f_in, X_in, "b") + spin_f.set_xlim([min(f_in), max(f_in)+1]) + spin_f.set_ylim([-200.0, 50.0]) + + spin_f.set_title("Input Signal", weight="bold") + spin_f.set_xlabel("Frequency (Hz)") + spin_f.set_ylabel("Power (dBW)") + + + Ts = 1.0/fs + Tmax = len(d)*Ts + + t_in = scipy.arange(0, Tmax, Ts) + x_in = scipy.array(d) + spin_t = fig_in.add_subplot(2, 1, 2) + pin_t = spin_t.plot(t_in, x_in.real, "b") + pin_t = spin_t.plot(t_in, x_in.imag, "r") + + spin_t.set_xlabel("Time (s)") + spin_t.set_ylabel("Amplitude") + + Ncols = int(scipy.floor(scipy.sqrt(tb._M))) + Nrows = int(scipy.floor(tb._M / Ncols)) + if(tb._M % Ncols != 0): + Nrows += 1 + + # Plot each of the channels outputs. Frequencies on Figure 2 and + # time signals on Figure 3 + fs_o = tb._fs / tb._M + Ts_o = 1.0/fs_o + Tmax_o = len(d)*Ts_o + for i in xrange(len(tb.snks)): + # remove issues with the transients at the beginning + # also remove some corruption at the end of the stream + # this is a bug, probably due to the corner cases + d = tb.snks[i].data()[Ns:Ne] + + sp1_f = fig1.add_subplot(Nrows, Ncols, 1+i) + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs_o, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_o = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_o = scipy.arange(-fs_o/2.0, fs_o/2.0, fs_o/float(X_o.size)) + p2_f = sp1_f.plot(f_o, X_o, "b") + sp1_f.set_xlim([min(f_o), max(f_o)+1]) + sp1_f.set_ylim([-200.0, 50.0]) + + sp1_f.set_title(("Channel %d" % i), weight="bold") + sp1_f.set_xlabel("Frequency (Hz)") + sp1_f.set_ylabel("Power (dBW)") + + x_o = scipy.array(d) + t_o = scipy.arange(0, Tmax_o, Ts_o) + sp2_o = fig2.add_subplot(Nrows, Ncols, 1+i) + p2_o = sp2_o.plot(t_o, x_o.real, "b") + p2_o = sp2_o.plot(t_o, x_o.imag, "r") + sp2_o.set_xlim([min(t_o), max(t_o)+1]) + sp2_o.set_ylim([-2, 2]) + + sp2_o.set_title(("Channel %d" % i), weight="bold") + sp2_o.set_xlabel("Time (s)") + sp2_o.set_ylabel("Amplitude") + + pylab.show() + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass + diff --git a/gnuradio-examples/python/pfb/chirp_channelize.py b/gnuradio-examples/python/pfb/chirp_channelize.py new file mode 100755 index 000000000..edebf5f59 --- /dev/null +++ b/gnuradio-examples/python/pfb/chirp_channelize.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 os, time +import scipy, pylab +from scipy import fftpack +from pylab import mlab + +class pfb_top_block(gr.top_block): + def __init__(self): + gr.top_block.__init__(self) + + self._N = 200000 # number of samples to use + self._fs = 9000 # initial sampling rate + self._M = 9 # Number of channels to channelize + + # Create a set of taps for the PFB channelizer + self._taps = gr.firdes.low_pass_2(1, self._fs, 500, 20, + attenuation_dB=10, window=gr.firdes.WIN_BLACKMAN_hARRIS) + + # Calculate the number of taps per channel for our own information + tpc = scipy.ceil(float(len(self._taps)) / float(self._M)) + print "Number of taps: ", len(self._taps) + print "Number of channels: ", self._M + print "Taps per channel: ", tpc + + repeated = True + if(repeated): + self.vco_input = gr.sig_source_f(self._fs, gr.GR_SIN_WAVE, 0.25, 110) + else: + amp = 100 + data = scipy.arange(0, amp, amp/float(self._N)) + self.vco_input = gr.vector_source_f(data, False) + + # Build a VCO controlled by either the sinusoid or single chirp tone + # Then convert this to a complex signal + self.vco = gr.vco_f(self._fs, 225, 1) + self.f2c = gr.float_to_complex() + + self.head = gr.head(gr.sizeof_gr_complex, self._N) + + # Construct the channelizer filter + self.pfb = blks2.pfb_channelizer_ccf(self._M, self._taps) + + # Construct a vector sink for the input signal to the channelizer + self.snk_i = gr.vector_sink_c() + + # Connect the blocks + self.connect(self.vco_input, self.vco, self.f2c) + self.connect(self.f2c, self.head, self.pfb) + self.connect(self.f2c, self.snk_i) + + # Create a vector sink for each of M output channels of the filter and connect it + self.snks = list() + for i in xrange(self._M): + self.snks.append(gr.vector_sink_c()) + self.connect((self.pfb, i), self.snks[i]) + + +def main(): + tstart = time.time() + + tb = pfb_top_block() + tb.run() + + tend = time.time() + print "Run time: %f" % (tend - tstart) + + if 1: + fig_in = pylab.figure(1, figsize=(16,9), facecolor="w") + fig1 = pylab.figure(2, figsize=(16,9), facecolor="w") + fig2 = pylab.figure(3, figsize=(16,9), facecolor="w") + fig3 = pylab.figure(4, figsize=(16,9), facecolor="w") + + Ns = 650 + Ne = 20000 + + fftlen = 8192 + winfunc = scipy.blackman + fs = tb._fs + + # Plot the input signal on its own figure + d = tb.snk_i.data()[Ns:Ne] + spin_f = fig_in.add_subplot(2, 1, 1) + + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_in = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_in = scipy.arange(-fs/2.0, fs/2.0, fs/float(X_in.size)) + pin_f = spin_f.plot(f_in, X_in, "b") + spin_f.set_xlim([min(f_in), max(f_in)+1]) + spin_f.set_ylim([-200.0, 50.0]) + + spin_f.set_title("Input Signal", weight="bold") + spin_f.set_xlabel("Frequency (Hz)") + spin_f.set_ylabel("Power (dBW)") + + + Ts = 1.0/fs + Tmax = len(d)*Ts + + t_in = scipy.arange(0, Tmax, Ts) + x_in = scipy.array(d) + spin_t = fig_in.add_subplot(2, 1, 2) + pin_t = spin_t.plot(t_in, x_in.real, "b") + pin_t = spin_t.plot(t_in, x_in.imag, "r") + + spin_t.set_xlabel("Time (s)") + spin_t.set_ylabel("Amplitude") + + Ncols = int(scipy.floor(scipy.sqrt(tb._M))) + Nrows = int(scipy.floor(tb._M / Ncols)) + if(tb._M % Ncols != 0): + Nrows += 1 + + # Plot each of the channels outputs. Frequencies on Figure 2 and + # time signals on Figure 3 + fs_o = tb._fs / tb._M + Ts_o = 1.0/fs_o + Tmax_o = len(d)*Ts_o + for i in xrange(len(tb.snks)): + # remove issues with the transients at the beginning + # also remove some corruption at the end of the stream + # this is a bug, probably due to the corner cases + d = tb.snks[i].data()[Ns:Ne] + + sp1_f = fig1.add_subplot(Nrows, Ncols, 1+i) + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs_o, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_o = 10.0*scipy.log10(abs(X)) + f_o = freq + p2_f = sp1_f.plot(f_o, X_o, "b") + sp1_f.set_xlim([min(f_o), max(f_o)+1]) + sp1_f.set_ylim([-200.0, 50.0]) + + sp1_f.set_title(("Channel %d" % i), weight="bold") + sp1_f.set_xlabel("Frequency (Hz)") + sp1_f.set_ylabel("Power (dBW)") + + x_o = scipy.array(d) + t_o = scipy.arange(0, Tmax_o, Ts_o) + sp2_o = fig2.add_subplot(Nrows, Ncols, 1+i) + p2_o = sp2_o.plot(t_o, x_o.real, "b") + p2_o = sp2_o.plot(t_o, x_o.imag, "r") + sp2_o.set_xlim([min(t_o), max(t_o)+1]) + sp2_o.set_ylim([-2, 2]) + + sp2_o.set_title(("Channel %d" % i), weight="bold") + sp2_o.set_xlabel("Time (s)") + sp2_o.set_ylabel("Amplitude") + + + sp3 = fig3.add_subplot(1,1,1) + p3 = sp3.plot(t_o, x_o.real) + sp3.set_xlim([min(t_o), max(t_o)+1]) + sp3.set_ylim([-2, 2]) + + sp3.set_title("All Channels") + sp3.set_xlabel("Time (s)") + sp3.set_ylabel("Amplitude") + + pylab.show() + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass + diff --git a/gnuradio-examples/python/pfb/decimate.py b/gnuradio-examples/python/pfb/decimate.py new file mode 100755 index 000000000..cb5d61b72 --- /dev/null +++ b/gnuradio-examples/python/pfb/decimate.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 os +import scipy, pylab +from scipy import fftpack +from pylab import mlab +import time + +#print os.getpid() +#raw_input() + +class pfb_top_block(gr.top_block): + def __init__(self): + gr.top_block.__init__(self) + + self._N = 10000000 # number of samples to use + self._fs = 10000 # initial sampling rate + self._decim = 20 # Decimation rate + + # Generate the prototype filter taps for the decimators with a 200 Hz bandwidth + self._taps = gr.firdes.low_pass_2(1, self._fs, 200, 150, + attenuation_dB=120, window=gr.firdes.WIN_BLACKMAN_hARRIS) + + # Calculate the number of taps per channel for our own information + tpc = scipy.ceil(float(len(self._taps)) / float(self._decim)) + print "Number of taps: ", len(self._taps) + print "Number of filters: ", self._decim + print "Taps per channel: ", tpc + + # Build the input signal source + # We create a list of freqs, and a sine wave is generated and added to the source + # for each one of these frequencies. + self.signals = list() + self.add = gr.add_cc() + freqs = [10, 20, 2040] + for i in xrange(len(freqs)): + self.signals.append(gr.sig_source_c(self._fs, gr.GR_SIN_WAVE, freqs[i], 1)) + self.connect(self.signals[i], (self.add,i)) + + self.head = gr.head(gr.sizeof_gr_complex, self._N) + + # Construct a PFB decimator filter + self.pfb = blks2.pfb_decimator_ccf(self._decim, self._taps, 0) + + # Construct a standard FIR decimating filter + self.dec = gr.fir_filter_ccf(self._decim, self._taps) + + self.snk_i = gr.vector_sink_c() + + # Connect the blocks + self.connect(self.add, self.head, self.pfb) + self.connect(self.add, self.snk_i) + + # Create the sink for the decimated siganl + self.snk = gr.vector_sink_c() + self.connect(self.pfb, self.snk) + + +def main(): + tb = pfb_top_block() + + tstart = time.time() + tb.run() + tend = time.time() + print "Run time: %f" % (tend - tstart) + + if 1: + fig1 = pylab.figure(1, figsize=(16,9)) + fig2 = pylab.figure(2, figsize=(16,9)) + + Ns = 10000 + Ne = 10000 + + fftlen = 8192 + winfunc = scipy.blackman + fs = tb._fs + + # Plot the input to the decimator + + d = tb.snk_i.data()[Ns:Ns+Ne] + sp1_f = fig1.add_subplot(2, 1, 1) + + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_in = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_in = scipy.arange(-fs/2.0, fs/2.0, fs/float(X_in.size)) + p1_f = sp1_f.plot(f_in, X_in, "b") + sp1_f.set_xlim([min(f_in), max(f_in)+1]) + sp1_f.set_ylim([-200.0, 50.0]) + + sp1_f.set_title("Input Signal", weight="bold") + sp1_f.set_xlabel("Frequency (Hz)") + sp1_f.set_ylabel("Power (dBW)") + + Ts = 1.0/fs + Tmax = len(d)*Ts + + t_in = scipy.arange(0, Tmax, Ts) + x_in = scipy.array(d) + sp1_t = fig1.add_subplot(2, 1, 2) + p1_t = sp1_t.plot(t_in, x_in.real, "b") + p1_t = sp1_t.plot(t_in, x_in.imag, "r") + sp1_t.set_ylim([-tb._decim*1.1, tb._decim*1.1]) + + sp1_t.set_xlabel("Time (s)") + sp1_t.set_ylabel("Amplitude") + + + # Plot the output of the decimator + fs_o = tb._fs / tb._decim + + sp2_f = fig2.add_subplot(2, 1, 1) + d = tb.snk.data()[Ns:Ns+Ne] + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs_o, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_o = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_o = scipy.arange(-fs_o/2.0, fs_o/2.0, fs_o/float(X_o.size)) + p2_f = sp2_f.plot(f_o, X_o, "b") + sp2_f.set_xlim([min(f_o), max(f_o)+1]) + sp2_f.set_ylim([-200.0, 50.0]) + + sp2_f.set_title("PFB Decimated Signal", weight="bold") + sp2_f.set_xlabel("Frequency (Hz)") + sp2_f.set_ylabel("Power (dBW)") + + + Ts_o = 1.0/fs_o + Tmax_o = len(d)*Ts_o + + x_o = scipy.array(d) + t_o = scipy.arange(0, Tmax_o, Ts_o) + sp2_t = fig2.add_subplot(2, 1, 2) + p2_t = sp2_t.plot(t_o, x_o.real, "b-o") + p2_t = sp2_t.plot(t_o, x_o.imag, "r-o") + sp2_t.set_ylim([-2.5, 2.5]) + + sp2_t.set_xlabel("Time (s)") + sp2_t.set_ylabel("Amplitude") + + pylab.show() + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass + diff --git a/gnuradio-examples/python/pfb/fmtest.py b/gnuradio-examples/python/pfb/fmtest.py new file mode 100755 index 000000000..97df0e0f5 --- /dev/null +++ b/gnuradio-examples/python/pfb/fmtest.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python +# + + +from gnuradio import gr, eng_notation +from gnuradio import blks2 +from gnuradio.eng_option import eng_option +from optparse import OptionParser +import math, time, sys, scipy, pylab +from scipy import fftpack + +class fmtx(gr.hier_block2): + def __init__(self, lo_freq, audio_rate, if_rate): + + gr.hier_block2.__init__(self, "build_fm", + gr.io_signature(1, 1, gr.sizeof_float), # Input signature + gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature + + fmtx = blks2.nbfm_tx (audio_rate, if_rate, max_dev=5e3, tau=75e-6) + + # Local oscillator + lo = gr.sig_source_c (if_rate, # sample rate + gr.GR_SIN_WAVE, # waveform type + lo_freq, #frequency + 1.0, # amplitude + 0) # DC Offset + mixer = gr.multiply_cc () + + self.connect (self, fmtx, (mixer, 0)) + self.connect (lo, (mixer, 1)) + self.connect (mixer, self) + +class fmtest(gr.top_block): + def __init__(self): + gr.top_block.__init__(self) + + self._nsamples = 1000000 + self._audio_rate = 8000 + + # Set up N channels with their own baseband and IF frequencies + self._N = 5 + chspacing = 16000 + freq = [10, 20, 30, 40, 50] + f_lo = [0, 1*chspacing, -1*chspacing, 2*chspacing, -2*chspacing] + + self._if_rate = 4*self._N*self._audio_rate + + # Create a signal source and frequency modulate it + self.sum = gr.add_cc () + for n in xrange(self._N): + sig = gr.sig_source_f(self._audio_rate, gr.GR_SIN_WAVE, freq[n], 0.5) + fm = fmtx(f_lo[n], self._audio_rate, self._if_rate) + self.connect(sig, fm) + self.connect(fm, (self.sum, n)) + + self.head = gr.head(gr.sizeof_gr_complex, self._nsamples) + self.snk_tx = gr.vector_sink_c() + self.channel = blks2.channel_model(0.1) + + self.connect(self.sum, self.head, self.channel, self.snk_tx) + + + # Design the channlizer + self._M = 10 + bw = chspacing/2.0 + t_bw = chspacing/10.0 + self._chan_rate = self._if_rate / self._M + self._taps = gr.firdes.low_pass_2(1, self._if_rate, bw, t_bw, + attenuation_dB=100, + window=gr.firdes.WIN_BLACKMAN_hARRIS) + tpc = math.ceil(float(len(self._taps)) / float(self._M)) + + print "Number of taps: ", len(self._taps) + print "Number of channels: ", self._M + print "Taps per channel: ", tpc + + self.pfb = blks2.pfb_channelizer_ccf(self._M, self._taps) + + self.connect(self.channel, self.pfb) + + # Create a file sink for each of M output channels of the filter and connect it + self.fmdet = list() + self.squelch = list() + self.snks = list() + for i in xrange(self._M): + self.fmdet.append(blks2.nbfm_rx(self._audio_rate, self._chan_rate)) + self.squelch.append(blks2.standard_squelch(self._audio_rate*10)) + self.snks.append(gr.vector_sink_f()) + self.connect((self.pfb, i), self.fmdet[i], self.squelch[i], self.snks[i]) + + def num_tx_channels(self): + return self._N + + def num_rx_channels(self): + return self._M + +def main(): + + fm = fmtest() + + tstart = time.time() + fm.run() + tend = time.time() + + if 1: + fig1 = pylab.figure(1, figsize=(12,10), facecolor="w") + fig2 = pylab.figure(2, figsize=(12,10), facecolor="w") + fig3 = pylab.figure(3, figsize=(12,10), facecolor="w") + + Ns = 10000 + Ne = 100000 + + fftlen = 8192 + winfunc = scipy.blackman + + # Plot transmitted signal + fs = fm._if_rate + + d = fm.snk_tx.data()[Ns:Ns+Ne] + sp1_f = fig1.add_subplot(2, 1, 1) + + X,freq = sp1_f.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + visible=False) + X_in = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_in = scipy.arange(-fs/2.0, fs/2.0, fs/float(X_in.size)) + p1_f = sp1_f.plot(f_in, X_in, "b") + sp1_f.set_xlim([min(f_in), max(f_in)+1]) + sp1_f.set_ylim([-120.0, 20.0]) + + sp1_f.set_title("Input Signal", weight="bold") + sp1_f.set_xlabel("Frequency (Hz)") + sp1_f.set_ylabel("Power (dBW)") + + Ts = 1.0/fs + Tmax = len(d)*Ts + + t_in = scipy.arange(0, Tmax, Ts) + x_in = scipy.array(d) + sp1_t = fig1.add_subplot(2, 1, 2) + p1_t = sp1_t.plot(t_in, x_in.real, "b-o") + #p1_t = sp1_t.plot(t_in, x_in.imag, "r-o") + sp1_t.set_ylim([-5, 5]) + + # Set up the number of rows and columns for plotting the subfigures + Ncols = int(scipy.floor(scipy.sqrt(fm.num_rx_channels()))) + Nrows = int(scipy.floor(fm.num_rx_channels() / Ncols)) + if(fm.num_rx_channels() % Ncols != 0): + Nrows += 1 + + # Plot each of the channels outputs. Frequencies on Figure 2 and + # time signals on Figure 3 + fs_o = fm._audio_rate + for i in xrange(len(fm.snks)): + # remove issues with the transients at the beginning + # also remove some corruption at the end of the stream + # this is a bug, probably due to the corner cases + d = fm.snks[i].data()[Ns:Ne] + + sp2_f = fig2.add_subplot(Nrows, Ncols, 1+i) + X,freq = sp2_f.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs_o, + window = lambda d: d*winfunc(fftlen), + visible=False) + #X_o = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + X_o = 10.0*scipy.log10(abs(X)) + #f_o = scipy.arange(-fs_o/2.0, fs_o/2.0, fs_o/float(X_o.size)) + f_o = scipy.arange(0, fs_o/2.0, fs_o/2.0/float(X_o.size)) + p2_f = sp2_f.plot(f_o, X_o, "b") + sp2_f.set_xlim([min(f_o), max(f_o)+0.1]) + sp2_f.set_ylim([-120.0, 20.0]) + sp2_f.grid(True) + + sp2_f.set_title(("Channel %d" % i), weight="bold") + sp2_f.set_xlabel("Frequency (kHz)") + sp2_f.set_ylabel("Power (dBW)") + + + Ts = 1.0/fs_o + Tmax = len(d)*Ts + t_o = scipy.arange(0, Tmax, Ts) + + x_t = scipy.array(d) + sp2_t = fig3.add_subplot(Nrows, Ncols, 1+i) + p2_t = sp2_t.plot(t_o, x_t.real, "b") + p2_t = sp2_t.plot(t_o, x_t.imag, "r") + sp2_t.set_xlim([min(t_o), max(t_o)+1]) + sp2_t.set_ylim([-1, 1]) + + sp2_t.set_xlabel("Time (s)") + sp2_t.set_ylabel("Amplitude") + + + pylab.show() + + +if __name__ == "__main__": + main() diff --git a/gnuradio-examples/python/pfb/interpolate.py b/gnuradio-examples/python/pfb/interpolate.py new file mode 100755 index 000000000..a7a2522f8 --- /dev/null +++ b/gnuradio-examples/python/pfb/interpolate.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python +# +# Copyright 2009 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 os +import scipy, pylab +from scipy import fftpack +from pylab import mlab +import time + +#print os.getpid() +#raw_input() + +class pfb_top_block(gr.top_block): + def __init__(self): + gr.top_block.__init__(self) + + self._N = 100000 # number of samples to use + self._fs = 2000 # initial sampling rate + self._interp = 5 # Interpolation rate for PFB interpolator + self._ainterp = 5.5 # Resampling rate for the PFB arbitrary resampler + + # Frequencies of the signals we construct + freq1 = 100 + freq2 = 200 + + # Create a set of taps for the PFB interpolator + # This is based on the post-interpolation sample rate + self._taps = gr.firdes.low_pass_2(self._interp, self._interp*self._fs, freq2+50, 50, + attenuation_dB=120, window=gr.firdes.WIN_BLACKMAN_hARRIS) + + # Create a set of taps for the PFB arbitrary resampler + # The filter size is the number of filters in the filterbank; 32 will give very low side-lobes, + # and larger numbers will reduce these even farther + # The taps in this filter are based on a sampling rate of the filter size since it acts + # internally as an interpolator. + flt_size = 32 + self._taps2 = gr.firdes.low_pass_2(flt_size, flt_size*self._fs, freq2+50, 150, + attenuation_dB=120, window=gr.firdes.WIN_BLACKMAN_hARRIS) + + # Calculate the number of taps per channel for our own information + tpc = scipy.ceil(float(len(self._taps)) / float(self._interp)) + print "Number of taps: ", len(self._taps) + print "Number of filters: ", self._interp + print "Taps per channel: ", tpc + + # Create a couple of signals at different frequencies + self.signal1 = gr.sig_source_c(self._fs, gr.GR_SIN_WAVE, freq1, 0.5) + self.signal2 = gr.sig_source_c(self._fs, gr.GR_SIN_WAVE, freq2, 0.5) + self.signal = gr.add_cc() + + self.head = gr.head(gr.sizeof_gr_complex, self._N) + + # Construct the PFB interpolator filter + self.pfb = blks2.pfb_interpolator_ccf(self._interp, self._taps) + + # Construct the PFB arbitrary resampler filter + self.pfb_ar = blks2.pfb_arb_resampler_ccf(self._ainterp, self._taps2, flt_size) + self.snk_i = gr.vector_sink_c() + + #self.pfb_ar.pfb.print_taps() + #self.pfb.pfb.print_taps() + + # Connect the blocks + self.connect(self.signal1, self.head, (self.signal,0)) + self.connect(self.signal2, (self.signal,1)) + self.connect(self.signal, self.pfb) + self.connect(self.signal, self.pfb_ar) + self.connect(self.signal, self.snk_i) + + # Create the sink for the interpolated signals + self.snk1 = gr.vector_sink_c() + self.snk2 = gr.vector_sink_c() + self.connect(self.pfb, self.snk1) + self.connect(self.pfb_ar, self.snk2) + + +def main(): + tb = pfb_top_block() + + tstart = time.time() + tb.run() + tend = time.time() + print "Run time: %f" % (tend - tstart) + + + if 1: + fig1 = pylab.figure(1, figsize=(12,10), facecolor="w") + fig2 = pylab.figure(2, figsize=(12,10), facecolor="w") + fig3 = pylab.figure(3, figsize=(12,10), facecolor="w") + + Ns = 10000 + Ne = 10000 + + fftlen = 8192 + winfunc = scipy.blackman + + # Plot input signal + fs = tb._fs + + d = tb.snk_i.data()[Ns:Ns+Ne] + sp1_f = fig1.add_subplot(2, 1, 1) + + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_in = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_in = scipy.arange(-fs/2.0, fs/2.0, fs/float(X_in.size)) + p1_f = sp1_f.plot(f_in, X_in, "b") + sp1_f.set_xlim([min(f_in), max(f_in)+1]) + sp1_f.set_ylim([-200.0, 50.0]) + + + sp1_f.set_title("Input Signal", weight="bold") + sp1_f.set_xlabel("Frequency (Hz)") + sp1_f.set_ylabel("Power (dBW)") + + Ts = 1.0/fs + Tmax = len(d)*Ts + + t_in = scipy.arange(0, Tmax, Ts) + x_in = scipy.array(d) + sp1_t = fig1.add_subplot(2, 1, 2) + p1_t = sp1_t.plot(t_in, x_in.real, "b-o") + #p1_t = sp1_t.plot(t_in, x_in.imag, "r-o") + sp1_t.set_ylim([-2.5, 2.5]) + + sp1_t.set_title("Input Signal", weight="bold") + sp1_t.set_xlabel("Time (s)") + sp1_t.set_ylabel("Amplitude") + + + # Plot output of PFB interpolator + fs_int = tb._fs*tb._interp + + sp2_f = fig2.add_subplot(2, 1, 1) + d = tb.snk1.data()[Ns:Ns+(tb._interp*Ne)] + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_o = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_o = scipy.arange(-fs_int/2.0, fs_int/2.0, fs_int/float(X_o.size)) + p2_f = sp2_f.plot(f_o, X_o, "b") + sp2_f.set_xlim([min(f_o), max(f_o)+1]) + sp2_f.set_ylim([-200.0, 50.0]) + + sp2_f.set_title("Output Signal from PFB Interpolator", weight="bold") + sp2_f.set_xlabel("Frequency (Hz)") + sp2_f.set_ylabel("Power (dBW)") + + Ts_int = 1.0/fs_int + Tmax = len(d)*Ts_int + + t_o = scipy.arange(0, Tmax, Ts_int) + x_o1 = scipy.array(d) + sp2_t = fig2.add_subplot(2, 1, 2) + p2_t = sp2_t.plot(t_o, x_o1.real, "b-o") + #p2_t = sp2_t.plot(t_o, x_o.imag, "r-o") + sp2_t.set_ylim([-2.5, 2.5]) + + sp2_t.set_title("Output Signal from PFB Interpolator", weight="bold") + sp2_t.set_xlabel("Time (s)") + sp2_t.set_ylabel("Amplitude") + + + # Plot output of PFB arbitrary resampler + fs_aint = tb._fs * tb._ainterp + + sp3_f = fig3.add_subplot(2, 1, 1) + d = tb.snk2.data()[Ns:Ns+(tb._interp*Ne)] + X,freq = mlab.psd(d, NFFT=fftlen, noverlap=fftlen/4, Fs=fs, + window = lambda d: d*winfunc(fftlen), + scale_by_freq=True) + X_o = 10.0*scipy.log10(abs(fftpack.fftshift(X))) + f_o = scipy.arange(-fs_aint/2.0, fs_aint/2.0, fs_aint/float(X_o.size)) + p3_f = sp3_f.plot(f_o, X_o, "b") + sp3_f.set_xlim([min(f_o), max(f_o)+1]) + sp3_f.set_ylim([-200.0, 50.0]) + + sp3_f.set_title("Output Signal from PFB Arbitrary Resampler", weight="bold") + sp3_f.set_xlabel("Frequency (Hz)") + sp3_f.set_ylabel("Power (dBW)") + + Ts_aint = 1.0/fs_aint + Tmax = len(d)*Ts_aint + + t_o = scipy.arange(0, Tmax, Ts_aint) + x_o2 = scipy.array(d) + sp3_f = fig3.add_subplot(2, 1, 2) + p3_f = sp3_f.plot(t_o, x_o2.real, "b-o") + p3_f = sp3_f.plot(t_o, x_o1.real, "m-o") + #p3_f = sp3_f.plot(t_o, x_o2.imag, "r-o") + sp3_f.set_ylim([-2.5, 2.5]) + + sp3_f.set_title("Output Signal from PFB Arbitrary Resampler", weight="bold") + sp3_f.set_xlabel("Time (s)") + sp3_f.set_ylabel("Amplitude") + + pylab.show() + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass + diff --git a/gnuradio-examples/python/usrp/.gitignore b/gnuradio-examples/python/usrp/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gnuradio-examples/python/usrp/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gnuradio-examples/python/usrp2/.gitignore b/gnuradio-examples/python/usrp2/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gnuradio-examples/python/usrp2/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-atsc/.gitignore b/gr-atsc/.gitignore new file mode 100644 index 000000000..16905156d --- /dev/null +++ b/gr-atsc/.gitignore @@ -0,0 +1,23 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/gnuradio-atsc.pc diff --git a/gr-atsc/doc/.gitignore b/gr-atsc/doc/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/gr-atsc/doc/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/gr-atsc/src/.gitignore b/gr-atsc/src/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/gr-atsc/src/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/gr-atsc/src/lib/.gitignore b/gr-atsc/src/lib/.gitignore new file mode 100644 index 000000000..01e4ffe9a --- /dev/null +++ b/gr-atsc/src/lib/.gitignore @@ -0,0 +1,14 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/atsc.cc +/atsc.py +/atsci_viterbi_gen +/atsci_viterbi_mux.cc +/test_atsci +/*.pyc diff --git a/gr-atsc/src/python/.gitignore b/gr-atsc/src/python/.gitignore new file mode 100644 index 000000000..bf03975bb --- /dev/null +++ b/gr-atsc/src/python/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/run_tests diff --git a/gr-audio-alsa/.gitignore b/gr-audio-alsa/.gitignore new file mode 100644 index 000000000..cdcf41b15 --- /dev/null +++ b/gr-audio-alsa/.gitignore @@ -0,0 +1,30 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 diff --git a/gr-audio-alsa/src/.gitignore b/gr-audio-alsa/src/.gitignore new file mode 100644 index 000000000..b751c6731 --- /dev/null +++ b/gr-audio-alsa/src/.gitignore @@ -0,0 +1,16 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/usrp.py +/usrp.cc +/audio_oss.cc +/audio_oss.py +/audio_alsa.py +/audio_alsa.cc +/run_tests +/*.pyc diff --git a/gr-audio-jack/.gitignore b/gr-audio-jack/.gitignore new file mode 100644 index 000000000..cdcf41b15 --- /dev/null +++ b/gr-audio-jack/.gitignore @@ -0,0 +1,30 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 diff --git a/gr-audio-jack/src/.gitignore b/gr-audio-jack/src/.gitignore new file mode 100644 index 000000000..46103bc25 --- /dev/null +++ b/gr-audio-jack/src/.gitignore @@ -0,0 +1,12 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/audio_jack.cc +/audio_jack.py +/run_tests diff --git a/gr-audio-oss/.gitignore b/gr-audio-oss/.gitignore new file mode 100644 index 000000000..cdcf41b15 --- /dev/null +++ b/gr-audio-oss/.gitignore @@ -0,0 +1,30 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 diff --git a/gr-audio-oss/src/.gitignore b/gr-audio-oss/src/.gitignore new file mode 100644 index 000000000..ac39b2a0a --- /dev/null +++ b/gr-audio-oss/src/.gitignore @@ -0,0 +1,14 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/usrp.py +/usrp.cc +/audio_oss.cc +/audio_oss.py +/run_tests +/*.pyc diff --git a/gr-audio-osx/.gitignore b/gr-audio-osx/.gitignore new file mode 100644 index 000000000..cdcf41b15 --- /dev/null +++ b/gr-audio-osx/.gitignore @@ -0,0 +1,30 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 diff --git a/gr-audio-osx/src/.gitignore b/gr-audio-osx/src/.gitignore new file mode 100644 index 000000000..5a5590a64 --- /dev/null +++ b/gr-audio-osx/src/.gitignore @@ -0,0 +1,13 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/usrp.py +/usrp.cc +/audio_osx.cc +/audio_osx.py +/run_tests diff --git a/gr-audio-portaudio/.gitignore b/gr-audio-portaudio/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gr-audio-portaudio/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gr-audio-portaudio/src/.gitignore b/gr-audio-portaudio/src/.gitignore new file mode 100644 index 000000000..8c29d3577 --- /dev/null +++ b/gr-audio-portaudio/src/.gitignore @@ -0,0 +1,17 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/usrp.py +/usrp.cc +/audio_oss.cc +/audio_oss.py +/audio_portaudio.py +/audio_portaudio.cc +/run_tests diff --git a/gr-audio-windows/.gitignore b/gr-audio-windows/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gr-audio-windows/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gr-audio-windows/src/.gitignore b/gr-audio-windows/src/.gitignore new file mode 100644 index 000000000..087446597 --- /dev/null +++ b/gr-audio-windows/src/.gitignore @@ -0,0 +1,35 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in +/run_tests +/audio_windows.cc +/audio_windows.py diff --git a/gr-comedi/.gitignore b/gr-comedi/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gr-comedi/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gr-comedi/src/.gitignore b/gr-comedi/src/.gitignore new file mode 100644 index 000000000..d95b6dc4f --- /dev/null +++ b/gr-comedi/src/.gitignore @@ -0,0 +1,12 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/comedi.cc +/*.pyc +/comedi.py +/run_tests diff --git a/gr-cvsd-vocoder/.gitignore b/gr-cvsd-vocoder/.gitignore new file mode 100644 index 000000000..a37fc0c1a --- /dev/null +++ b/gr-cvsd-vocoder/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pc diff --git a/gr-cvsd-vocoder/src/.gitignore b/gr-cvsd-vocoder/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-cvsd-vocoder/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-cvsd-vocoder/src/lib/.gitignore b/gr-cvsd-vocoder/src/lib/.gitignore new file mode 100644 index 000000000..306156d5f --- /dev/null +++ b/gr-cvsd-vocoder/src/lib/.gitignore @@ -0,0 +1,6 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/cvsd_vocoder.cc +/cvsd_vocoder.py* diff --git a/gr-cvsd-vocoder/src/python/.gitignore b/gr-cvsd-vocoder/src/python/.gitignore new file mode 100644 index 000000000..604b402c5 --- /dev/null +++ b/gr-cvsd-vocoder/src/python/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/run_tests diff --git a/gr-gcell/.gitignore b/gr-gcell/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gr-gcell/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gr-gcell/src/.gitignore b/gr-gcell/src/.gitignore new file mode 100644 index 000000000..8f9e3f05b --- /dev/null +++ b/gr-gcell/src/.gitignore @@ -0,0 +1,36 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in +/run_tests +/gcell.d +/gcell.cc +/gcell.py diff --git a/gr-gcell/src/examples/.gitignore b/gr-gcell/src/examples/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gr-gcell/src/examples/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gr-gpio/.gitignore b/gr-gpio/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-gpio/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-gpio/src/.gitignore b/gr-gpio/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-gpio/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-gpio/src/fpga/.gitignore b/gr-gpio/src/fpga/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-gpio/src/fpga/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-gpio/src/fpga/include/.gitignore b/gr-gpio/src/fpga/include/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-gpio/src/fpga/include/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-gpio/src/fpga/lib/.gitignore b/gr-gpio/src/fpga/lib/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-gpio/src/fpga/lib/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-gpio/src/fpga/rbf/.gitignore b/gr-gpio/src/fpga/rbf/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-gpio/src/fpga/rbf/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-gpio/src/fpga/top/.gitignore b/gr-gpio/src/fpga/top/.gitignore new file mode 100644 index 000000000..28be78cfc --- /dev/null +++ b/gr-gpio/src/fpga/top/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/db +/prev*.* +/*.summary +/*.qws +/*.rpt +/*.done +/*.pin +/*.sof +/*.rbf diff --git a/gr-gpio/src/python/.gitignore b/gr-gpio/src/python/.gitignore new file mode 100644 index 000000000..b9e19a979 --- /dev/null +++ b/gr-gpio/src/python/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/*.pyc +/run_tests diff --git a/gr-gsm-fr-vocoder/.gitignore b/gr-gsm-fr-vocoder/.gitignore new file mode 100644 index 000000000..f3462d009 --- /dev/null +++ b/gr-gsm-fr-vocoder/.gitignore @@ -0,0 +1,23 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/*.pc diff --git a/gr-gsm-fr-vocoder/src/.gitignore b/gr-gsm-fr-vocoder/src/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/gr-gsm-fr-vocoder/src/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/gr-gsm-fr-vocoder/src/lib/.gitignore b/gr-gsm-fr-vocoder/src/lib/.gitignore new file mode 100644 index 000000000..81a82de9a --- /dev/null +++ b/gr-gsm-fr-vocoder/src/lib/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/gsm_full_rate.py +/gsm_full_rate.cc +/*.pyc diff --git a/gr-gsm-fr-vocoder/src/lib/gsm/.gitignore b/gr-gsm-fr-vocoder/src/lib/gsm/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gr-gsm-fr-vocoder/src/lib/gsm/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gr-gsm-fr-vocoder/src/python/.gitignore b/gr-gsm-fr-vocoder/src/python/.gitignore new file mode 100644 index 000000000..bf03975bb --- /dev/null +++ b/gr-gsm-fr-vocoder/src/python/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/run_tests diff --git a/gr-howto-write-a-block/.gitignore b/gr-howto-write-a-block/.gitignore new file mode 100644 index 000000000..543c391df --- /dev/null +++ b/gr-howto-write-a-block/.gitignore @@ -0,0 +1,26 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/py-compile +/depcomp +/ltmain.sh +/install-sh diff --git a/gr-howto-write-a-block/config/.gitignore b/gr-howto-write-a-block/config/.gitignore new file mode 100644 index 000000000..16f775e32 --- /dev/null +++ b/gr-howto-write-a-block/config/.gitignore @@ -0,0 +1,15 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/libtool.m4 +/lt~obsolete.m4 +/ltsugar.m4 +/ltversion.m4 +/ltoptions.m4 diff --git a/gr-howto-write-a-block/doc/.gitignore b/gr-howto-write-a-block/doc/.gitignore new file mode 100644 index 000000000..f65ab6cf7 --- /dev/null +++ b/gr-howto-write-a-block/doc/.gitignore @@ -0,0 +1,18 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/howto-write-a-block.html +/gr_block.h.xml +/howto_1.i.xml +/howto_square_ff.cc.xml +/howto_square_ff.h.xml +/qa_howto_1.py.xml +/src_lib_Makefile_1.am.xml +/src_lib_Makefile_2.am.xml +/howto_square2_ff.cc.xml +/howto_square2_ff.h.xml diff --git a/gr-howto-write-a-block/src/.gitignore b/gr-howto-write-a-block/src/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/gr-howto-write-a-block/src/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/gr-howto-write-a-block/src/lib/.gitignore b/gr-howto-write-a-block/src/lib/.gitignore new file mode 100644 index 000000000..d957a6821 --- /dev/null +++ b/gr-howto-write-a-block/src/lib/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/howto.cc +/howto.py diff --git a/gr-howto-write-a-block/src/python/.gitignore b/gr-howto-write-a-block/src/python/.gitignore new file mode 100644 index 000000000..bf03975bb --- /dev/null +++ b/gr-howto-write-a-block/src/python/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/run_tests diff --git a/gr-msdd6000/.gitignore b/gr-msdd6000/.gitignore new file mode 100644 index 000000000..a37fc0c1a --- /dev/null +++ b/gr-msdd6000/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pc diff --git a/gr-msdd6000/src/.gitignore b/gr-msdd6000/src/.gitignore new file mode 100644 index 000000000..33061d3ab --- /dev/null +++ b/gr-msdd6000/src/.gitignore @@ -0,0 +1,6 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/msdd.cc +/msdd.py diff --git a/gr-pager/.gitignore b/gr-pager/.gitignore new file mode 100644 index 000000000..27ff67327 --- /dev/null +++ b/gr-pager/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/data +/*.pc diff --git a/gr-pager/src/.gitignore b/gr-pager/src/.gitignore new file mode 100644 index 000000000..3e806d690 --- /dev/null +++ b/gr-pager/src/.gitignore @@ -0,0 +1,8 @@ +/.libs +/.deps +/Makefile +/Makefile.in +/pager_swig.py +/pager_swig.cc +/*.pyc +/run_tests diff --git a/gr-qtgui/.gitignore b/gr-qtgui/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-qtgui/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-qtgui/src/.gitignore b/gr-qtgui/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-qtgui/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-qtgui/src/lib/.gitignore b/gr-qtgui/src/lib/.gitignore new file mode 100644 index 000000000..58c8081e5 --- /dev/null +++ b/gr-qtgui/src/lib/.gitignore @@ -0,0 +1,13 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/qtgui.cc +/qtgui.py +/WaterfallDisplayPlot_moc.cc +/Waterfall3DDisplayPlot_moc.cc +/TimeDomainDisplayPlot_moc.cc +/spectrumdisplayform_moc.cc +/spectrumdisplayform_ui.h +/FrequencyDisplayPlot_moc.cc +/ConstellationDisplayPlot_moc.cc diff --git a/gr-qtgui/src/lib/ConstellationDisplayPlot.cc b/gr-qtgui/src/lib/ConstellationDisplayPlot.cc index 10355f9f0..80bf4503f 100644 --- a/gr-qtgui/src/lib/ConstellationDisplayPlot.cc +++ b/gr-qtgui/src/lib/ConstellationDisplayPlot.cc @@ -32,7 +32,9 @@ protected: } }; -ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent):QwtPlot(parent){ +ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent) + : QwtPlot(parent) +{ timespec_reset(&_lastReplot); resize(parent->width(), parent->height()); @@ -40,6 +42,7 @@ ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent):QwtPlot(pare _displayIntervalTime = (1.0/10.0); // 1/10 of a second between updates _numPoints = 1024; + _penSize = 5; _realDataPoints = new double[_numPoints]; _imagDataPoints = new double[_numPoints]; @@ -67,7 +70,7 @@ ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent):QwtPlot(pare // Automatically deleted when parent is deleted _plot_curve = new QwtPlotCurve("Constellation Points"); _plot_curve->attach(this); - _plot_curve->setPen(QPen(Qt::blue, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + _plot_curve->setPen(QPen(Qt::blue, _penSize, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); _plot_curve->setStyle(QwtPlotCurve::Dots); _plot_curve->setRawData(_realDataPoints, _imagDataPoints, _numPoints); @@ -106,7 +109,8 @@ ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent):QwtPlot(pare this, SLOT( LegendEntryChecked(QwtPlotItem *, bool ) )); } -ConstellationDisplayPlot::~ConstellationDisplayPlot(){ +ConstellationDisplayPlot::~ConstellationDisplayPlot() +{ delete[] _realDataPoints; delete[] _imagDataPoints; @@ -114,6 +118,16 @@ ConstellationDisplayPlot::~ConstellationDisplayPlot(){ // _zoomer and _panner deleted when parent deleted } +void +ConstellationDisplayPlot::set_pen_size(int size) +{ + if(size > 0 && size < 30){ + _penSize = size; + _plot_curve->setPen(QPen(Qt::blue, _penSize, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + } +} + + void ConstellationDisplayPlot::set_xaxis(double min, double max) { @@ -149,7 +163,16 @@ void ConstellationDisplayPlot::replot(){ } } -void ConstellationDisplayPlot::PlotNewData(const double* realDataPoints, const double* imagDataPoints, const int64_t numDataPoints){ +void +ConstellationDisplayPlot::resizeSlot( QSize *s ) +{ + resize(s->width(), s->height()); +} + +void ConstellationDisplayPlot::PlotNewData(const double* realDataPoints, + const double* imagDataPoints, + const int64_t numDataPoints) +{ if(numDataPoints > 0){ if(numDataPoints != _numPoints){ @@ -177,7 +200,9 @@ void ConstellationDisplayPlot::PlotNewData(const double* realDataPoints, const d } } -void ConstellationDisplayPlot::LegendEntryChecked(QwtPlotItem* plotItem, bool on){ +void +ConstellationDisplayPlot::LegendEntryChecked(QwtPlotItem* plotItem, bool on) +{ plotItem->setVisible(!on); } diff --git a/gr-qtgui/src/lib/ConstellationDisplayPlot.h b/gr-qtgui/src/lib/ConstellationDisplayPlot.h index 612cd2b39..99ae566e0 100644 --- a/gr-qtgui/src/lib/ConstellationDisplayPlot.h +++ b/gr-qtgui/src/lib/ConstellationDisplayPlot.h @@ -14,14 +14,16 @@ #include <highResTimeFunctions.h> #include <qwt_symbol.h> -class ConstellationDisplayPlot:public QwtPlot{ +class ConstellationDisplayPlot : public QwtPlot +{ Q_OBJECT public: ConstellationDisplayPlot(QWidget*); virtual ~ConstellationDisplayPlot(); - void PlotNewData(const double* realDataPoints, const double* imagDataPoints, + void PlotNewData(const double* realDataPoints, + const double* imagDataPoints, const int64_t numDataPoints); virtual void replot(); @@ -30,6 +32,10 @@ public: void set_yaxis(double min, double max); void set_axis(double xmin, double xmax, double ymin, double ymax); + void set_pen_size(int size); + +public slots: + void resizeSlot( QSize *s ); protected slots: void LegendEntryChecked(QwtPlotItem *plotItem, bool on); @@ -48,6 +54,7 @@ private: timespec _lastReplot; int64_t _numPoints; + int64_t _penSize; double _displayIntervalTime; }; diff --git a/gr-qtgui/src/lib/FrequencyDisplayPlot.cc b/gr-qtgui/src/lib/FrequencyDisplayPlot.cc index e299157f5..7deff8543 100644 --- a/gr-qtgui/src/lib/FrequencyDisplayPlot.cc +++ b/gr-qtgui/src/lib/FrequencyDisplayPlot.cc @@ -93,7 +93,7 @@ FrequencyDisplayPlot::FrequencyDisplayPlot(QWidget* parent) timespec_reset(&_lastReplot); resize(parent->width(), parent->height()); - + _displayIntervalTime = (1.0/10.0); // 1/10 of a second between updates _useCenterFrequencyFlag = false; @@ -314,6 +314,12 @@ FrequencyDisplayPlot::replot() _displayIntervalTime = differenceTime; } } + +void +FrequencyDisplayPlot::resizeSlot( QSize *s ) +{ + resize(s->width(), s->height()); +} void FrequencyDisplayPlot::PlotNewData(const double* dataPoints, const int64_t numDataPoints, diff --git a/gr-qtgui/src/lib/FrequencyDisplayPlot.h b/gr-qtgui/src/lib/FrequencyDisplayPlot.h index 5e8282962..785efe694 100644 --- a/gr-qtgui/src/lib/FrequencyDisplayPlot.h +++ b/gr-qtgui/src/lib/FrequencyDisplayPlot.h @@ -43,12 +43,14 @@ public: void set_yaxis(double min, double max); public slots: + void resizeSlot( QSize *e ); void SetLowerIntensityLevel(const double); void SetUpperIntensityLevel(const double); protected: private: + void _resetXAxisPoints(); double _startFrequency; diff --git a/gr-qtgui/src/lib/SpectrumGUIClass.cc b/gr-qtgui/src/lib/SpectrumGUIClass.cc index 34062209e..4cb71a31a 100644 --- a/gr-qtgui/src/lib/SpectrumGUIClass.cc +++ b/gr-qtgui/src/lib/SpectrumGUIClass.cc @@ -449,6 +449,12 @@ SpectrumGUIClass::SetConstellationAxis(double xmin, double xmax, } void +SpectrumGUIClass::SetConstellationPenSize(int size){ + _spectrumDisplayForm->SetConstellationPenSize(size); +} + + +void SpectrumGUIClass::SetFrequencyAxis(double min, double max) { _spectrumDisplayForm->SetFrequencyAxis(min, max); diff --git a/gr-qtgui/src/lib/SpectrumGUIClass.h b/gr-qtgui/src/lib/SpectrumGUIClass.h index 9a55271df..d8dcb2769 100644 --- a/gr-qtgui/src/lib/SpectrumGUIClass.h +++ b/gr-qtgui/src/lib/SpectrumGUIClass.h @@ -76,6 +76,7 @@ public: void SetTimeDomainAxis(double min, double max); void SetConstellationAxis(double xmin, double xmax, double ymin, double ymax); + void SetConstellationPenSize(int size); void SetFrequencyAxis(double min, double max); protected: diff --git a/gr-qtgui/src/lib/TimeDomainDisplayPlot.cc b/gr-qtgui/src/lib/TimeDomainDisplayPlot.cc index 6d8ef6ee4..cb18b4418 100644 --- a/gr-qtgui/src/lib/TimeDomainDisplayPlot.cc +++ b/gr-qtgui/src/lib/TimeDomainDisplayPlot.cc @@ -141,8 +141,8 @@ TimeDomainDisplayPlot::set_xaxis(double min, double max) } -void TimeDomainDisplayPlot::replot(){ - +void TimeDomainDisplayPlot::replot() +{ const timespec startTime = get_highres_clock(); QwtPlot::replot(); @@ -156,9 +156,16 @@ void TimeDomainDisplayPlot::replot(){ } } +void +TimeDomainDisplayPlot::resizeSlot( QSize *s ) +{ + resize(s->width(), s->height()); +} + void TimeDomainDisplayPlot::PlotNewData(const double* realDataPoints, const double* imagDataPoints, - const int64_t numDataPoints){ + const int64_t numDataPoints) +{ if(numDataPoints > 0){ if(numDataPoints != _numPoints){ diff --git a/gr-qtgui/src/lib/TimeDomainDisplayPlot.h b/gr-qtgui/src/lib/TimeDomainDisplayPlot.h index 56d44539d..8d98abac6 100644 --- a/gr-qtgui/src/lib/TimeDomainDisplayPlot.h +++ b/gr-qtgui/src/lib/TimeDomainDisplayPlot.h @@ -30,6 +30,9 @@ public: void set_yaxis(double min, double max); void set_xaxis(double min, double max); +public slots: + void resizeSlot( QSize *s ); + protected slots: void LegendEntryChecked(QwtPlotItem *plotItem, bool on); diff --git a/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc b/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc index 1b6650613..f676cb4af 100644 --- a/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc +++ b/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc @@ -15,15 +15,21 @@ Waterfall3DColorMap::~Waterfall3DColorMap(){ } -Qwt3D::RGBA Waterfall3DColorMap::operator()(double, double, double z)const{ +Qwt3D::RGBA +Waterfall3DColorMap::operator()(double, double, double z) const +{ return Qwt3D::RGBA(Qwt3D::Qt2GL(color(_interval, z))); } -void Waterfall3DColorMap::SetInterval(const double minValue, const double maxValue){ +void +Waterfall3DColorMap::SetInterval(const double minValue, const double maxValue) +{ _interval.setInterval(minValue, maxValue); } -Qwt3D::ColorVector& Waterfall3DColorMap::createVector(Qwt3D::ColorVector& vec) { +Qwt3D::ColorVector& +Waterfall3DColorMap::createVector(Qwt3D::ColorVector& vec) +{ // Generate 100 interval values and then return those Qwt3D::ColorVector colorVec; for(unsigned int number = 0; number < 100; number++){ @@ -41,7 +47,8 @@ const int Waterfall3DDisplayPlot::INTENSITY_COLOR_MAP_TYPE_BLACK_HOT; const int Waterfall3DDisplayPlot::INTENSITY_COLOR_MAP_TYPE_INCANDESCENT; const int Waterfall3DDisplayPlot::INTENSITY_COLOR_MAP_TYPE_USER_DEFINED; -Waterfall3DDisplayPlot::Waterfall3DDisplayPlot(QWidget* parent):Qwt3D::SurfacePlot(parent){ +Waterfall3DDisplayPlot::Waterfall3DDisplayPlot(QWidget* parent):Qwt3D::SurfacePlot(parent) +{ _startFrequency = 0; _stopFrequency = 4000; @@ -76,11 +83,14 @@ Waterfall3DDisplayPlot::Waterfall3DDisplayPlot(QWidget* parent):Qwt3D::SurfacePl enableMouse(true); } -Waterfall3DDisplayPlot::~Waterfall3DDisplayPlot(){ +Waterfall3DDisplayPlot::~Waterfall3DDisplayPlot() +{ delete _waterfallData; } -void Waterfall3DDisplayPlot::Init(){ +void +Waterfall3DDisplayPlot::Init() +{ if(!_initialized && initializedGL()){ resize(parentWidget()->width(), parentWidget()->height()); @@ -97,7 +107,9 @@ void Waterfall3DDisplayPlot::Init(){ } } -void Waterfall3DDisplayPlot::Reset(){ +void +Waterfall3DDisplayPlot::Reset() +{ _waterfallData->ResizeData(_startFrequency, _stopFrequency, _numPoints); _waterfallData->Reset(); @@ -116,7 +128,8 @@ Waterfall3DDisplayPlot::SetFrequencyRange(const double constStartFreq, const double constStopFreq, const double constCenterFreq, const bool useCenterFrequencyFlag, - const double units, const std::string &strunits) + const double units, + const std::string &strunits) { double startFreq = constStartFreq / units; double stopFreq = constStopFreq / units; @@ -138,8 +151,10 @@ Waterfall3DDisplayPlot::SetFrequencyRange(const double constStartFreq, } } -bool Waterfall3DDisplayPlot::loadFromData(double** data, unsigned int columns, unsigned int rows - ,double minx, double maxx, double miny, double maxy){ +bool +Waterfall3DDisplayPlot::loadFromData(double** data, unsigned int columns, unsigned int rows + ,double minx, double maxx, double miny, double maxy) +{ Qwt3D::GridData* gridPtr = (Qwt3D::GridData*)actualData_p; @@ -196,15 +211,25 @@ bool Waterfall3DDisplayPlot::loadFromData(double** data, unsigned int columns, u return true; } -double Waterfall3DDisplayPlot::GetStartFrequency()const{ +double +Waterfall3DDisplayPlot::GetStartFrequency() const +{ return _startFrequency; } -double Waterfall3DDisplayPlot::GetStopFrequency()const{ +double +Waterfall3DDisplayPlot::GetStopFrequency() const +{ return _stopFrequency; } -void Waterfall3DDisplayPlot::PlotNewData(const double* dataPoints, const int64_t numDataPoints, const double timePerFFT, const timespec timestamp, const int droppedFrames){ +void +Waterfall3DDisplayPlot::PlotNewData(const double* dataPoints, + const int64_t numDataPoints, + const double timePerFFT, + const timespec timestamp, + const int droppedFrames) +{ if(numDataPoints > 0){ if(numDataPoints != _numPoints){ _numPoints = numDataPoints; @@ -238,7 +263,10 @@ void Waterfall3DDisplayPlot::PlotNewData(const double* dataPoints, const int64_t } } -void Waterfall3DDisplayPlot::SetIntensityRange(const double minIntensity, const double maxIntensity){ +void +Waterfall3DDisplayPlot::SetIntensityRange(const double minIntensity, + const double maxIntensity) +{ _waterfallData->SetFloorValue(minIntensity); _waterfallData->setMinZ(0); _waterfallData->setMaxZ(maxIntensity-minIntensity); @@ -248,11 +276,14 @@ void Waterfall3DDisplayPlot::SetIntensityRange(const double minIntensity, const emit UpdatedLowerIntensityLevel(minIntensity); emit UpdatedUpperIntensityLevel(maxIntensity); - SetIntensityColorMapType(_intensityColorMapType, _userDefinedLowIntensityColor, _userDefinedLowIntensityColor, true); + SetIntensityColorMapType(_intensityColorMapType, + _userDefinedLowIntensityColor, + _userDefinedLowIntensityColor, true); } -void Waterfall3DDisplayPlot::replot(){ - +void +Waterfall3DDisplayPlot::replot() +{ if(!_initialized){ Init(); } @@ -283,11 +314,25 @@ void Waterfall3DDisplayPlot::replot(){ } } -int Waterfall3DDisplayPlot::GetIntensityColorMapType()const{ +void +Waterfall3DDisplayPlot::resizeSlot( QSize *s ) +{ + resize(s->width(), s->height()); +} + +int +Waterfall3DDisplayPlot::GetIntensityColorMapType() const +{ return _intensityColorMapType; } -void Waterfall3DDisplayPlot::SetIntensityColorMapType(const int newType, const QColor lowColor, const QColor highColor, const bool forceFlag, const bool noReplotFlag){ +void +Waterfall3DDisplayPlot::SetIntensityColorMapType(const int newType, + const QColor lowColor, + const QColor highColor, + const bool forceFlag, + const bool noReplotFlag) +{ if(((_intensityColorMapType != newType) || forceFlag) || ((newType == INTENSITY_COLOR_MAP_TYPE_USER_DEFINED) && (lowColor.isValid() && highColor.isValid()))){ @@ -350,11 +395,15 @@ void Waterfall3DDisplayPlot::SetIntensityColorMapType(const int newType, const Q } } -const QColor Waterfall3DDisplayPlot::GetUserDefinedLowIntensityColor()const{ +const QColor +Waterfall3DDisplayPlot::GetUserDefinedLowIntensityColor() const +{ return _userDefinedLowIntensityColor; } -const QColor Waterfall3DDisplayPlot::GetUserDefinedHighIntensityColor()const{ +const QColor +Waterfall3DDisplayPlot::GetUserDefinedHighIntensityColor() const +{ return _userDefinedHighIntensityColor; } diff --git a/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h b/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h index f46f260e3..272bdf697 100644 --- a/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h +++ b/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h @@ -10,7 +10,8 @@ #include <qwt3d_color.h> #include <qwt_color_map.h> -class Waterfall3DColorMap:public Qwt3D::Color, public QwtLinearColorMap{ +class Waterfall3DColorMap: public Qwt3D::Color, public QwtLinearColorMap +{ public: Waterfall3DColorMap(); virtual ~Waterfall3DColorMap(); @@ -75,12 +76,14 @@ class Waterfall3DDisplayPlot:public Qwt3D::SurfacePlot{ virtual QString ticLabel(unsigned int idx) const{ if (idx<majors_p.size()) { - const timespec markerTime = timespec_add(_plot->_dataTimestamp, -(_plot->_timePerFFT) * majors_p[idx]); + const timespec markerTime = timespec_add(_plot->_dataTimestamp, + -(_plot->_timePerFFT) * majors_p[idx]); struct tm timeTm; gmtime_r(&markerTime.tv_sec, &timeTm); char* timeBuffer = new char[128]; - snprintf(timeBuffer, 128, "%02d:%02d:%02d.%03ld", timeTm.tm_hour, timeTm.tm_min, timeTm.tm_sec, (markerTime.tv_nsec / 1000000)); + snprintf(timeBuffer, 128, "%02d:%02d:%02d.%03ld", timeTm.tm_hour, + timeTm.tm_min, timeTm.tm_sec, (markerTime.tv_nsec / 1000000)); QString returnBuffer(timeBuffer); delete[] timeBuffer; return returnBuffer; @@ -100,10 +103,14 @@ class Waterfall3DDisplayPlot:public Qwt3D::SurfacePlot{ double _centerFrequency; bool _useCenterFrequencyFlag; public: - FrequencyScale(bool useCenterFrequencyFlag, double centerFrequency):_centerFrequency(centerFrequency),_useCenterFrequencyFlag(useCenterFrequencyFlag){} + FrequencyScale(bool useCenterFrequencyFlag, double centerFrequency) + : _centerFrequency(centerFrequency),_useCenterFrequencyFlag(useCenterFrequencyFlag) + {} + virtual ~FrequencyScale(){} - virtual QString ticLabel(unsigned int idx) const{ + virtual QString ticLabel(unsigned int idx) const + { if (idx<majors_p.size()) { if(!_useCenterFrequencyFlag){ @@ -137,14 +144,18 @@ public: double GetStartFrequency()const; double GetStopFrequency()const; - void PlotNewData(const double* dataPoints, const int64_t numDataPoints, const double timePerFFT, const timespec timestamp, const int droppedFrames); + void PlotNewData(const double* dataPoints, const int64_t numDataPoints, + const double timePerFFT, const timespec timestamp, + const int droppedFrames); void SetIntensityRange(const double minIntensity, const double maxIntensity); virtual void replot(void); int GetIntensityColorMapType()const; - void SetIntensityColorMapType( const int, const QColor, const QColor, const bool forceFlag = false, const bool noReplotFlag = false ); + void SetIntensityColorMapType( const int, const QColor, + const QColor, const bool forceFlag = false, + const bool noReplotFlag = false ); const QColor GetUserDefinedLowIntensityColor()const; const QColor GetUserDefinedHighIntensityColor()const; @@ -154,6 +165,10 @@ public: static const int INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3; static const int INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4; +public slots: + void resizeSlot( QSize *s ); + + signals: void UpdatedLowerIntensityLevel(const double); void UpdatedUpperIntensityLevel(const double); diff --git a/gr-qtgui/src/lib/WaterfallDisplayPlot.cc b/gr-qtgui/src/lib/WaterfallDisplayPlot.cc index ad167f097..f6d0cc0ba 100644 --- a/gr-qtgui/src/lib/WaterfallDisplayPlot.cc +++ b/gr-qtgui/src/lib/WaterfallDisplayPlot.cc @@ -15,28 +15,33 @@ class FreqOffsetAndPrecisionClass { public: - FreqOffsetAndPrecisionClass(const int freqPrecision){ + FreqOffsetAndPrecisionClass(const int freqPrecision) + { _frequencyPrecision = freqPrecision; _centerFrequency = 0; } - virtual ~FreqOffsetAndPrecisionClass(){ - + virtual ~FreqOffsetAndPrecisionClass() + { } - virtual unsigned int GetFrequencyPrecision()const{ + virtual unsigned int GetFrequencyPrecision() const + { return _frequencyPrecision; } - virtual void SetFrequencyPrecision(const unsigned int newPrecision){ + virtual void SetFrequencyPrecision(const unsigned int newPrecision) + { _frequencyPrecision = newPrecision; } - virtual double GetCenterFrequency()const{ + virtual double GetCenterFrequency() const + { return _centerFrequency; } - virtual void SetCenterFrequency(const double newFreq){ + virtual void SetCenterFrequency(const double newFreq) + { _centerFrequency = newFreq; } @@ -50,19 +55,23 @@ private: class WaterfallFreqDisplayScaleDraw: public QwtScaleDraw, public FreqOffsetAndPrecisionClass{ public: - WaterfallFreqDisplayScaleDraw(const unsigned int precision):QwtScaleDraw(), FreqOffsetAndPrecisionClass(precision){ - + WaterfallFreqDisplayScaleDraw(const unsigned int precision) + : QwtScaleDraw(), FreqOffsetAndPrecisionClass(precision) + { } - virtual ~WaterfallFreqDisplayScaleDraw(){ - + virtual ~WaterfallFreqDisplayScaleDraw() + { } - QwtText label(double value)const{ - return QString("%1").arg((value + GetCenterFrequency()) / ((GetFrequencyPrecision() == 0) ? 1.0 : 1000.0), 0, 'f', GetFrequencyPrecision()); + QwtText label(double value) const + { + return QString("%1").arg((value + GetCenterFrequency()) / ((GetFrequencyPrecision() == 0) ? 1.0 : 1000.0), + 0, 'f', GetFrequencyPrecision()); } - virtual void initiateUpdate(){ + virtual void initiateUpdate() + { invalidateCache(); } @@ -75,29 +84,33 @@ private: class TimeScaleData { public: - TimeScaleData(){ + TimeScaleData() + { timespec_reset(&_zeroTime); _secondsPerLine = 1.0; - } - virtual ~TimeScaleData(){ - + virtual ~TimeScaleData() + { } - virtual timespec GetZeroTime()const{ + virtual timespec GetZeroTime() const + { return _zeroTime; } - virtual void SetZeroTime(const timespec newTime){ + virtual void SetZeroTime(const timespec newTime) + { _zeroTime = newTime; } - virtual void SetSecondsPerLine(const double newTime){ + virtual void SetSecondsPerLine(const double newTime) + { _secondsPerLine = newTime; } - virtual double GetSecondsPerLine()const{ + virtual double GetSecondsPerLine() const + { return _secondsPerLine; } @@ -113,27 +126,32 @@ private: class QwtTimeScaleDraw: public QwtScaleDraw, public TimeScaleData { public: - QwtTimeScaleDraw():QwtScaleDraw(),TimeScaleData(){ - + QwtTimeScaleDraw():QwtScaleDraw(),TimeScaleData() + { } - virtual ~QwtTimeScaleDraw(){ - + virtual ~QwtTimeScaleDraw() + { } - virtual QwtText label(double value)const{ + virtual QwtText label(double value) const + { QwtText returnLabel(""); timespec lineTime = timespec_add(GetZeroTime(), (-value) * GetSecondsPerLine()); struct tm timeTm; gmtime_r(&lineTime.tv_sec, &timeTm); - returnLabel = (QString("").sprintf("%04d/%02d/%02d\n%02d:%02d:%02d.%03ld", timeTm.tm_year+1900, timeTm.tm_mon+1, timeTm.tm_mday, timeTm.tm_hour, timeTm.tm_min, timeTm.tm_sec, lineTime.tv_nsec/1000000)); - + returnLabel = (QString("").sprintf("%04d/%02d/%02d\n%02d:%02d:%02d.%03ld", + timeTm.tm_year+1900, timeTm.tm_mon+1, + timeTm.tm_mday, timeTm.tm_hour, timeTm.tm_min, + timeTm.tm_sec, lineTime.tv_nsec/1000000)); return returnLabel; } - virtual void initiateUpdate(){ - // Do this in one call rather than when zeroTime and secondsPerLine updates is to prevent the display from being updated too often... + virtual void initiateUpdate() + { + // Do this in one call rather than when zeroTime and secondsPerLine + // updates is to prevent the display from being updated too often... invalidateCache(); } @@ -146,16 +164,19 @@ private: class WaterfallZoomer: public QwtPlotZoomer, public TimeScaleData, public FreqOffsetAndPrecisionClass { public: - WaterfallZoomer(QwtPlotCanvas* canvas, const unsigned int freqPrecision):QwtPlotZoomer(canvas), TimeScaleData(), FreqOffsetAndPrecisionClass(freqPrecision) + WaterfallZoomer(QwtPlotCanvas* canvas, const unsigned int freqPrecision) + : QwtPlotZoomer(canvas), TimeScaleData(), + FreqOffsetAndPrecisionClass(freqPrecision) { setTrackerMode(QwtPicker::AlwaysOn); } - virtual ~WaterfallZoomer(){ - + virtual ~WaterfallZoomer() + { } - virtual void updateTrackerText(){ + virtual void updateTrackerText() + { updateDisplay(); } @@ -167,7 +188,10 @@ protected: timespec lineTime = timespec_add(GetZeroTime(), (-p.y()) * GetSecondsPerLine()); struct tm timeTm; gmtime_r(&lineTime.tv_sec, &timeTm); - yLabel = (QString("").sprintf("%04d/%02d/%02d %02d:%02d:%02d.%03ld", timeTm.tm_year+1900, timeTm.tm_mon+1, timeTm.tm_mday, timeTm.tm_hour, timeTm.tm_min, timeTm.tm_sec, lineTime.tv_nsec/1000000)); + yLabel = (QString("").sprintf("%04d/%02d/%02d %02d:%02d:%02d.%03ld", + timeTm.tm_year+1900, timeTm.tm_mon+1, + timeTm.tm_mday, timeTm.tm_hour, timeTm.tm_min, + timeTm.tm_sec, lineTime.tv_nsec/1000000)); QwtText t(QString("%1 %2, %3").arg((p.x() + GetCenterFrequency()) / ((GetFrequencyPrecision() == 0) ? 1.0 : 1000.0), 0, 'f', GetFrequencyPrecision()).arg( (GetFrequencyPrecision() == 0) ? "Hz" : "kHz").arg(yLabel)); @@ -312,15 +336,25 @@ WaterfallDisplayPlot::SetFrequencyRange(const double constStartFreq, } -double WaterfallDisplayPlot::GetStartFrequency()const{ +double +WaterfallDisplayPlot::GetStartFrequency() const +{ return _startFrequency; } -double WaterfallDisplayPlot::GetStopFrequency()const{ +double +WaterfallDisplayPlot::GetStopFrequency() const +{ return _stopFrequency; } -void WaterfallDisplayPlot::PlotNewData(const double* dataPoints, const int64_t numDataPoints, const double timePerFFT, const timespec timestamp, const int droppedFrames){ +void +WaterfallDisplayPlot::PlotNewData(const double* dataPoints, + const int64_t numDataPoints, + const double timePerFFT, + const timespec timestamp, + const int droppedFrames) +{ if(numDataPoints > 0){ if(numDataPoints != _numPoints){ _numPoints = numDataPoints; @@ -363,7 +397,10 @@ void WaterfallDisplayPlot::PlotNewData(const double* dataPoints, const int64_t n } } -void WaterfallDisplayPlot::SetIntensityRange(const double minIntensity, const double maxIntensity){ +void +WaterfallDisplayPlot::SetIntensityRange(const double minIntensity, + const double maxIntensity) +{ _waterfallData->setRange(QwtDoubleInterval(minIntensity, maxIntensity)); emit UpdatedLowerIntensityLevel(minIntensity); @@ -372,7 +409,9 @@ void WaterfallDisplayPlot::SetIntensityRange(const double minIntensity, const do _UpdateIntensityRangeDisplay(); } -void WaterfallDisplayPlot::replot(){ +void +WaterfallDisplayPlot::replot() +{ const timespec startTime = get_highres_clock(); QwtTimeScaleDraw* timeScale = (QwtTimeScaleDraw*)axisScaleDraw(QwtPlot::yLeft); @@ -406,11 +445,23 @@ void WaterfallDisplayPlot::replot(){ } } -int WaterfallDisplayPlot::GetIntensityColorMapType()const{ +void +WaterfallDisplayPlot::resizeSlot( QSize *s ) +{ + resize(s->width(), s->height()); +} + +int +WaterfallDisplayPlot::GetIntensityColorMapType() const +{ return _intensityColorMapType; } -void WaterfallDisplayPlot::SetIntensityColorMapType(const int newType, const QColor lowColor, const QColor highColor){ +void +WaterfallDisplayPlot::SetIntensityColorMapType(const int newType, + const QColor lowColor, + const QColor highColor) +{ if((_intensityColorMapType != newType) || ((newType == INTENSITY_COLOR_MAP_TYPE_USER_DEFINED) && (lowColor.isValid() && highColor.isValid()))){ @@ -458,15 +509,21 @@ void WaterfallDisplayPlot::SetIntensityColorMapType(const int newType, const QCo } } -const QColor WaterfallDisplayPlot::GetUserDefinedLowIntensityColor()const{ +const QColor +WaterfallDisplayPlot::GetUserDefinedLowIntensityColor() const +{ return _userDefinedLowIntensityColor; } -const QColor WaterfallDisplayPlot::GetUserDefinedHighIntensityColor()const{ +const QColor +WaterfallDisplayPlot::GetUserDefinedHighIntensityColor() const +{ return _userDefinedHighIntensityColor; } -void WaterfallDisplayPlot::_UpdateIntensityRangeDisplay(){ +void +WaterfallDisplayPlot::_UpdateIntensityRangeDisplay() +{ QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); rightAxis->setTitle("Intensity (dB)"); rightAxis->setColorBarEnabled(true); diff --git a/gr-qtgui/src/lib/WaterfallDisplayPlot.h b/gr-qtgui/src/lib/WaterfallDisplayPlot.h index fbbb69a5b..bb87fb09f 100644 --- a/gr-qtgui/src/lib/WaterfallDisplayPlot.h +++ b/gr-qtgui/src/lib/WaterfallDisplayPlot.h @@ -45,6 +45,9 @@ public: static const int INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3; static const int INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4; +public slots: + void resizeSlot( QSize *s ); + signals: void UpdatedLowerIntensityLevel(const double); void UpdatedUpperIntensityLevel(const double); diff --git a/gr-qtgui/src/lib/qtgui.i b/gr-qtgui/src/lib/qtgui.i index d2f734fdf..1f50bf43c 100644 --- a/gr-qtgui/src/lib/qtgui.i +++ b/gr-qtgui/src/lib/qtgui.i @@ -68,6 +68,7 @@ public: void set_constellation_axis(double xmin, double xmax, double ymin, double ymax); void set_frequency_axis(double min, double max); + void set_constellation_pen_size(int size); }; @@ -116,5 +117,6 @@ public: void set_constellation_axis(double xmin, double xmax, double ymin, double ymax); void set_frequency_axis(double min, double max); + void set_constellation_pen_size(int size); }; diff --git a/gr-qtgui/src/lib/qtgui_sink_c.cc b/gr-qtgui/src/lib/qtgui_sink_c.cc index bfb464119..7340141a6 100644 --- a/gr-qtgui/src/lib/qtgui_sink_c.cc +++ b/gr-qtgui/src/lib/qtgui_sink_c.cc @@ -194,6 +194,13 @@ qtgui_sink_c::set_constellation_axis(double xmin, double xmax, d_main_gui->SetConstellationAxis(xmin, xmax, ymin, ymax); } +void +qtgui_sink_c::set_constellation_pen_size(int size) +{ + d_main_gui->SetConstellationPenSize(size); +} + + void qtgui_sink_c::set_frequency_axis(double min, double max) { diff --git a/gr-qtgui/src/lib/qtgui_sink_c.h b/gr-qtgui/src/lib/qtgui_sink_c.h index e36c8c9b0..91c6b03e6 100644 --- a/gr-qtgui/src/lib/qtgui_sink_c.h +++ b/gr-qtgui/src/lib/qtgui_sink_c.h @@ -108,6 +108,7 @@ public: void set_time_domain_axis(double min, double max); void set_constellation_axis(double xmin, double xmax, double ymin, double ymax); + void set_constellation_pen_size(int size); void set_frequency_axis(double min, double max); QApplication *d_qApplication; diff --git a/gr-qtgui/src/lib/qtgui_sink_f.cc b/gr-qtgui/src/lib/qtgui_sink_f.cc index d0ce24274..6fbb2f381 100644 --- a/gr-qtgui/src/lib/qtgui_sink_f.cc +++ b/gr-qtgui/src/lib/qtgui_sink_f.cc @@ -188,6 +188,13 @@ qtgui_sink_f::set_constellation_axis(double xmin, double xmax, d_main_gui->SetConstellationAxis(xmin, xmax, ymin, ymax); } +void +qtgui_sink_f::set_constellation_pen_size(int size) +{ + d_main_gui->SetConstellationPenSize(size); +} + + void qtgui_sink_f::set_frequency_axis(double min, double max) { diff --git a/gr-qtgui/src/lib/qtgui_sink_f.h b/gr-qtgui/src/lib/qtgui_sink_f.h index 027b89bea..47c928d17 100644 --- a/gr-qtgui/src/lib/qtgui_sink_f.h +++ b/gr-qtgui/src/lib/qtgui_sink_f.h @@ -106,6 +106,7 @@ public: void set_time_domain_axis(double min, double max); void set_constellation_axis(double xmin, double xmax, double ymin, double ymax); + void set_constellation_pen_size(int size); void set_frequency_axis(double min, double max); QApplication *d_qApplication; diff --git a/gr-qtgui/src/lib/spectrumdisplayform.cc b/gr-qtgui/src/lib/spectrumdisplayform.cc Binary files differindex 36097d975..b27292193 100644 --- a/gr-qtgui/src/lib/spectrumdisplayform.cc +++ b/gr-qtgui/src/lib/spectrumdisplayform.cc diff --git a/gr-qtgui/src/lib/spectrumdisplayform.h b/gr-qtgui/src/lib/spectrumdisplayform.h index dbbf2567e..d89141f1e 100644 --- a/gr-qtgui/src/lib/spectrumdisplayform.h +++ b/gr-qtgui/src/lib/spectrumdisplayform.h @@ -36,7 +36,7 @@ class SpectrumDisplayForm : public QWidget, public Ui::SpectrumDisplayForm public slots: void resizeEvent( QResizeEvent * e ); void customEvent( QEvent * e ); - void AvgLineEdit_textChanged( const QString & valueString ); + void AvgLineEdit_valueChanged( int valueString ); void MaxHoldCheckBox_toggled( bool newState ); void MinHoldCheckBox_toggled( bool newState ); void MinHoldResetBtn_clicked(); @@ -69,6 +69,7 @@ public slots: void SetTimeDomainAxis(double min, double max); void SetConstellationAxis(double xmin, double xmax, double ymin, double ymax); + void SetConstellationPenSize(int size); void SetFrequencyAxis(double min, double max); private slots: diff --git a/gr-qtgui/src/lib/spectrumdisplayform.ui b/gr-qtgui/src/lib/spectrumdisplayform.ui index 9324f150b..1458488a0 100644 --- a/gr-qtgui/src/lib/spectrumdisplayform.ui +++ b/gr-qtgui/src/lib/spectrumdisplayform.ui @@ -5,687 +5,758 @@ <rect> <x>0</x> <y>0</y> - <width>633</width> - <height>436</height> + <width>657</width> + <height>536</height> </rect> </property> <property name="windowTitle" > <string>Spectrum Display</string> </property> - <widget class="QCheckBox" name="UseRFFrequenciesCheckBox" > - <property name="geometry" > - <rect> - <x>10</x> - <y>385</y> - <width>180</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Display RF Frequencies</string> - </property> - </widget> - <widget class="QComboBox" name="WindowComboBox" > - <property name="geometry" > - <rect> - <x>105</x> - <y>410</y> - <width>170</width> - <height>20</height> - </rect> - </property> - <property name="font" > - <font> - <pointsize>9</pointsize> - </font> - </property> - <item> - <property name="text" > - <string>Hamming</string> - </property> - </item> - <item> - <property name="text" > - <string>Hann</string> - </property> - </item> - <item> - <property name="text" > - <string>Blackman</string> - </property> - </item> - <item> - <property name="text" > - <string>Rectangular</string> - </property> - </item> - <item> - <property name="text" > - <string>Kaiser</string> - </property> - </item> - <item> - <property name="text" > - <string>Blackman-harris</string> - </property> - </item> - </widget> - <widget class="QLabel" name="WindowLbl" > - <property name="geometry" > - <rect> - <x>10</x> - <y>410</y> - <width>90</width> - <height>17</height> - </rect> - </property> - <property name="text" > - <string>Window:</string> - </property> - <property name="alignment" > - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QLabel" name="FFTSizeLabel" > - <property name="geometry" > - <rect> - <x>405</x> - <y>385</y> - <width>116</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>FFT Size:</string> - </property> - <property name="alignment" > - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QComboBox" name="FFTSizeComboBox" > - <property name="geometry" > - <rect> - <x>525</x> - <y>385</y> - <width>100</width> - <height>20</height> - </rect> - </property> - <item> - <property name="text" > - <string>1024</string> - </property> - </item> - <item> - <property name="text" > - <string>2048</string> - </property> - </item> - <item> - <property name="text" > - <string>4096</string> - </property> - </item> - <item> - <property name="text" > - <string>8192</string> - </property> - </item> - <item> - <property name="text" > - <string>16384</string> - </property> - </item> - <item> - <property name="text" > - <string>32768</string> - </property> - </item> - </widget> - <widget class="QTabWidget" name="SpectrumTypeTab" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>630</width> - <height>380</height> - </rect> - </property> - <property name="currentIndex" > - <number>0</number> - </property> - <widget class="QWidget" name="FrequencyPage" > - <attribute name="title" > - <string>Frequency Display</string> - </attribute> - <widget class="QLineEdit" name="PowerLineEdit" > - <property name="geometry" > - <rect> - <x>480</x> - <y>320</y> - <width>60</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>1</string> - </property> - </widget> - <widget class="QCheckBox" name="MinHoldCheckBox" > - <property name="geometry" > - <rect> - <x>10</x> - <y>325</y> - <width>95</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Min Hold</string> - </property> - <property name="checked" > - <bool>false</bool> - </property> - </widget> - <widget class="QLabel" name="AvgLabel" > - <property name="geometry" > - <rect> - <x>545</x> - <y>300</y> - <width>72</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Average</string> - </property> - <property name="alignment" > - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QPushButton" name="MinHoldResetBtn" > - <property name="geometry" > - <rect> - <x>105</x> - <y>325</y> - <width>61</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Reset</string> - </property> - </widget> - <widget class="QLineEdit" name="AvgLineEdit" > - <property name="geometry" > - <rect> - <x>550</x> - <y>320</y> - <width>60</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>0</string> - </property> - </widget> - <widget class="QLabel" name="PowerLabel" > - <property name="geometry" > - <rect> - <x>475</x> - <y>300</y> - <width>72</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Power</string> - </property> - <property name="alignment" > - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QPushButton" name="MaxHoldResetBtn" > - <property name="geometry" > - <rect> - <x>105</x> - <y>300</y> - <width>61</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Reset</string> - </property> - </widget> - <widget class="QCheckBox" name="MaxHoldCheckBox" > - <property name="geometry" > - <rect> - <x>10</x> - <y>300</y> - <width>95</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>Max Hold</string> - </property> - <property name="checked" > - <bool>false</bool> - </property> - </widget> - <widget class="QFrame" name="FrequencyPlotDisplayFrame" > - <property name="geometry" > - <rect> - <x>5</x> - <y>5</y> - <width>620</width> - <height>290</height> - </rect> - </property> - <property name="frameShape" > - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Plain</enum> - </property> - </widget> - </widget> - <widget class="QWidget" name="WaterfallPage" > - <attribute name="title" > - <string>Waterfall Display</string> - </attribute> - <widget class="QLabel" name="textLabel1" > - <property name="geometry" > - <rect> - <x>5</x> - <y>0</y> - <width>85</width> - <height>21</height> - </rect> - </property> - <property name="text" > - <string><font size="-2">Intensity Display:</font></string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QComboBox" name="WaterfallIntensityComboBox" > - <property name="geometry" > - <rect> - <x>90</x> - <y>0</y> - <width>121</width> - <height>25</height> - </rect> + <layout class="QGridLayout" name="gridLayout" > + <item row="1" column="3" > + <widget class="QComboBox" name="FFTSizeComboBox" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize" > + <size> + <width>120</width> + <height>16777215</height> + </size> </property> <item> <property name="text" > - <string>Color</string> + <string>1024</string> </property> </item> <item> <property name="text" > - <string>White Hot</string> + <string>2048</string> </property> </item> <item> <property name="text" > - <string>Black Hot</string> + <string>4096</string> </property> </item> <item> <property name="text" > - <string>Incandescent</string> + <string>8192</string> </property> </item> <item> <property name="text" > - <string>User Defined</string> + <string>16384</string> + </property> + </item> + <item> + <property name="text" > + <string>32768</string> </property> </item> </widget> - <widget class="QwtWheel" name="WaterfallMaximumIntensityWheel" > - <property name="geometry" > - <rect> - <x>215</x> - <y>0</y> - <width>335</width> - <height>24</height> - </rect> - </property> - <property name="mouseTracking" > - <bool>true</bool> - </property> - <property name="focusPolicy" > - <enum>Qt::WheelFocus</enum> - </property> - <property name="valid" > - <bool>true</bool> - </property> - <property name="totalAngle" > - <double>200.000000000000000</double> - </property> - <property name="viewAngle" > - <double>20.000000000000000</double> - </property> - <property name="mass" > - <double>0.000000000000000</double> - </property> - </widget> - <widget class="QLabel" name="WaterfallMaximumIntensityLabel" > - <property name="geometry" > - <rect> - <x>563</x> - <y>3</y> - <width>55</width> - <height>21</height> - </rect> - </property> - <property name="text" > - <string>100 dB</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QFrame" name="WaterfallPlotDisplayFrame" > - <property name="geometry" > - <rect> - <x>5</x> - <y>30</y> - <width>615</width> - <height>295</height> - </rect> - </property> - <property name="frameShape" > - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Plain</enum> - </property> - </widget> - <widget class="QwtWheel" name="WaterfallMinimumIntensityWheel" > - <property name="geometry" > - <rect> - <x>215</x> - <y>325</y> - <width>335</width> - <height>24</height> - </rect> - </property> - <property name="valid" > - <bool>true</bool> - </property> - <property name="totalAngle" > - <double>200.000000000000000</double> - </property> - <property name="viewAngle" > - <double>20.000000000000000</double> - </property> - <property name="mass" > - <double>0.000000000000000</double> - </property> - </widget> - <widget class="QLabel" name="WaterfallMinimumIntensityLabel" > - <property name="geometry" > - <rect> - <x>565</x> - <y>325</y> - <width>55</width> - <height>20</height> - </rect> - </property> - <property name="text" > - <string>-100 dB</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QPushButton" name="WaterfallAutoScaleBtn" > - <property name="geometry" > - <rect> - <x>0</x> - <y>325</y> - <width>135</width> - <height>21</height> - </rect> - </property> - <property name="toolTip" > - <string>Scales the Intensity to the current data extremes.</string> - </property> - <property name="text" > - <string>Auto Scale</string> - </property> - </widget> - </widget> - <widget class="QWidget" name="Waterfall3DPage" > - <attribute name="title" > - <string>3D Waterfall Display</string> - </attribute> - <widget class="QLabel" name="textLabel1_2" > - <property name="geometry" > - <rect> - <x>5</x> - <y>0</y> - <width>85</width> - <height>21</height> - </rect> - </property> + </item> + <item row="1" column="2" > + <widget class="QLabel" name="FFTSizeLabel" > <property name="text" > - <string><font size="-2">Intensity Display:</font></string> + <string>FFT Size:</string> </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - </widget> - <widget class="QLabel" name="Waterfall3DMaximumIntensityLabel" > - <property name="geometry" > - <rect> - <x>563</x> - <y>3</y> - <width>55</width> - <height>21</height> - </rect> - </property> - <property name="text" > - <string>100 dB</string> + <property name="alignment" > + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> <property name="wordWrap" > <bool>false</bool> </property> </widget> - <widget class="QPushButton" name="Waterfall3DAutoScaleBtn" > - <property name="geometry" > - <rect> - <x>0</x> - <y>325</y> - <width>135</width> - <height>21</height> - </rect> - </property> - <property name="toolTip" > - <string>Scales the Intensity to the current data extremes.</string> - </property> - <property name="text" > - <string>Auto Scale</string> - </property> - </widget> - <widget class="QwtWheel" name="Waterfall3DMinimumIntensityWheel" > - <property name="geometry" > - <rect> - <x>215</x> - <y>325</y> - <width>335</width> - <height>24</height> - </rect> - </property> - <property name="valid" > - <bool>true</bool> - </property> - <property name="totalAngle" > - <double>200.000000000000000</double> - </property> - <property name="viewAngle" > - <double>20.000000000000000</double> - </property> - <property name="mass" > - <double>0.000000000000000</double> - </property> - </widget> - <widget class="QLabel" name="Waterfall3DMinimumIntensityLabel" > - <property name="geometry" > - <rect> - <x>565</x> - <y>325</y> - <width>55</width> - <height>20</height> - </rect> - </property> + </item> + <item row="1" column="0" > + <widget class="QCheckBox" name="UseRFFrequenciesCheckBox" > <property name="text" > - <string>-100 dB</string> - </property> - <property name="wordWrap" > - <bool>false</bool> + <string>Display RF Frequencies</string> </property> </widget> - <widget class="QFrame" name="Waterfall3DPlotDisplayFrame" > - <property name="geometry" > - <rect> - <x>5</x> - <y>30</y> - <width>615</width> - <height>295</height> - </rect> - </property> - <property name="frameShape" > - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Plain</enum> - </property> - </widget> - <widget class="QComboBox" name="Waterfall3DIntensityComboBox" > - <property name="geometry" > - <rect> - <x>90</x> - <y>0</y> - <width>121</width> - <height>25</height> - </rect> - </property> - <item> - <property name="text" > - <string>Color</string> - </property> - </item> - <item> - <property name="text" > - <string>White Hot</string> - </property> - </item> - <item> - <property name="text" > - <string>Black Hot</string> - </property> - </item> + </item> + <item row="3" column="0" > + <layout class="QHBoxLayout" name="horizontalLayout" > <item> - <property name="text" > - <string>Incandescent</string> - </property> + <widget class="QLabel" name="WindowLbl" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text" > + <string>Window:</string> + </property> + <property name="alignment" > + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> </item> <item> - <property name="text" > - <string>User Defined</string> - </property> + <widget class="QComboBox" name="WindowComboBox" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>120</width> + <height>0</height> + </size> + </property> + <property name="maximumSize" > + <size> + <width>120</width> + <height>16777215</height> + </size> + </property> + <property name="font" > + <font> + <pointsize>9</pointsize> + </font> + </property> + <item> + <property name="text" > + <string>Hamming</string> + </property> + </item> + <item> + <property name="text" > + <string>Hann</string> + </property> + </item> + <item> + <property name="text" > + <string>Blackman</string> + </property> + </item> + <item> + <property name="text" > + <string>Rectangular</string> + </property> + </item> + <item> + <property name="text" > + <string>Kaiser</string> + </property> + </item> + <item> + <property name="text" > + <string>Blackman-harris</string> + </property> + </item> + </widget> </item> + </layout> + </item> + <item row="0" column="0" colspan="4" > + <widget class="QTabWidget" name="SpectrumTypeTab" > + <property name="currentIndex" > + <number>0</number> + </property> + <widget class="QWidget" name="FrequencyPage" > + <attribute name="title" > + <string>Frequency Display</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout" > + <item> + <layout class="QVBoxLayout" name="verticalLayout_2" > + <item> + <widget class="QFrame" name="FrequencyPlotDisplayFrame" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Preferred" hsizetype="Preferred" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>615</width> + <height>332</height> + </size> + </property> + <property name="sizeIncrement" > + <size> + <width>1</width> + <height>1</height> + </size> + </property> + <property name="frameShape" > + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow" > + <enum>QFrame::Plain</enum> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayout_2" > + <item row="1" column="0" > + <widget class="QCheckBox" name="MaxHoldCheckBox" > + <property name="text" > + <string>Max Hold</string> + </property> + <property name="checked" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="0" > + <widget class="QCheckBox" name="MinHoldCheckBox" > + <property name="text" > + <string>Min Hold</string> + </property> + <property name="checked" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="3" > + <widget class="QLabel" name="PowerLabel" > + <property name="minimumSize" > + <size> + <width>50</width> + <height>0</height> + </size> + </property> + <property name="maximumSize" > + <size> + <width>50</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>Power</string> + </property> + <property name="alignment" > + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="1" > + <widget class="QPushButton" name="MaxHoldResetBtn" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>25</width> + <height>0</height> + </size> + </property> + <property name="text" > + <string>Reset</string> + </property> + </widget> + </item> + <item row="1" column="4" > + <widget class="QLabel" name="AvgLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>62</width> + <height>0</height> + </size> + </property> + <property name="text" > + <string>Average</string> + </property> + <property name="alignment" > + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="1" > + <widget class="QPushButton" name="MinHoldResetBtn" > + <property name="text" > + <string>Reset</string> + </property> + </widget> + </item> + <item row="2" column="4" > + <widget class="QSpinBox" name="AvgLineEdit" /> + </item> + <item row="2" column="3" > + <widget class="QLineEdit" name="PowerLineEdit" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>50</width> + <height>0</height> + </size> + </property> + <property name="maximumSize" > + <size> + <width>50</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>1</string> + </property> + </widget> + </item> + <item row="1" column="2" > + <spacer name="horizontalSpacer_2" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>325</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="WaterfallPage" > + <attribute name="title" > + <string>Waterfall Display</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_3" > + <item row="0" column="0" > + <widget class="QLabel" name="textLabel1" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>Intensity Display:</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="0" column="2" > + <widget class="QwtWheel" name="WaterfallMaximumIntensityWheel" > + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="mouseTracking" > + <bool>true</bool> + </property> + <property name="focusPolicy" > + <enum>Qt::WheelFocus</enum> + </property> + <property name="valid" > + <bool>true</bool> + </property> + <property name="totalAngle" > + <double>200.000000000000000</double> + </property> + <property name="viewAngle" > + <double>20.000000000000000</double> + </property> + <property name="mass" > + <double>0.000000000000000</double> + </property> + </widget> + </item> + <item row="0" column="3" > + <widget class="QLabel" name="WaterfallMaximumIntensityLabel" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>100 dB</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="0" colspan="4" > + <widget class="QFrame" name="WaterfallPlotDisplayFrame" > + <property name="minimumSize" > + <size> + <width>617</width> + <height>338</height> + </size> + </property> + <property name="frameShape" > + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow" > + <enum>QFrame::Plain</enum> + </property> + </widget> + </item> + <item row="2" column="2" > + <widget class="QwtWheel" name="WaterfallMinimumIntensityWheel" > + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="valid" > + <bool>true</bool> + </property> + <property name="totalAngle" > + <double>200.000000000000000</double> + </property> + <property name="viewAngle" > + <double>20.000000000000000</double> + </property> + <property name="mass" > + <double>0.000000000000000</double> + </property> + </widget> + </item> + <item row="2" column="3" > + <widget class="QLabel" name="WaterfallMinimumIntensityLabel" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>-100 dB</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2" > + <widget class="QPushButton" name="WaterfallAutoScaleBtn" > + <property name="maximumSize" > + <size> + <width>80</width> + <height>16777215</height> + </size> + </property> + <property name="toolTip" > + <string>Scales the Intensity to the current data extremes.</string> + </property> + <property name="text" > + <string>Auto Scale</string> + </property> + </widget> + </item> + <item row="0" column="1" > + <widget class="QComboBox" name="WaterfallIntensityComboBox" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <item> + <property name="text" > + <string>Color</string> + </property> + </item> + <item> + <property name="text" > + <string>White Hot</string> + </property> + </item> + <item> + <property name="text" > + <string>Black Hot</string> + </property> + </item> + <item> + <property name="text" > + <string>Incandescent</string> + </property> + </item> + <item> + <property name="text" > + <string>User Defined</string> + </property> + </item> + </widget> + </item> + </layout> + <zorder>textLabel1</zorder> + <zorder>WaterfallMaximumIntensityWheel</zorder> + <zorder>WaterfallMaximumIntensityLabel</zorder> + <zorder>WaterfallPlotDisplayFrame</zorder> + <zorder>WaterfallMinimumIntensityWheel</zorder> + <zorder>WaterfallMinimumIntensityLabel</zorder> + <zorder>WaterfallAutoScaleBtn</zorder> + <zorder>WaterfallIntensityComboBox</zorder> + </widget> + <widget class="QWidget" name="Waterfall3DPage" > + <attribute name="title" > + <string>3D Waterfall Display</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_6" > + <item row="0" column="0" > + <widget class="QLabel" name="textLabel1_2" > + <property name="minimumSize" > + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>Intensity Display:</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="0" column="1" > + <widget class="QComboBox" name="Waterfall3DIntensityComboBox" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <item> + <property name="text" > + <string>Color</string> + </property> + </item> + <item> + <property name="text" > + <string>White Hot</string> + </property> + </item> + <item> + <property name="text" > + <string>Black Hot</string> + </property> + </item> + <item> + <property name="text" > + <string>Incandescent</string> + </property> + </item> + <item> + <property name="text" > + <string>User Defined</string> + </property> + </item> + </widget> + </item> + <item row="0" column="2" > + <widget class="QwtWheel" name="Waterfall3DMaximumIntensityWheel" > + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="mouseTracking" > + <bool>true</bool> + </property> + <property name="focusPolicy" > + <enum>Qt::WheelFocus</enum> + </property> + <property name="valid" > + <bool>true</bool> + </property> + <property name="totalAngle" > + <double>200.000000000000000</double> + </property> + <property name="viewAngle" > + <double>20.000000000000000</double> + </property> + <property name="mass" > + <double>0.000000000000000</double> + </property> + </widget> + </item> + <item row="0" column="3" > + <widget class="QLabel" name="Waterfall3DMaximumIntensityLabel" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>100 dB</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="0" colspan="4" > + <widget class="QFrame" name="Waterfall3DPlotDisplayFrame" > + <property name="frameShape" > + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow" > + <enum>QFrame::Plain</enum> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2" > + <widget class="QPushButton" name="Waterfall3DAutoScaleBtn" > + <property name="minimumSize" > + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="maximumSize" > + <size> + <width>80</width> + <height>16777215</height> + </size> + </property> + <property name="sizeIncrement" > + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="toolTip" > + <string>Scales the Intensity to the current data extremes.</string> + </property> + <property name="text" > + <string>Auto Scale</string> + </property> + </widget> + </item> + <item row="2" column="2" > + <widget class="QwtWheel" name="Waterfall3DMinimumIntensityWheel" > + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="valid" > + <bool>true</bool> + </property> + <property name="totalAngle" > + <double>200.000000000000000</double> + </property> + <property name="viewAngle" > + <double>20.000000000000000</double> + </property> + <property name="mass" > + <double>0.000000000000000</double> + </property> + </widget> + </item> + <item row="2" column="3" > + <widget class="QLabel" name="Waterfall3DMinimumIntensityLabel" > + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text" > + <string>-100 dB</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="TimeDomainPage" > + <attribute name="title" > + <string>Time Domain Display</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_4" > + <item row="0" column="0" > + <widget class="QFrame" name="TimeDomainDisplayFrame" > + <property name="minimumSize" > + <size> + <width>617</width> + <height>404</height> + </size> + </property> + <property name="frameShape" > + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow" > + <enum>QFrame::Plain</enum> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="ConstellationPage" > + <attribute name="title" > + <string>Constellation Display</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_5" > + <item row="0" column="0" > + <widget class="QFrame" name="ConstellationDisplayFrame" > + <property name="minimumSize" > + <size> + <width>617</width> + <height>406</height> + </size> + </property> + <property name="frameShape" > + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow" > + <enum>QFrame::Raised</enum> + </property> + </widget> + </item> + </layout> + </widget> </widget> - <widget class="QwtWheel" name="Waterfall3DMaximumIntensityWheel" > - <property name="geometry" > - <rect> - <x>215</x> - <y>0</y> - <width>335</width> - <height>24</height> - </rect> - </property> - <property name="mouseTracking" > - <bool>true</bool> - </property> - <property name="focusPolicy" > - <enum>Qt::WheelFocus</enum> - </property> - <property name="valid" > - <bool>true</bool> - </property> - <property name="totalAngle" > - <double>200.000000000000000</double> - </property> - <property name="viewAngle" > - <double>20.000000000000000</double> - </property> - <property name="mass" > - <double>0.000000000000000</double> - </property> - </widget> - </widget> - <widget class="QWidget" name="TimeDomainPage" > - <attribute name="title" > - <string>Time Domain Display</string> - </attribute> - <widget class="QFrame" name="TimeDomainDisplayFrame" > - <property name="geometry" > - <rect> - <x>5</x> - <y>5</y> - <width>620</width> - <height>340</height> - </rect> - </property> - <property name="frameShape" > - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Plain</enum> - </property> - </widget> - </widget> - <widget class="QWidget" name="ConstellationPage" > - <attribute name="title" > - <string>Constellation Display</string> - </attribute> - <widget class="QFrame" name="ConstellationDisplayFrame" > - <property name="geometry" > - <rect> - <x>5</x> - <y>5</y> - <width>620</width> - <height>340</height> - </rect> - </property> - <property name="frameShape" > - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Raised</enum> - </property> - </widget> - </widget> - </widget> + </item> + </layout> </widget> <layoutdefault spacing="6" margin="11" /> <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> @@ -698,14 +769,7 @@ </customwidgets> <tabstops> <tabstop>SpectrumTypeTab</tabstop> - <tabstop>MaxHoldCheckBox</tabstop> - <tabstop>MaxHoldResetBtn</tabstop> - <tabstop>MinHoldCheckBox</tabstop> - <tabstop>MinHoldResetBtn</tabstop> - <tabstop>PowerLineEdit</tabstop> - <tabstop>AvgLineEdit</tabstop> <tabstop>UseRFFrequenciesCheckBox</tabstop> - <tabstop>WindowComboBox</tabstop> <tabstop>FFTSizeComboBox</tabstop> <tabstop>WaterfallMaximumIntensityWheel</tabstop> <tabstop>WaterfallMinimumIntensityWheel</tabstop> @@ -787,22 +851,6 @@ </hints> </connection> <connection> - <sender>AvgLineEdit</sender> - <signal>textChanged(QString)</signal> - <receiver>SpectrumDisplayForm</receiver> - <slot>AvgLineEdit_textChanged(QString)</slot> - <hints> - <hint type="sourcelabel" > - <x>552</x> - <y>344</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - <connection> <sender>PowerLineEdit</sender> <signal>textChanged(QString)</signal> <receiver>SpectrumDisplayForm</receiver> @@ -1010,5 +1058,21 @@ </hint> </hints> </connection> + <connection> + <sender>AvgLineEdit</sender> + <signal>valueChanged(int)</signal> + <receiver>SpectrumDisplayForm</receiver> + <slot>AvgLineEdit_valueChanged(int)</slot> + <hints> + <hint type="sourcelabel" > + <x>604</x> + <y>421</y> + </hint> + <hint type="destinationlabel" > + <x>328</x> + <y>260</y> + </hint> + </hints> + </connection> </connections> </ui> diff --git a/gr-qtgui/src/python/.gitignore b/gr-qtgui/src/python/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-qtgui/src/python/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/.gitignore b/gr-radar-mono/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/doc/.gitignore b/gr-radar-mono/doc/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/doc/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/.gitignore b/gr-radar-mono/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/fpga/.gitignore b/gr-radar-mono/src/fpga/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/src/fpga/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/fpga/lib/.gitignore b/gr-radar-mono/src/fpga/lib/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/src/fpga/lib/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/fpga/models/.gitignore b/gr-radar-mono/src/fpga/models/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/src/fpga/models/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/fpga/tb/.gitignore b/gr-radar-mono/src/fpga/tb/.gitignore new file mode 100644 index 000000000..d709d8c29 --- /dev/null +++ b/gr-radar-mono/src/fpga/tb/.gitignore @@ -0,0 +1,6 @@ +/Makefile +/Makefile.in +/radar_tb +/out +/*.out* +/*.vcd diff --git a/gr-radar-mono/src/fpga/top/.gitignore b/gr-radar-mono/src/fpga/top/.gitignore new file mode 100644 index 000000000..40492321d --- /dev/null +++ b/gr-radar-mono/src/fpga/top/.gitignore @@ -0,0 +1,21 @@ +/*.qmsg +/*.qws +/*.eqn +/*.done +/*.htm +/*.rpt +/*.ini +/*.fsf +/*.jam +/*.jbc +/*.pin +/*.pof +/*.rbf +/*.smsg +/*.sof +/*.ttf +/*.summary +/undo_redo.txt +/db +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/lib/.gitignore b/gr-radar-mono/src/lib/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-radar-mono/src/lib/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-radar-mono/src/python/.gitignore b/gr-radar-mono/src/python/.gitignore new file mode 100644 index 000000000..f104c5892 --- /dev/null +++ b/gr-radar-mono/src/python/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/run_tests +/*.pyc diff --git a/gr-radio-astronomy/.gitignore b/gr-radio-astronomy/.gitignore new file mode 100644 index 000000000..8736aba7f --- /dev/null +++ b/gr-radio-astronomy/.gitignore @@ -0,0 +1,22 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log diff --git a/gr-radio-astronomy/src/.gitignore b/gr-radio-astronomy/src/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/gr-radio-astronomy/src/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/gr-radio-astronomy/src/lib/.gitignore b/gr-radio-astronomy/src/lib/.gitignore new file mode 100644 index 000000000..6fc7d943b --- /dev/null +++ b/gr-radio-astronomy/src/lib/.gitignore @@ -0,0 +1,13 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py +/ra.cc +/ra.py +/*.pyc diff --git a/gr-radio-astronomy/src/python/.gitignore b/gr-radio-astronomy/src/python/.gitignore new file mode 100644 index 000000000..bf03975bb --- /dev/null +++ b/gr-radio-astronomy/src/python/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/run_tests diff --git a/gr-sounder/.gitignore b/gr-sounder/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-sounder/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-sounder/doc/.gitignore b/gr-sounder/doc/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-sounder/doc/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-sounder/src/.gitignore b/gr-sounder/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-sounder/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-sounder/src/fpga/.gitignore b/gr-sounder/src/fpga/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-sounder/src/fpga/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-sounder/src/fpga/lib/.gitignore b/gr-sounder/src/fpga/lib/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-sounder/src/fpga/lib/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-sounder/src/fpga/tb/.gitignore b/gr-sounder/src/fpga/tb/.gitignore new file mode 100644 index 000000000..b05ab62aa --- /dev/null +++ b/gr-sounder/src/fpga/tb/.gitignore @@ -0,0 +1,5 @@ +/Makefile +/Makefile.in +/*.vcd +/sounder_tb +/*.out* diff --git a/gr-sounder/src/fpga/top/.gitignore b/gr-sounder/src/fpga/top/.gitignore new file mode 100644 index 000000000..2c9458cf2 --- /dev/null +++ b/gr-sounder/src/fpga/top/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/db +/*.rpt +/*.summary +/*.rbf +/*.qws +/*.smsg +/*.done +/*.pin +/*.sof diff --git a/gr-sounder/src/lib/.gitignore b/gr-sounder/src/lib/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-sounder/src/lib/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-sounder/src/python/.gitignore b/gr-sounder/src/python/.gitignore new file mode 100644 index 000000000..8ac573ba1 --- /dev/null +++ b/gr-sounder/src/python/.gitignore @@ -0,0 +1,5 @@ +/Makefile +/Makefile.in +/run_tests +/*.pyc +/loopback.dat diff --git a/gr-trellis/.gitignore b/gr-trellis/.gitignore new file mode 100644 index 000000000..f3462d009 --- /dev/null +++ b/gr-trellis/.gitignore @@ -0,0 +1,23 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/*.pc diff --git a/gr-trellis/doc/.gitignore b/gr-trellis/doc/.gitignore new file mode 100644 index 000000000..98c25189f --- /dev/null +++ b/gr-trellis/doc/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.html diff --git a/gr-trellis/src/.gitignore b/gr-trellis/src/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/gr-trellis/src/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/gr-trellis/src/examples/.gitignore b/gr-trellis/src/examples/.gitignore new file mode 100644 index 000000000..c400497f5 --- /dev/null +++ b/gr-trellis/src/examples/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gr-trellis/src/examples/fsm_files/.gitignore b/gr-trellis/src/examples/fsm_files/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-trellis/src/examples/fsm_files/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-trellis/src/lib/.gitignore b/gr-trellis/src/lib/.gitignore new file mode 100644 index 000000000..8932c3611 --- /dev/null +++ b/gr-trellis/src/lib/.gitignore @@ -0,0 +1,99 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/trellis.cc +/trellis.py +/wip +/trellis_encoder_bs.cc +/trellis_metrics_c.h +/trellis_metrics_c.i +/trellis_metrics_f.cc +/trellis_viterbi_i.h +/trellis_viterbi_combined_i.h +/trellis_viterbi_i.i +/trellis_viterbi_combined_i.i +/trellis_metrics_i.h +/trellis_metrics_i.i +/trellis_encoder_bb.cc +/trellis_encoder_ss.cc +/trellis_viterbi_combined_s.h +/trellis_viterbi_s.h +/trellis_viterbi_combined_s.i +/trellis_viterbi_s.i +/trellis_metrics_s.h +/trellis_metrics_s.i +/trellis_encoder_si.h +/trellis_encoder_si.i +/trellis_metrics_i.cc +/trellis_viterbi_s.cc +/trellis_viterbi_combined_s.cc +/trellis_encoder_ss.h +/trellis_encoder_ss.i +/trellis_encoder_bi.cc +/trellis_encoder_bi.h +/trellis_encoder_bi.i +/trellis_encoder_ii.cc +/trellis_viterbi_combined_b.cc +/trellis_viterbi_b.cc +/trellis_encoder_bs.h +/trellis_encoder_bs.i +/trellis_viterbi_combined_b.h +/trellis_viterbi_b.h +/trellis_viterbi_combined_b.i +/trellis_viterbi_b.i +/trellis_encoder_si.cc +/trellis_metrics_f.h +/trellis_metrics_f.i +/trellis_encoder_ii.h +/trellis_encoder_ii.i +/trellis_metrics_c.cc +/trellis_viterbi_combined_i.cc +/trellis_viterbi_i.cc +/trellis_encoder_bb.h +/trellis_encoder_bb.i +/trellis_metrics_s.cc +/trellis_viterbi_combined_fs.h +/trellis_viterbi_combined_fs.i +/trellis_viterbi_combined_fi.cc +/trellis_viterbi_combined_is.h +/trellis_viterbi_combined_is.i +/trellis_viterbi_combined_ci.h +/trellis_viterbi_combined_ci.i +/trellis_viterbi_combined_cs.cc +/trellis_viterbi_combined_is.cc +/trellis_viterbi_combined_si.h +/trellis_viterbi_combined_si.i +/trellis_viterbi_combined_ss.cc +/trellis_viterbi_combined_fb.cc +/trellis_viterbi_combined_fi.h +/trellis_viterbi_combined_fi.i +/trellis_viterbi_combined_cb.h +/trellis_viterbi_combined_cb.i +/trellis_viterbi_combined_ci.cc +/trellis_viterbi_combined_ii.cc +/trellis_viterbi_combined_ii.h +/trellis_viterbi_combined_ii.i +/trellis_viterbi_combined_sb.h +/trellis_viterbi_combined_sb.i +/trellis_viterbi_combined_si.cc +/trellis_viterbi_combined_fb.h +/trellis_viterbi_combined_fb.i +/trellis_viterbi_combined_ib.h +/trellis_viterbi_combined_ib.i +/trellis_viterbi_combined_cs.h +/trellis_viterbi_combined_cs.i +/trellis_viterbi_combined_fs.cc +/trellis_viterbi_combined_cb.cc +/trellis_viterbi_combined_ss.h +/trellis_viterbi_combined_ss.i +/trellis_viterbi_combined_ib.cc +/trellis_viterbi_combined_sb.cc +/trellis_generated.i +/generate-stamp +/stamp-* diff --git a/gr-trellis/src/python/.gitignore b/gr-trellis/src/python/.gitignore new file mode 100644 index 000000000..bf03975bb --- /dev/null +++ b/gr-trellis/src/python/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo +/run_tests diff --git a/gr-usrp/.gitignore b/gr-usrp/.gitignore new file mode 100644 index 000000000..cdcf41b15 --- /dev/null +++ b/gr-usrp/.gitignore @@ -0,0 +1,30 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 diff --git a/gr-usrp/apps/.gitignore b/gr-usrp/apps/.gitignore new file mode 100644 index 000000000..2d01df25f --- /dev/null +++ b/gr-usrp/apps/.gitignore @@ -0,0 +1,6 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/usrp_siggen +/usrp_rx_cfile diff --git a/gr-usrp/src/.gitignore b/gr-usrp/src/.gitignore new file mode 100644 index 000000000..68abaf8aa --- /dev/null +++ b/gr-usrp/src/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/usrp_swig.cc +/usrp_swig.py +/run_tests +/usrp_dbids.py +/*.pyc diff --git a/gr-usrp2/.gitignore b/gr-usrp2/.gitignore new file mode 100644 index 000000000..a43ae9c69 --- /dev/null +++ b/gr-usrp2/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/gnuradio-usrp2.pc diff --git a/gr-usrp2/src/.gitignore b/gr-usrp2/src/.gitignore new file mode 100644 index 000000000..6f241fe83 --- /dev/null +++ b/gr-usrp2/src/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/usrp2.py +/usrp2.cc +/run_tests +/test_gr_usrp2 +/*.pyc diff --git a/gr-utils/.gitignore b/gr-utils/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-utils/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-utils/src/.gitignore b/gr-utils/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-utils/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-utils/src/lib/.gitignore b/gr-utils/src/lib/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-utils/src/lib/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-utils/src/python/.gitignore b/gr-utils/src/python/.gitignore new file mode 100644 index 000000000..b6950912c --- /dev/null +++ b/gr-utils/src/python/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pyc diff --git a/gr-utils/src/python/gr_plot_const.py b/gr-utils/src/python/gr_plot_const.py index 355309955..ec2272c74 100755 --- a/gr-utils/src/python/gr_plot_const.py +++ b/gr-utils/src/python/gr_plot_const.py @@ -35,9 +35,6 @@ except ImportError: from optparse import OptionParser -matplotlib.interactive(True) -matplotlib.use('TkAgg') - class draw_constellation: def __init__(self, filename, options): self.hfile = open(filename, "r") @@ -139,8 +136,9 @@ class draw_constellation: draw() def zoom(self, event): - newxlim = self.sp_iq.get_xlim() - if(newxlim.all() != self.xlim.all()): + newxlim = scipy.array(self.sp_iq.get_xlim()) + curxlim = scipy.array(self.xlim) + if(newxlim.all() != curxlim.all()): self.xlim = newxlim r = self.reals[int(ceil(self.xlim[0])) : int(ceil(self.xlim[1]))] i = self.imags[int(ceil(self.xlim[0])) : int(ceil(self.xlim[1]))] diff --git a/gr-utils/src/python/gr_plot_fft.py b/gr-utils/src/python/gr_plot_fft.py index 59a3f286b..a9c1417f9 100755 --- a/gr-utils/src/python/gr_plot_fft.py +++ b/gr-utils/src/python/gr_plot_fft.py @@ -21,14 +21,6 @@ # try: - import matplotlib - matplotlib.use('TkAgg') - matplotlib.interactive(True) -except ImportError: - print "Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)" - raise SystemExit, 1 - -try: import scipy from scipy import fftpack except ImportError: @@ -164,8 +156,9 @@ class gr_plot_fft: draw() def zoom(self, event): - newxlim = self.sp_iq.get_xlim() - if(newxlim.all() != self.xlim.all()): + newxlim = scipy.array(self.sp_iq.get_xlim()) + curxlim = scipy.array(self.xlim) + if(newxlim.all() != curxlim.all()): self.xlim = newxlim xmin = max(0, int(ceil(self.sample_rate*(self.xlim[0] - self.position)))) xmax = min(int(ceil(self.sample_rate*(self.xlim[1] - self.position))), len(self.iq)) diff --git a/gr-utils/src/python/gr_plot_iq.py b/gr-utils/src/python/gr_plot_iq.py index 2a4142a81..371ce3b79 100755 --- a/gr-utils/src/python/gr_plot_iq.py +++ b/gr-utils/src/python/gr_plot_iq.py @@ -34,10 +34,7 @@ except ImportError: from optparse import OptionParser -matplotlib.interactive(True) -matplotlib.use('TkAgg') - -class draw_fft: +class draw_iq: def __init__(self, filename, options): self.hfile = open(filename, "r") self.block_length = options.block @@ -168,7 +165,7 @@ def main(): raise SystemExit, 1 filename = args[0] - dc = draw_fft(filename, options) + dc = draw_iq(filename, options) if __name__ == "__main__": try: diff --git a/gr-utils/src/python/gr_plot_psd.py b/gr-utils/src/python/gr_plot_psd.py index 669d7b573..0e3dbecd9 100755 --- a/gr-utils/src/python/gr_plot_psd.py +++ b/gr-utils/src/python/gr_plot_psd.py @@ -21,14 +21,6 @@ # try: - import matplotlib - matplotlib.use('TkAgg') - matplotlib.interactive(True) -except ImportError: - print "Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)" - raise SystemExit, 1 - -try: import scipy from scipy import fftpack except ImportError: @@ -187,8 +179,9 @@ class gr_plot_psd: draw() def zoom(self, event): - newxlim = self.sp_iq.get_xlim() - if(newxlim.all() != self.xlim.all()): + newxlim = scipy.array(self.sp_iq.get_xlim()) + curxlim = scipy.array(self.xlim) + if(newxlim.all() != curxlim.all()): self.xlim = newxlim xmin = max(0, int(ceil(self.sample_rate*(self.xlim[0] - self.position)))) xmax = min(int(ceil(self.sample_rate*(self.xlim[1] - self.position))), len(self.iq)) diff --git a/gr-utils/src/python/plot_data.py b/gr-utils/src/python/plot_data.py index 7c79e1714..08cdd6030 100644 --- a/gr-utils/src/python/plot_data.py +++ b/gr-utils/src/python/plot_data.py @@ -33,9 +33,6 @@ except ImportError: from optparse import OptionParser -matplotlib.interactive(True) -matplotlib.use('TkAgg') - class plot_data: def __init__(self, datatype, filenames, options): self.hfile = list() diff --git a/gr-video-sdl/.gitignore b/gr-video-sdl/.gitignore new file mode 100644 index 000000000..53edad32f --- /dev/null +++ b/gr-video-sdl/.gitignore @@ -0,0 +1,32 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 +/stamp-h1.in +/stamp-h2.in diff --git a/gr-video-sdl/src/.gitignore b/gr-video-sdl/src/.gitignore new file mode 100644 index 000000000..e068ddb44 --- /dev/null +++ b/gr-video-sdl/src/.gitignore @@ -0,0 +1,12 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/video_sdl.cc +/video_sdl.py +/run_tests diff --git a/gr-wxgui/.gitignore b/gr-wxgui/.gitignore new file mode 100644 index 000000000..cdcf41b15 --- /dev/null +++ b/gr-wxgui/.gitignore @@ -0,0 +1,30 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/mkinstalldirs +/py-compile +/stamp-h +/stamp-h.in +/stamp-h1 diff --git a/gr-wxgui/src/.gitignore b/gr-wxgui/src/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gr-wxgui/src/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gr-wxgui/src/python/.gitignore b/gr-wxgui/src/python/.gitignore new file mode 100644 index 000000000..f9c5da0db --- /dev/null +++ b/gr-wxgui/src/python/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/*.pyc +/*.pyo diff --git a/gr-wxgui/src/python/forms/.gitignore b/gr-wxgui/src/python/forms/.gitignore new file mode 100644 index 000000000..a74b07aee --- /dev/null +++ b/gr-wxgui/src/python/forms/.gitignore @@ -0,0 +1 @@ +/*.pyc diff --git a/gr-wxgui/src/python/plotter/.gitignore b/gr-wxgui/src/python/plotter/.gitignore new file mode 100644 index 000000000..b6950912c --- /dev/null +++ b/gr-wxgui/src/python/plotter/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/*.pyc diff --git a/grc/.gitignore b/grc/.gitignore new file mode 100644 index 000000000..8e70007d6 --- /dev/null +++ b/grc/.gitignore @@ -0,0 +1,3 @@ +/grc.conf +/Makefile +/Makefile.in diff --git a/grc/base/.gitignore b/grc/base/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/base/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/blocks/.gitignore b/grc/blocks/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/blocks/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/examples/.gitignore b/grc/examples/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/examples/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/examples/audio/.gitignore b/grc/examples/audio/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/examples/audio/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/examples/simple/.gitignore b/grc/examples/simple/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/examples/simple/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/examples/trellis/.gitignore b/grc/examples/trellis/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/examples/trellis/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/examples/usrp/.gitignore b/grc/examples/usrp/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/examples/usrp/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/examples/xmlrpc/.gitignore b/grc/examples/xmlrpc/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/examples/xmlrpc/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/freedesktop/.gitignore b/grc/freedesktop/.gitignore new file mode 100644 index 000000000..ff07a101f --- /dev/null +++ b/grc/freedesktop/.gitignore @@ -0,0 +1,3 @@ +/grc_setup_freedesktop +/Makefile +/Makefile.in diff --git a/grc/grc_gnuradio/.gitignore b/grc/grc_gnuradio/.gitignore new file mode 100644 index 000000000..908cf90b8 --- /dev/null +++ b/grc/grc_gnuradio/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/Constants.py diff --git a/grc/gui/.gitignore b/grc/gui/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/gui/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/python/.gitignore b/grc/python/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/python/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/grc/scripts/.gitignore b/grc/scripts/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/grc/scripts/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gruel/.gitignore b/gruel/.gitignore new file mode 100644 index 000000000..ede973f11 --- /dev/null +++ b/gruel/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/gruel.pc diff --git a/gruel/src/.gitignore b/gruel/src/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gruel/src/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gruel/src/include/.gitignore b/gruel/src/include/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gruel/src/include/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gruel/src/include/gruel/.gitignore b/gruel/src/include/gruel/.gitignore new file mode 100644 index 000000000..bbe96391c --- /dev/null +++ b/gruel/src/include/gruel/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/inet.h +/pmt_serial_tags.h diff --git a/gruel/src/include/gruel/Makefile.am b/gruel/src/include/gruel/Makefile.am index c38c7fa38..9f50cb619 100644 --- a/gruel/src/include/gruel/Makefile.am +++ b/gruel/src/include/gruel/Makefile.am @@ -35,6 +35,7 @@ gruelinclude_HEADERS = \ pmt_pool.h \ pmt_serial_tags.h \ realtime.h \ + send.h \ sys_pri.h \ thread_body_wrapper.h \ thread_group.h \ diff --git a/gruel/src/include/gruel/msg_accepter.h b/gruel/src/include/gruel/msg_accepter.h index bc287afae..3afd6dde0 100644 --- a/gruel/src/include/gruel/msg_accepter.h +++ b/gruel/src/include/gruel/msg_accepter.h @@ -18,8 +18,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef INCLUDED_MSG_ACCEPTER_H -#define INCLUDED_MSG_ACCEPTER_H +#ifndef INCLUDED_GRUEL_MSG_ACCEPTER_H +#define INCLUDED_GRUEL_MSG_ACCEPTER_H #include <gruel/pmt.h> @@ -34,9 +34,16 @@ namespace gruel { msg_accepter() {}; virtual ~msg_accepter(); + /*! + * \brief send \p msg to \p msg_accepter + * + * Sending a message is an asynchronous operation. The \p post + * call will not wait for the message either to arrive at the + * destination or to be received. + */ virtual void post(pmt::pmt_t msg) = 0; }; } /* namespace gruel */ -#endif /* INCLUDED_MSG_ACCEPTER_H */ +#endif /* INCLUDED_GRUEL_MSG_ACCEPTER_H */ diff --git a/gruel/src/include/gruel/msg_accepter_msgq.h b/gruel/src/include/gruel/msg_accepter_msgq.h index b14049d54..bf1762e92 100644 --- a/gruel/src/include/gruel/msg_accepter_msgq.h +++ b/gruel/src/include/gruel/msg_accepter_msgq.h @@ -32,13 +32,14 @@ namespace gruel { */ class msg_accepter_msgq : public msg_accepter { + protected: msg_queue_sptr d_msg_queue; public: msg_accepter_msgq(msg_queue_sptr msgq); ~msg_accepter_msgq(); - void post(pmt::pmt_t msg); + virtual void post(pmt::pmt_t msg); msg_queue_sptr msg_queue() const { return d_msg_queue; } }; diff --git a/gruel/src/include/gruel/pmt.h b/gruel/src/include/gruel/pmt.h index de0998b5e..240359301 100644 --- a/gruel/src/include/gruel/pmt.h +++ b/gruel/src/include/gruel/pmt.h @@ -23,7 +23,7 @@ #ifndef INCLUDED_PMT_H #define INCLUDED_PMT_H -#include <boost/shared_ptr.hpp> +#include <boost/intrusive_ptr.hpp> #include <boost/any.hpp> #include <complex> #include <string> @@ -50,8 +50,10 @@ class pmt_base; * \brief typedef for shared pointer (transparent reference counting). * See http://www.boost.org/libs/smart_ptr/smart_ptr.htm */ -typedef boost::shared_ptr<pmt_base> pmt_t; +typedef boost::intrusive_ptr<pmt_base> pmt_t; +extern void intrusive_ptr_add_ref(pmt_base*); +extern void intrusive_ptr_release(pmt_base*); class pmt_exception : public std::logic_error { @@ -237,6 +239,42 @@ pmt_t pmt_cadddr(pmt_t pair); /* * ------------------------------------------------------------------------ + * Tuples + * + * Store a fixed number of objects. Tuples are not modifiable, and thus + * are excellent for use as messages. Indexing is zero based. + * Access time to an element is O(1). + * ------------------------------------------------------------------------ + */ + +//! Return true if \p x is a tuple, othewise false. +bool pmt_is_tuple(pmt_t x); + +pmt_t pmt_make_tuple(); +pmt_t pmt_make_tuple(const pmt_t &e0); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7, const pmt_t &e8); +pmt_t pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7, const pmt_t &e8, const pmt_t &e9); + +/*! + * If \p x is a vector or proper list, return a tuple containing the elements of x + */ +pmt_t pmt_to_tuple(const pmt_t &x); + +/*! + * Return the contents of position \p k of \p tuple. + * \p k must be a valid index of \p tuple. + */ +pmt_t pmt_tuple_ref(const pmt_t &tuple, size_t k); + +/* + * ------------------------------------------------------------------------ * Vectors * * These vectors can hold any kind of objects. Indexing is zero based. diff --git a/gruel/src/include/gruel/send.h b/gruel/src/include/gruel/send.h new file mode 100644 index 000000000..292017d45 --- /dev/null +++ b/gruel/src/include/gruel/send.h @@ -0,0 +1,49 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef INCLUDED_GRUEL_SEND_H +#define INCLUDED_GRUEL_SEND_H + +#include <gruel/msg_accepter.h> + +namespace gruel { + + + /*! + * \brief send \p msg to \p msg_accepter + * + * Sending a message is an asynchronous operation. The \p send + * call will not wait for the message either to arrive at the + * destination or to be received. + * + * \returns msg + */ + static inline pmt::pmt_t + send(msg_accepter &acc, pmt::pmt_t msg) + { + return acc.post(msg); + } + + + +} /* namespace gruel */ + + +#endif /* INCLUDED_SEND_H */ diff --git a/gruel/src/lib/.gitignore b/gruel/src/lib/.gitignore new file mode 100644 index 000000000..89a768d46 --- /dev/null +++ b/gruel/src/lib/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.libs +/.deps diff --git a/gruel/src/lib/msg/.gitignore b/gruel/src/lib/msg/.gitignore new file mode 100644 index 000000000..c026fd667 --- /dev/null +++ b/gruel/src/lib/msg/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.deps +/.libs diff --git a/gruel/src/lib/pmt/.gitignore b/gruel/src/lib/pmt/.gitignore new file mode 100644 index 000000000..035c0316b --- /dev/null +++ b/gruel/src/lib/pmt/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/test_pmt +/qa_pmt_unv.cc +/qa_pmt_unv.h +/pmt_unv_int.h +/pmt_unv.cc +/stamp-sources-generate diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index fbf557be1..f0e3c30a2 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -56,6 +56,8 @@ pmt_base::operator delete(void *p, size_t size) #endif +void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) delete p; } pmt_base::~pmt_base() { @@ -126,6 +128,12 @@ _vector(pmt_t x) return dynamic_cast<pmt_vector*>(x.get()); } +static pmt_tuple * +_tuple(pmt_t x) +{ + return dynamic_cast<pmt_tuple*>(x.get()); +} + static pmt_uniform_vector * _uniform_vector(pmt_t x) { @@ -495,6 +503,201 @@ pmt_vector_fill(pmt_t vector, pmt_t obj) } //////////////////////////////////////////////////////////////////////////// +// Tuples +//////////////////////////////////////////////////////////////////////////// + +pmt_tuple::pmt_tuple(size_t len) + : d_v(len) +{ +} + +pmt_t +pmt_tuple::ref(size_t k) const +{ + if (k >= length()) + throw pmt_out_of_range("pmt_tuple_ref", pmt_from_long(k)); + return d_v[k]; +} + +bool +pmt_is_tuple(pmt_t obj) +{ + return obj->is_tuple(); +} + +pmt_t +pmt_tuple_ref(const pmt_t &tuple, size_t k) +{ + if (!tuple->is_tuple()) + throw pmt_wrong_type("pmt_tuple_ref", tuple); + return _tuple(tuple)->ref(k); +} + +// for (i=0; i < 10; i++) +// make_constructor() + +pmt_t +pmt_make_tuple() +{ + return pmt_t(new pmt_tuple(0)); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0) +{ + pmt_tuple *t = new pmt_tuple(1); + t->_set(0, e0); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1) +{ + pmt_tuple *t = new pmt_tuple(2); + t->_set(0, e0); + t->_set(1, e1); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2) +{ + pmt_tuple *t = new pmt_tuple(3); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3) +{ + pmt_tuple *t = new pmt_tuple(4); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4) +{ + pmt_tuple *t = new pmt_tuple(5); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5) +{ + pmt_tuple *t = new pmt_tuple(6); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6) +{ + pmt_tuple *t = new pmt_tuple(7); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7) +{ + pmt_tuple *t = new pmt_tuple(8); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + t->_set(7, e7); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7, const pmt_t &e8) +{ + pmt_tuple *t = new pmt_tuple(9); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + t->_set(7, e7); + t->_set(8, e8); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7, const pmt_t &e8, const pmt_t &e9) +{ + pmt_tuple *t = new pmt_tuple(10); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + t->_set(7, e7); + t->_set(8, e8); + t->_set(9, e9); + return pmt_t(t); +} + +pmt_t +pmt_to_tuple(const pmt_t &x) +{ + if (x->is_tuple()) // already one + return x; + + size_t len = pmt_length(x); + pmt_tuple *t = new pmt_tuple(len); + pmt_t r = pmt_t(t); + + if (x->is_vector()){ + for (size_t i = 0; i < len; i++) + t->_set(i, _vector(x)->ref(i)); + return r; + } + + if (x->is_pair()){ + pmt_t y = x; + for (size_t i = 0; i < len; i++){ + t->_set(i, pmt_car(y)); + y = pmt_cdr(y); + } + return r; + } + + throw pmt_wrong_type("pmt_to_tuple", x); +} + + + +//////////////////////////////////////////////////////////////////////////// // Uniform Numeric Vectors //////////////////////////////////////////////////////////////////////////// @@ -728,6 +931,19 @@ pmt_equal(const pmt_t& x, const pmt_t& y) return true; } + if (x->is_tuple() && y->is_tuple()){ + pmt_tuple *xv = _tuple(x); + pmt_tuple *yv = _tuple(y); + if (xv->length() != yv->length()) + return false; + + for (unsigned i = 0; i < xv->length(); i++) + if (!pmt_equal(xv->_ref(i), yv->_ref(i))) + return false; + + return true; + } + if (x->is_uniform_vector() && y->is_uniform_vector()){ pmt_uniform_vector *xv = _uniform_vector(x); pmt_uniform_vector *yv = _uniform_vector(y); @@ -757,11 +973,15 @@ pmt_length(const pmt_t& x) if (x->is_uniform_vector()) return _uniform_vector(x)->length(); - if (x->is_null()) return 0; + if (x->is_tuple()) + return _tuple(x)->length(); + + if (x->is_null()) + return 0; if (x->is_pair()) { size_t length=1; - pmt_t it = pmt_cdr(x); + pmt_t it = pmt_cdr(x); while (pmt_is_pair(it)){ length++; it = pmt_cdr(it); diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 9aac322a7..7581845f8 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -24,6 +24,7 @@ #include <gruel/pmt.h> #include <boost/utility.hpp> +#include <boost/detail/atomic_count.hpp> /* * EVERYTHING IN THIS FILE IS PRIVATE TO THE IMPLEMENTATION! @@ -35,8 +36,10 @@ namespace pmt { class pmt_base : boost::noncopyable { + mutable boost::detail::atomic_count count_; + protected: - pmt_base(){}; + pmt_base() : count_(0) {}; virtual ~pmt_base(); public: @@ -48,6 +51,7 @@ public: virtual bool is_complex() const { return false; } virtual bool is_null() const { return false; } virtual bool is_pair() const { return false; } + virtual bool is_tuple() const { return false; } virtual bool is_vector() const { return false; } virtual bool is_dict() const { return false; } virtual bool is_any() const { return false; } @@ -66,6 +70,9 @@ public: virtual bool is_c32vector() const { return false; } virtual bool is_c64vector() const { return false; } + friend void intrusive_ptr_add_ref(pmt_base* p); + friend void intrusive_ptr_release(pmt_base* p); + # if (PMT_LOCAL_ALLOCATOR) void *operator new(size_t); void operator delete(void *, size_t); @@ -180,6 +187,22 @@ public: pmt_t _ref(size_t k) const { return d_v[k]; } }; +class pmt_tuple : public pmt_base +{ + std::vector<pmt_t> d_v; + +public: + pmt_tuple(size_t len); + //~pmt_tuple(); + + bool is_tuple() const { return true; } + pmt_t ref(size_t k) const; + size_t length() const { return d_v.size(); } + + pmt_t _ref(size_t k) const { return d_v[k]; } + void _set(size_t k, pmt_t v) { d_v[k] = v; } +}; + class pmt_dict : public pmt_base { pmt_t d_alist; // list of (key . value) pairs diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc index f5a82de0e..179e6b72c 100644 --- a/gruel/src/lib/pmt/pmt_io.cc +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -80,16 +80,31 @@ pmt_write(pmt_t obj, std::ostream &port) port << "("; pmt_write_list_tail(obj, port); } + else if (pmt_is_tuple(obj)){ + port << "{"; + size_t len = pmt_length(obj); + if (len > 0){ + port << pmt_tuple_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << pmt_tuple_ref(obj, i); + } + port << "}"; + } + else if (pmt_is_vector(obj)){ + port << "#("; + size_t len = pmt_length(obj); + if (len > 0){ + port << pmt_vector_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << pmt_vector_ref(obj, i); + } + port << ")"; + } else if (pmt_is_dict(obj)){ // FIXME // port << "#<dict " << obj << ">"; port << "#<dict>"; } - else if (pmt_is_vector(obj)){ - // FIXME - // port << "#<vector " << obj << ">"; - port << "#<vector>"; - } else if (pmt_is_uniform_vector(obj)){ // FIXME // port << "#<uniform-vector " << obj << ">"; diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index b81354721..899674bbb 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -193,6 +193,91 @@ qa_pmt_prims::test_vectors() CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i)); } +static void +check_tuple(size_t len, const std::vector<pmt_t> &s, pmt_t t) +{ + CPPUNIT_ASSERT_EQUAL(true, pmt_is_tuple(t)); + CPPUNIT_ASSERT_EQUAL(len, pmt_length(t)); + + for (size_t i = 0; i < len; i++) + CPPUNIT_ASSERT_EQUAL(s[i], pmt_tuple_ref(t, i)); + +} + +void +qa_pmt_prims::test_tuples() +{ + pmt_t v = pmt_make_vector(10, PMT_NIL); + std::vector<pmt_t> s(10); + for (size_t i = 0; i < 10; i++){ + std::ostringstream os; + os << "s" << i; + s[i] = pmt_string_to_symbol(os.str()); + pmt_vector_set(v, i, s[i]); + } + + + pmt_t t; + + t = pmt_make_tuple(); + check_tuple(0, s, t); + + t = pmt_make_tuple(s[0]); + check_tuple(1, s, t); + + CPPUNIT_ASSERT(pmt_is_vector(v)); + CPPUNIT_ASSERT(!pmt_is_tuple(v)); + CPPUNIT_ASSERT(pmt_is_tuple(t)); + CPPUNIT_ASSERT(!pmt_is_vector(t)); + + t = pmt_make_tuple(s[0], s[1]); + check_tuple(2, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2]); + check_tuple(3, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3]); + check_tuple(4, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4]); + check_tuple(5, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5]); + check_tuple(6, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6]); + check_tuple(7, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]); + check_tuple(8, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8]); + check_tuple(9, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]); + check_tuple(10, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2]); + CPPUNIT_ASSERT_THROW(pmt_tuple_ref(t, 3), pmt_out_of_range); + CPPUNIT_ASSERT_THROW(pmt_vector_ref(t, 0), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_tuple_ref(v, 0), pmt_wrong_type); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]); + pmt_t t2 = pmt_to_tuple(v); + CPPUNIT_ASSERT_EQUAL(size_t(10), pmt_length(v)); + CPPUNIT_ASSERT(pmt_equal(t, t2)); + //std::cout << v << std::endl; + //std::cout << t2 << std::endl; + + + t = pmt_make_tuple(s[0], s[1], s[2]); + pmt_t list0 = pmt_list3(s[0], s[1], s[2]); + CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(list0)); + t2 = pmt_to_tuple(list0); + CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(t2)); + CPPUNIT_ASSERT(pmt_equal(t, t2)); +} + void qa_pmt_prims::test_equivalence() { @@ -436,3 +521,4 @@ qa_pmt_prims::test_sets() CPPUNIT_ASSERT(!pmt_subsetp(l2,l1)); CPPUNIT_ASSERT(!pmt_subsetp(l3,l2)); } + diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index effb3a097..2fe473c43 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -35,6 +35,7 @@ class qa_pmt_prims : public CppUnit::TestCase { CPPUNIT_TEST(test_complexes); CPPUNIT_TEST(test_pairs); CPPUNIT_TEST(test_vectors); + CPPUNIT_TEST(test_tuples); CPPUNIT_TEST(test_equivalence); CPPUNIT_TEST(test_misc); CPPUNIT_TEST(test_dict); @@ -53,6 +54,7 @@ class qa_pmt_prims : public CppUnit::TestCase { void test_complexes(); void test_pairs(); void test_vectors(); + void test_tuples(); void test_equivalence(); void test_misc(); void test_dict(); diff --git a/gruel/src/scheme/.gitignore b/gruel/src/scheme/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gruel/src/scheme/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/gruel/src/scheme/gnuradio/.gitignore b/gruel/src/scheme/gnuradio/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/gruel/src/scheme/gnuradio/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/mblock/.gitignore b/mblock/.gitignore new file mode 100644 index 000000000..36b77742f --- /dev/null +++ b/mblock/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/mblock.pc diff --git a/mblock/doc/.gitignore b/mblock/doc/.gitignore new file mode 100644 index 000000000..f65ab6cf7 --- /dev/null +++ b/mblock/doc/.gitignore @@ -0,0 +1,18 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/howto-write-a-block.html +/gr_block.h.xml +/howto_1.i.xml +/howto_square_ff.cc.xml +/howto_square_ff.h.xml +/qa_howto_1.py.xml +/src_lib_Makefile_1.am.xml +/src_lib_Makefile_2.am.xml +/howto_square2_ff.cc.xml +/howto_square2_ff.h.xml diff --git a/mblock/src/.gitignore b/mblock/src/.gitignore new file mode 100644 index 000000000..bb3f27777 --- /dev/null +++ b/mblock/src/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/howto.cc +/howto.py diff --git a/mblock/src/include/.gitignore b/mblock/src/include/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/mblock/src/include/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/mblock/src/include/mblock/.gitignore b/mblock/src/include/mblock/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/mblock/src/include/mblock/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/mblock/src/lib/.gitignore b/mblock/src/lib/.gitignore new file mode 100644 index 000000000..b2a2f45a7 --- /dev/null +++ b/mblock/src/lib/.gitignore @@ -0,0 +1,12 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/test_mblock +/qa_bitset_mbh.cc +/benchmark_send +/getres diff --git a/mblock/src/scheme/.gitignore b/mblock/src/scheme/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/mblock/src/scheme/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/mblock/src/scheme/gnuradio/.gitignore b/mblock/src/scheme/gnuradio/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/mblock/src/scheme/gnuradio/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/omnithread/.gitignore b/omnithread/.gitignore new file mode 100644 index 000000000..5a51e3bc3 --- /dev/null +++ b/omnithread/.gitignore @@ -0,0 +1,9 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/gnuradio-omnithread.pc diff --git a/omnithread/gnuradio/.gitignore b/omnithread/gnuradio/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/omnithread/gnuradio/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp/.gitignore b/usrp/.gitignore new file mode 100644 index 000000000..4af69afee --- /dev/null +++ b/usrp/.gitignore @@ -0,0 +1,31 @@ +/*.cache +/*.la +/*.lo +/*.pc +/.deps +/.la +/.libs +/.lo +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/config.cache +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/install-sh +/ltmain.sh +/libtool +/ltmain.sh +/make.log +/missing +/missing +/stamp-h +/py-compile +/stamp-h.in +/stamp-h1 +/usrp.iss diff --git a/usrp/doc/.gitignore b/usrp/doc/.gitignore new file mode 100644 index 000000000..fdf7036a8 --- /dev/null +++ b/usrp/doc/.gitignore @@ -0,0 +1,14 @@ +/Makefile +/Makefile.in +/html +/latex +/man +/Doxyfile +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/xml +/usrp_guide.html diff --git a/usrp/doc/other/.gitignore b/usrp/doc/other/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp/doc/other/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp/firmware/.gitignore b/usrp/firmware/.gitignore new file mode 100644 index 000000000..75bb241c8 --- /dev/null +++ b/usrp/firmware/.gitignore @@ -0,0 +1,25 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/usrp.pc diff --git a/usrp/firmware/include/.gitignore b/usrp/firmware/include/.gitignore new file mode 100644 index 000000000..75bb241c8 --- /dev/null +++ b/usrp/firmware/include/.gitignore @@ -0,0 +1,25 @@ +/Makefile +/Makefile.in +/aclocal.m4 +/configure +/config.h.in +/stamp-h.in +/libtool +/config.log +/config.h +/config.cache +/config.status +/missing +/stamp-h +/stamp-h1 +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/autom4te.cache +/*.cache +/missing +/make.log +/usrp.pc diff --git a/usrp/firmware/lib/.gitignore b/usrp/firmware/lib/.gitignore new file mode 100644 index 000000000..04f253234 --- /dev/null +++ b/usrp/firmware/lib/.gitignore @@ -0,0 +1,18 @@ +/*.ihx +/*.lnk +/*.lst +/*.map +/*.mem +/*.rel +/*.rst +/*.sym +/blink_leds.asm +/usrp_common.asm +/command_loop.asm +/fpga.asm +/*.asm +/usrp_gpif.c +/usrp_gpif_inline.h +/*.lib +/Makefile +/Makefile.in diff --git a/usrp/firmware/src/.gitignore b/usrp/firmware/src/.gitignore new file mode 100644 index 000000000..d46c52c00 --- /dev/null +++ b/usrp/firmware/src/.gitignore @@ -0,0 +1,17 @@ +/*.ihx +/*.lnk +/*.lst +/*.map +/*.mem +/*.rel +/*.rst +/*.sym +/blink_leds.asm +/usrp_common.asm +/command_loop.asm +/fpga.asm +/*.asm +/usrp_gpif.c +/usrp_gpif_inline.h +/Makefile +/Makefile.in diff --git a/usrp/firmware/src/common/.gitignore b/usrp/firmware/src/common/.gitignore new file mode 100644 index 000000000..d46c52c00 --- /dev/null +++ b/usrp/firmware/src/common/.gitignore @@ -0,0 +1,17 @@ +/*.ihx +/*.lnk +/*.lst +/*.map +/*.mem +/*.rel +/*.rst +/*.sym +/blink_leds.asm +/usrp_common.asm +/command_loop.asm +/fpga.asm +/*.asm +/usrp_gpif.c +/usrp_gpif_inline.h +/Makefile +/Makefile.in diff --git a/usrp/firmware/src/usrp2/.gitignore b/usrp/firmware/src/usrp2/.gitignore new file mode 100644 index 000000000..54a9e9415 --- /dev/null +++ b/usrp/firmware/src/usrp2/.gitignore @@ -0,0 +1,20 @@ +/*.ihx +/*.lnk +/*.lst +/*.map +/*.mem +/*.rel +/*.rst +/*.sym +/blink_leds.asm +/usrp_common.asm +/command_loop.asm +/fpga.asm +/*.asm +/Makefile +/Makefile.in +/usrp_gpif.c +/usrp_gpif_inline.h +/Makefile.in +/burn-usrp2-eeprom +/burn-usrp4-eeprom diff --git a/usrp/fpga/.gitignore b/usrp/fpga/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp/fpga/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp/fpga/megacells/.gitignore b/usrp/fpga/megacells/.gitignore new file mode 100644 index 000000000..c2de89b27 --- /dev/null +++ b/usrp/fpga/megacells/.gitignore @@ -0,0 +1 @@ +/db diff --git a/usrp/fpga/rbf/.gitignore b/usrp/fpga/rbf/.gitignore new file mode 100644 index 000000000..eb58a95f5 --- /dev/null +++ b/usrp/fpga/rbf/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/usrp_fpga_rev1.rbf +/usrp_fpga_rev2.rbf diff --git a/usrp/fpga/rbf/rev2/.gitignore b/usrp/fpga/rbf/rev2/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp/fpga/rbf/rev2/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp/fpga/rbf/rev4/.gitignore b/usrp/fpga/rbf/rev4/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp/fpga/rbf/rev4/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp/fpga/sdr_lib/.gitignore b/usrp/fpga/sdr_lib/.gitignore new file mode 100644 index 000000000..e7fc78c42 --- /dev/null +++ b/usrp/fpga/sdr_lib/.gitignore @@ -0,0 +1,2 @@ +/db +/*.vcd diff --git a/usrp/fpga/tb/.gitignore b/usrp/fpga/tb/.gitignore new file mode 100644 index 000000000..6bc85aa2d --- /dev/null +++ b/usrp/fpga/tb/.gitignore @@ -0,0 +1,3 @@ +/*.vcd +/*.out +/fullchip_tb diff --git a/usrp/fpga/toplevel/mrfm/.gitignore b/usrp/fpga/toplevel/mrfm/.gitignore new file mode 100644 index 000000000..fe06aad0d --- /dev/null +++ b/usrp/fpga/toplevel/mrfm/.gitignore @@ -0,0 +1,17 @@ +/*.qws +/*.eqn +/*.done +/*.htm +/*.rpt +/*.ini +/*.fsf +/*.jam +/*.jbc +/*.pin +/*.pof +/*.sof +/*.rbf +/*.ttf +/*.summary +/a.out +/db diff --git a/usrp/fpga/toplevel/sizetest/.gitignore b/usrp/fpga/toplevel/sizetest/.gitignore new file mode 100644 index 000000000..201434ddc --- /dev/null +++ b/usrp/fpga/toplevel/sizetest/.gitignore @@ -0,0 +1,15 @@ +/*.qws +/*.eqn +/*.done +/*.htm +/*.rpt +/*.ini +/*.fsf +/*.jam +/*.jbc +/*.pin +/*.pof +/*.sof +/*.rbf +/*.ttf +/db diff --git a/usrp/fpga/toplevel/usrp_inband_usb/.gitignore b/usrp/fpga/toplevel/usrp_inband_usb/.gitignore new file mode 100644 index 000000000..2cc25f0f2 --- /dev/null +++ b/usrp/fpga/toplevel/usrp_inband_usb/.gitignore @@ -0,0 +1,16 @@ +/*.qws +/*.eqn +/*.done +/*.htm +/*.rpt +/*.ini +/*.fsf +/*.jam +/*.jbc +/*.pin +/*.pof +/*.sof +/*.rbf +/*.ttf +/*.summary +/db diff --git a/usrp/fpga/toplevel/usrp_multi/.gitignore b/usrp/fpga/toplevel/usrp_multi/.gitignore new file mode 100644 index 000000000..2cc25f0f2 --- /dev/null +++ b/usrp/fpga/toplevel/usrp_multi/.gitignore @@ -0,0 +1,16 @@ +/*.qws +/*.eqn +/*.done +/*.htm +/*.rpt +/*.ini +/*.fsf +/*.jam +/*.jbc +/*.pin +/*.pof +/*.sof +/*.rbf +/*.ttf +/*.summary +/db diff --git a/usrp/fpga/toplevel/usrp_std/.gitignore b/usrp/fpga/toplevel/usrp_std/.gitignore new file mode 100644 index 000000000..31d6ea9ef --- /dev/null +++ b/usrp/fpga/toplevel/usrp_std/.gitignore @@ -0,0 +1,17 @@ +/*.qws +/*.eqn +/*.done +/*.htm +/*.rpt +/*.ini +/*.fsf +/*.jam +/*.jbc +/*.pin +/*.pof +/*.sof +/*.rbf +/*.ttf +/*.summary +/prev* +/db diff --git a/usrp/host/.gitignore b/usrp/host/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/usrp/host/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/usrp/host/apps/.gitignore b/usrp/host/apps/.gitignore new file mode 100644 index 000000000..16fdf27ad --- /dev/null +++ b/usrp/host/apps/.gitignore @@ -0,0 +1,27 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.dat +/usrper +/usrper2 +/test_input +/test_fusb +/test_usrp +/test_usrp0 +/test_usrp_standard_rx +/test_usrp_standard_tx +/test_usrp_inband_timestamps +/test_usrp_inband_registers +/test_usrp_inband_rx +/test_usrp_inband_tx +/test_usrp_basic_rx +/check_order_quickly +/usrp_cal_dc_offset +/test_usrp_inband_cs +/read_packets +/test_usrp_inband_ping diff --git a/usrp/host/include/.gitignore b/usrp/host/include/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp/host/include/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp/host/include/usrp/.gitignore b/usrp/host/include/usrp/.gitignore new file mode 100644 index 000000000..25b2cae79 --- /dev/null +++ b/usrp/host/include/usrp/.gitignore @@ -0,0 +1,3 @@ +/Makefile +/Makefile.in +/usrp_dbid.h diff --git a/usrp/host/lib/.gitignore b/usrp/host/lib/.gitignore new file mode 100644 index 000000000..e0e4208db --- /dev/null +++ b/usrp/host/lib/.gitignore @@ -0,0 +1,14 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/test_fusb +/std_paths.h +/usrp_dbid.py +/usrp_dbid.h +/usrp_dbid.cc +/stamp-* diff --git a/usrp/host/misc/.gitignore b/usrp/host/misc/.gitignore new file mode 100644 index 000000000..a02b6ff73 --- /dev/null +++ b/usrp/host/misc/.gitignore @@ -0,0 +1,8 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo diff --git a/usrp/host/swig/.gitignore b/usrp/host/swig/.gitignore new file mode 100644 index 000000000..3a0816517 --- /dev/null +++ b/usrp/host/swig/.gitignore @@ -0,0 +1,14 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/gnuradio_swig_python.cc +/gnuradio_swig_python.py +/usrp_prims.cc +/usrp_prims.py +/prims.cc +/prims.py diff --git a/usrp/limbo/apps-inband/.gitignore b/usrp/limbo/apps-inband/.gitignore new file mode 100644 index 000000000..f62d9e1de --- /dev/null +++ b/usrp/limbo/apps-inband/.gitignore @@ -0,0 +1,35 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.dat +/.*.swp +/usrper +/usrper2 +/test_input +/test_fusb +/test_usrp +/test_usrp0 +/test_usrp_standard_rx +/test_usrp_standard_tx +/test_usrp_standard_2tx +/test_usrp_inband_timestamps +/test_usrp_inband_registers +/test_usrp_inband_rx +/test_usrp_inband_2rx +/test_usrp_inband_tx +/test_usrp_inband_2tx +/test_usrp_basic_rx +/check_order_quickly +/usrp_cal_dc_offset +/test_usrp_inband_cs +/read_packets +/test_usrp_inband_ping +/test_usrp_inband_underrun +/test_usrp_inband_overrun +/gmac_mbh.cc +/test_gmac_tx diff --git a/usrp/limbo/inband/.gitignore b/usrp/limbo/inband/.gitignore new file mode 100644 index 000000000..a228dcdc1 --- /dev/null +++ b/usrp/limbo/inband/.gitignore @@ -0,0 +1,20 @@ +/Makefile +/Makefile.in +/.la +/.lo +/.deps +/.libs +/*.la +/*.lo +/*.swp +/*.dat +/test_fusb +/std_paths.h +/usrp_dbid.py +/usrp_dbid.h +/usrp_dbid.cc +/usrp_server_mbh.cc +/test_inband +/test_usrp_inband +/test_usrp_tx +/*_mbh.cc diff --git a/usrp2/.gitignore b/usrp2/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp2/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp2/firmware/.gitignore b/usrp2/firmware/.gitignore new file mode 100644 index 000000000..2381f1328 --- /dev/null +++ b/usrp2/firmware/.gitignore @@ -0,0 +1,40 @@ +/*-stamp +/*.a +/*.bin +/*.dump +/*.log +/*.rom +/.deps +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/blink_leds +/blink_leds2 +/build +/compile +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/eth_test +/gen_eth_packets +/ibs_rx_test +/ibs_tx_test +/install-sh +/libtool +/ltmain.sh +/missing +/py-compile +/rcv_eth_packets +/run_tests.sh +/stamp-h1 +/test1 +/test_phy_comm +/timer_test +/buf_ram_test +/buf_ram_zero +/hello +/configure.lineno diff --git a/usrp2/firmware/apps/.gitignore b/usrp2/firmware/apps/.gitignore new file mode 100644 index 000000000..b8ab0dc8d --- /dev/null +++ b/usrp2/firmware/apps/.gitignore @@ -0,0 +1,77 @@ +/*-stamp +/*.a +/*.bin +/*.dump +/*.log +/*.rom +/*.map +/.deps +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/blink_leds +/blink_leds2 +/build +/compile +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/echo +/eth_test +/gen_eth_packets +/ibs_rx_test +/ibs_tx_test +/install-sh +/libtool +/ltmain.sh +/missing +/py-compile +/rcv_eth_packets +/run_tests.sh +/stamp-h1 +/test1 +/test_phy_comm +/timer_test +/buf_ram_test +/buf_ram_zero +/hello +/test_printf +/test_spi +/test_i2c +/gen_pause_frames +/test_serdes +/rx_only +/tx_only +/tx_standalone +/tx_drop +/tx_drop2 +/tx_drop_rate_limited +/test_lsdac +/test_lsadc +/read_dbids +/test_db_spi +/ramp_lsdac +/eth_to_serdes +/serdes_to_dsp +/sd_gentest +/sd_bounce +/can_i_sub +/tx_only_v2 +/rx_only_v2 +/txrx +/eth_serdes +/serdes_txrx +/set_hw_rev +/test_sd +/factory_test +/test_ram +/mimo_tx +/mimo_tx_slave +/burn_dbsrx_eeprom +/burnrev30 +/burnrev31 +/burnrev40 diff --git a/usrp2/firmware/config/.gitignore b/usrp2/firmware/config/.gitignore new file mode 100644 index 000000000..b11bb113a --- /dev/null +++ b/usrp2/firmware/config/.gitignore @@ -0,0 +1,20 @@ +/configure +/Makefile.in +/config.log +/config.h +/ltmain.sh +/Makefile +/config.status +/stamp-h1 +/config.h.in +/autom4te.cache +/libtool +/missing +/aclocal.m4 +/install-sh +/depcomp +/py-compile +/compile +/build +/run_tests.sh +/*-stamp diff --git a/usrp2/firmware/include/.gitignore b/usrp2/firmware/include/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp2/firmware/include/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp2/firmware/lib/.gitignore b/usrp2/firmware/lib/.gitignore new file mode 100644 index 000000000..f1cc2bf73 --- /dev/null +++ b/usrp2/firmware/lib/.gitignore @@ -0,0 +1,39 @@ +/*-stamp +/*.a +/*.bin +/*.dump +/*.log +/*.rom +/.deps +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/blink_leds +/blink_leds2 +/build +/compile +/config.h +/config.h.in +/config.log +/config.status +/configure +/depcomp +/eth_test +/gen_eth_packets +/ibs_rx_test +/ibs_tx_test +/install-sh +/libtool +/ltmain.sh +/missing +/py-compile +/rcv_eth_packets +/run_tests.sh +/stamp-h1 +/test1 +/test_phy_comm +/timer_test +/buf_ram_test +/buf_ram_zero +/hello diff --git a/usrp2/fpga/boot_cpld/.gitignore b/usrp2/fpga/boot_cpld/.gitignore new file mode 100644 index 000000000..45cf9a86b --- /dev/null +++ b/usrp2/fpga/boot_cpld/.gitignore @@ -0,0 +1,38 @@ +/*_xdb +/*.restore +/*.xrpt +/*.zip +/xst +/_ngo +/_xmsgs +/*.log +/*.stx +/*.tspec +/*.xml +/*.gyd +/*.ngr +/*.tim +/*.err +/*.lso +/*.bld +/*.cmd_log +/*.ise_ISE_Backup +/*.ipf_ISE_Backup +/*.mfd +/*.vm6 +/*.syr +/*.xst +/*.csv +/*.html +/*.jed +/*.pad +/*.ng* +/*.pnx +/*.rpt +/*.prj +/*_html +/*.cel +/_pace.ucf +/*.lock +/*.tfi +/templates diff --git a/usrp2/fpga/control_lib/.gitignore b/usrp2/fpga/control_lib/.gitignore new file mode 100644 index 000000000..025385cff --- /dev/null +++ b/usrp2/fpga/control_lib/.gitignore @@ -0,0 +1,5 @@ +/a.out +/*.vcd +/*.lxt +/*.sav +/*.log diff --git a/usrp2/fpga/coregen/.gitignore b/usrp2/fpga/coregen/.gitignore new file mode 100644 index 000000000..956cab52b --- /dev/null +++ b/usrp2/fpga/coregen/.gitignore @@ -0,0 +1,3 @@ +/xlnx_auto* +/*log +/tmp diff --git a/usrp2/fpga/eth/bench/verilog/.gitignore b/usrp2/fpga/eth/bench/verilog/.gitignore new file mode 100644 index 000000000..86fc44f92 --- /dev/null +++ b/usrp2/fpga/eth/bench/verilog/.gitignore @@ -0,0 +1,4 @@ +/a.out +/*.vcd +/*.sav +/*.lxt diff --git a/usrp2/fpga/extram/.gitignore b/usrp2/fpga/extram/.gitignore new file mode 100644 index 000000000..7fc71ccb6 --- /dev/null +++ b/usrp2/fpga/extram/.gitignore @@ -0,0 +1 @@ +/a.out diff --git a/usrp2/fpga/opencores/8b10b/.gitignore b/usrp2/fpga/opencores/8b10b/.gitignore new file mode 100644 index 000000000..548539d61 --- /dev/null +++ b/usrp2/fpga/opencores/8b10b/.gitignore @@ -0,0 +1,2 @@ +/dump.vcd +/a.out diff --git a/usrp2/fpga/opencores/aemb/CVS/.gitignore b/usrp2/fpga/opencores/aemb/CVS/.gitignore new file mode 100644 index 000000000..b693d7c72 --- /dev/null +++ b/usrp2/fpga/opencores/aemb/CVS/.gitignore @@ -0,0 +1 @@ +/Entries.Log diff --git a/usrp2/fpga/opencores/aemb/rtl/verilog/.gitignore b/usrp2/fpga/opencores/aemb/rtl/verilog/.gitignore new file mode 100644 index 000000000..6b09f5cc9 --- /dev/null +++ b/usrp2/fpga/opencores/aemb/rtl/verilog/.gitignore @@ -0,0 +1 @@ +/aeMB2* diff --git a/usrp2/fpga/opencores/aemb/sim/.gitignore b/usrp2/fpga/opencores/aemb/sim/.gitignore new file mode 100644 index 000000000..4ef5da542 --- /dev/null +++ b/usrp2/fpga/opencores/aemb/sim/.gitignore @@ -0,0 +1,4 @@ +/*.bin +/*.dump +/*.vcd +/*.rom diff --git a/usrp2/fpga/opencores/ethernet_tri_mode/.gitignore b/usrp2/fpga/opencores/ethernet_tri_mode/.gitignore new file mode 100644 index 000000000..ae1609754 --- /dev/null +++ b/usrp2/fpga/opencores/ethernet_tri_mode/.gitignore @@ -0,0 +1,2 @@ +/verilog.log +/a.out diff --git a/usrp2/fpga/sdr_lib/.gitignore b/usrp2/fpga/sdr_lib/.gitignore new file mode 100644 index 000000000..3c782d589 --- /dev/null +++ b/usrp2/fpga/sdr_lib/.gitignore @@ -0,0 +1,3 @@ +/a.out +/db +/*.vcd diff --git a/usrp2/fpga/simple_gemac/.gitignore b/usrp2/fpga/simple_gemac/.gitignore new file mode 100644 index 000000000..61e120cff --- /dev/null +++ b/usrp2/fpga/simple_gemac/.gitignore @@ -0,0 +1,3 @@ +/a.out +/*~ +/*.vcd diff --git a/usrp2/fpga/testbench/.gitignore b/usrp2/fpga/testbench/.gitignore new file mode 100644 index 000000000..eedcf9652 --- /dev/null +++ b/usrp2/fpga/testbench/.gitignore @@ -0,0 +1,5 @@ +/single_u2_sim +/dual_u2_sim +/*.lxt +/*.vcd +/*.sav diff --git a/usrp2/fpga/timing/.gitignore b/usrp2/fpga/timing/.gitignore new file mode 100644 index 000000000..515552fdb --- /dev/null +++ b/usrp2/fpga/timing/.gitignore @@ -0,0 +1,2 @@ +/a.out +/*.vcd diff --git a/usrp2/fpga/top/.gitignore b/usrp2/fpga/top/.gitignore new file mode 100644 index 000000000..bf1b77066 --- /dev/null +++ b/usrp2/fpga/top/.gitignore @@ -0,0 +1 @@ +/*.sav diff --git a/usrp2/fpga/top/eth_test/.gitignore b/usrp2/fpga/top/eth_test/.gitignore new file mode 100644 index 000000000..b30397081 --- /dev/null +++ b/usrp2/fpga/top/eth_test/.gitignore @@ -0,0 +1,43 @@ +/xst +/_ngo +/_xmsgs +/*.stx +/*.tspec +/*.xml +/*.gyd +/*.ngr +/*.tim +/*.err +/*.lso +/*.bld +/*.cmd_log +/*.ise_ISE_Backup +/*.mfd +/*.vm6 +/*.syr +/*.xst +/*.csv +/*.html +/*.jed +/*.pad +/*.ng* +/*.pnx +/*.rpt +/*.prj +/*_html +/*_log +/*.lfp +/*.bit +/*.bin +/*.vcd +/*.unroutes +/*.drc +/*_map.* +/*_guide.* +/*.twr +/*.twx +/a.out +/*.xpi +/*_pad.txt +/*.bgn +/*.par diff --git a/usrp2/fpga/top/u2_core/.gitignore b/usrp2/fpga/top/u2_core/.gitignore new file mode 100644 index 000000000..b30397081 --- /dev/null +++ b/usrp2/fpga/top/u2_core/.gitignore @@ -0,0 +1,43 @@ +/xst +/_ngo +/_xmsgs +/*.stx +/*.tspec +/*.xml +/*.gyd +/*.ngr +/*.tim +/*.err +/*.lso +/*.bld +/*.cmd_log +/*.ise_ISE_Backup +/*.mfd +/*.vm6 +/*.syr +/*.xst +/*.csv +/*.html +/*.jed +/*.pad +/*.ng* +/*.pnx +/*.rpt +/*.prj +/*_html +/*_log +/*.lfp +/*.bit +/*.bin +/*.vcd +/*.unroutes +/*.drc +/*_map.* +/*_guide.* +/*.twr +/*.twx +/a.out +/*.xpi +/*_pad.txt +/*.bgn +/*.par diff --git a/usrp2/fpga/top/u2_fpga/.gitignore b/usrp2/fpga/top/u2_fpga/.gitignore new file mode 100644 index 000000000..de5b50277 --- /dev/null +++ b/usrp2/fpga/top/u2_fpga/.gitignore @@ -0,0 +1,52 @@ +/templates +/netgen +/_ngo +/_xmsgs +/_pace.ucf +/*.cmd +/*.ibs +/*.lfp +/*.mfp +/*.bit +/*.bin +/*.stx +/*.par +/*.unroutes +/*.ntrc_log +/*.ngr +/*.mrp +/*.html +/*.lso +/*.twr +/*.bld +/*.ncd +/*.txt +/*.cmd_log +/*.drc +/*.map +/*.twr +/*.xml +/*.syr +/*.ngm +/*.xst +/*.csv +/*.html +/*.lock +/*.ncd +/*.twx +/*.ise_ISE_Backup +/*.xml +/*.ut +/*.xpi +/*.ngd +/*.ncd +/*.pad +/*.bgn +/*.ngc +/*.pcf +/*.ngd +/xst +/*.log +/*.rpt +/*.cel +/*.restore diff --git a/usrp2/fpga/top/u2_rev2/.gitignore b/usrp2/fpga/top/u2_rev2/.gitignore new file mode 100644 index 000000000..432f8fd58 --- /dev/null +++ b/usrp2/fpga/top/u2_rev2/.gitignore @@ -0,0 +1,57 @@ +/*.ptwx +/*.xrpt +/*.zip +/*_xdb +/templates +/netgen +/_ngo +/_xmsgs +/_pace.ucf +/*.cmd +/*.ibs +/*.lfp +/*.mfp +/*.bit +/*.bin +/*.stx +/*.par +/*.unroutes +/*.ntrc_log +/*.ngr +/*.mrp +/*.html +/*.lso +/*.twr +/*.bld +/*.ncd +/*.txt +/*.cmd_log +/*.drc +/*.map +/*.twr +/*.xml +/*.syr +/*.ngm +/*.xst +/*.csv +/*.html +/*.lock +/*.ncd +/*.twx +/*.ise_ISE_Backup +/*.xml +/*.ut +/*.xpi +/*.ngd +/*.ncd +/*.pad +/*.bgn +/*.ngc +/*.pcf +/*.ngd +/xst +/*.log +/*.rpt +/*.cel +/*.restore +/build diff --git a/usrp2/fpga/top/u2_rev3/.gitignore b/usrp2/fpga/top/u2_rev3/.gitignore new file mode 100644 index 000000000..432f8fd58 --- /dev/null +++ b/usrp2/fpga/top/u2_rev3/.gitignore @@ -0,0 +1,57 @@ +/*.ptwx +/*.xrpt +/*.zip +/*_xdb +/templates +/netgen +/_ngo +/_xmsgs +/_pace.ucf +/*.cmd +/*.ibs +/*.lfp +/*.mfp +/*.bit +/*.bin +/*.stx +/*.par +/*.unroutes +/*.ntrc_log +/*.ngr +/*.mrp +/*.html +/*.lso +/*.twr +/*.bld +/*.ncd +/*.txt +/*.cmd_log +/*.drc +/*.map +/*.twr +/*.xml +/*.syr +/*.ngm +/*.xst +/*.csv +/*.html +/*.lock +/*.ncd +/*.twx +/*.ise_ISE_Backup +/*.xml +/*.ut +/*.xpi +/*.ngd +/*.ncd +/*.pad +/*.bgn +/*.ngc +/*.pcf +/*.ngd +/xst +/*.log +/*.rpt +/*.cel +/*.restore +/build diff --git a/usrp2/fpga/top/u2_rev3_iad/.gitignore b/usrp2/fpga/top/u2_rev3_iad/.gitignore new file mode 100644 index 000000000..e4daaf1ea --- /dev/null +++ b/usrp2/fpga/top/u2_rev3_iad/.gitignore @@ -0,0 +1,4 @@ +/build +/*.vcd +/dsp_core_tb +/*.dat diff --git a/usrp2/host/.gitignore b/usrp2/host/.gitignore new file mode 100644 index 000000000..605b6fe86 --- /dev/null +++ b/usrp2/host/.gitignore @@ -0,0 +1,20 @@ +/configure +/Makefile.in +/config.log +/config.status +/config.guess +/stamp-h1 +/config.h +/ltmain.sh +/config.sub +/config.h.in +/libtool +/autom4te.cache +/missing +/aclocal.m4 +/Makefile +/install-sh +/depcomp +/usrp2*.tar.gz +/py-compile +/usrp2.pc diff --git a/usrp2/host/apps/.gitignore b/usrp2/host/apps/.gitignore new file mode 100644 index 000000000..4b66ac0f9 --- /dev/null +++ b/usrp2/host/apps/.gitignore @@ -0,0 +1,16 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/test_eth +/test_usrp2 +/gen_const +/find_usrps +/cerr +/*.sh +/tx_samples +/rx_streaming_samples +/u2_burn_mac_addr +/usrp2_burn_mac_addr +/test_mimo_tx +/gpio diff --git a/usrp2/host/include/.gitignore b/usrp2/host/include/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp2/host/include/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp2/host/include/usrp2/.gitignore b/usrp2/host/include/usrp2/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/usrp2/host/include/usrp2/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/usrp2/host/lib/.gitignore b/usrp2/host/lib/.gitignore new file mode 100644 index 000000000..8f5500b33 --- /dev/null +++ b/usrp2/host/lib/.gitignore @@ -0,0 +1,5 @@ +/.libs +/.deps +/Makefile +/Makefile.in +/usrp2_socket_opener |