[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r11583 - in gnuradio/trunk: . config gnuradio-core/src
From: |
trondeau |
Subject: |
[Commit-gnuradio] r11583 - in gnuradio/trunk: . config gnuradio-core/src/lib/filter gnuradio-core/src/python/gnuradio/blks2impl gnuradio-core/src/python/gnuradio/gr gnuradio-examples/python gnuradio-examples/python/digital gnuradio-examples/python/pfb gr-audio-alsa gr-utils/src/python usrp/host/lib usrp2/host/include/usrp2 |
Date: |
Tue, 11 Aug 2009 21:39:03 -0600 (MDT) |
Author: trondeau
Date: 2009-08-11 21:39:03 -0600 (Tue, 11 Aug 2009)
New Revision: 11583
Added:
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h
gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
gnuradio/trunk/gnuradio-examples/python/pfb/
gnuradio/trunk/gnuradio-examples/python/pfb/Makefile.am
gnuradio/trunk/gnuradio-examples/python/pfb/channelize.py
gnuradio/trunk/gnuradio-examples/python/pfb/chirp_channelize.py
gnuradio/trunk/gnuradio-examples/python/pfb/decimate.py
gnuradio/trunk/gnuradio-examples/python/pfb/fmtest.py
gnuradio/trunk/gnuradio-examples/python/pfb/interpolate.py
Removed:
gnuradio/trunk/gnuradio-examples/python/pfb/Makefile.am
gnuradio/trunk/gnuradio-examples/python/pfb/channelize.py
gnuradio/trunk/gnuradio-examples/python/pfb/chirp_channelize.py
gnuradio/trunk/gnuradio-examples/python/pfb/decimate.py
gnuradio/trunk/gnuradio-examples/python/pfb/fmtest.py
gnuradio/trunk/gnuradio-examples/python/pfb/interpolate.py
Modified:
gnuradio/trunk/
gnuradio/trunk/config/grc_gnuradio_examples.m4
gnuradio/trunk/gnuradio-core/src/lib/filter/Makefile.am
gnuradio/trunk/gnuradio-core/src/lib/filter/filter.i
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/pubsub.py
gnuradio/trunk/gnuradio-examples/python/Makefile.am
gnuradio/trunk/gnuradio-examples/python/digital/receive_path.py
gnuradio/trunk/gnuradio-examples/python/digital/transmit_path.py
gnuradio/trunk/gr-audio-alsa/gnuradio-audio-alsa.pc.in
gnuradio/trunk/gr-utils/src/python/gr_plot_const.py
gnuradio/trunk/gr-utils/src/python/gr_plot_fft.py
gnuradio/trunk/gr-utils/src/python/gr_plot_iq.py
gnuradio/trunk/gr-utils/src/python/gr_plot_psd.py
gnuradio/trunk/gr-utils/src/python/plot_data.py
gnuradio/trunk/usrp/host/lib/gen-ratios
gnuradio/trunk/usrp2/host/include/usrp2/mimo_config.h
Log:
Merging trondeau/pfb r11249:11581 into trunk. This adds a few polyphase
filterbank implementations that do (integer) decimation, (integer)
interpolation, arbitrary resampling, and channelizing.
gnuradio-example/python/pfb includes a number of different examples of how to
use these blocks.
Property changes on: gnuradio/trunk
___________________________________________________________________
Modified: svn:mergeinfo
- /gnuradio/branches/features/msg-passing:11501-11506
+ /gnuradio/branches/developers/trondeau/pfb:11250-11581
/gnuradio/branches/features/msg-passing:11501-11506
Modified: gnuradio/trunk/config/grc_gnuradio_examples.m4
===================================================================
--- gnuradio/trunk/config/grc_gnuradio_examples.m4 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/config/grc_gnuradio_examples.m4 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -39,6 +39,7 @@
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 \
])
Modified: gnuradio/trunk/gnuradio-core/src/lib/filter/Makefile.am
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/Makefile.am 2009-08-12
03:04:23 UTC (rev 11582)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/Makefile.am 2009-08-12
03:39:03 UTC (rev 11583)
@@ -201,7 +201,11 @@
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 @@
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 @@
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
Modified: gnuradio/trunk/gnuradio-core/src/lib/filter/filter.i
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/filter.i 2009-08-12
03:04:23 UTC (rev 11582)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/filter.i 2009-08-12
03:39:03 UTC (rev 11583)
@@ -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"
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.cc
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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;
+}
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.h
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_arb_resampler_ccf.i
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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();
+};
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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;
+}
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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);
+};
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.cc
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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;
+}
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.h
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_decimator_ccf.i
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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);
+};
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.cc
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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;
+}
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.h
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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
Copied: gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/lib/filter/gr_pfb_interpolator_ccf.i
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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();
+};
Modified: gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
===================================================================
--- gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
2009-08-12 03:04:23 UTC (rev 11582)
+++ gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
2009-08-12 03:39:03 UTC (rev 11583)
@@ -47,6 +47,10 @@
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 \
Copied:
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py)
===================================================================
---
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
(rev 0)
+++
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_arb_resampler.py
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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)
+
+
+
+
Copied:
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py)
===================================================================
---
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
(rev 0)
+++
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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))
+
+
+
+
Copied:
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py)
===================================================================
--- gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
(rev 0)
+++ gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_decimator.py
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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)
Copied:
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
(from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py)
===================================================================
---
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
(rev 0)
+++
gnuradio/trunk/gnuradio-core/src/python/gnuradio/blks2impl/pfb_interpolator.py
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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)
+
+
+
+
Property changes on:
gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/pubsub.py
___________________________________________________________________
Modified: svn:mergeinfo
-
/gnuradio/branches/developers/balister/arm-configure/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11398-11413
/gnuradio/branches/developers/eb/t348/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10638-10648
/gnuradio/branches/developers/eb/t364/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11016-11017
/gnuradio/branches/developers/eb/t367/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11021-11025
/gnuradio/branches/developers/eb/t371/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10958-10971
/gnuradio/branches/developers/eb/t378/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10683-10688
/gnuradio/branches/developers/jblum/grc/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10680-10938,11187-11273,11310-11357
/gnuradio/branches/developers/jblum/vlen/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10667-10677
/gnuradio/branches/developers/jblum/wxgui/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/gpio2/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10771-10887
/gnuradio/branches/developers/jcorgan/np/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11124-11148
/gnuradio/branches/developers/jcorgan/omni/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11378-11390
/gnuradio/branches/developers/michaelld/two_mods/gr-wxgui/src/python/pubsub.py:10540-10546
/gnuradio/branches/developers/trondeau/qt/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11235-11360
/gnuradio/branches/features/msg-passing/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11501-11506
+
/gnuradio/branches/developers/balister/arm-configure/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11398-11413
/gnuradio/branches/developers/eb/t348/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10638-10648
/gnuradio/branches/developers/eb/t364/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11016-11017
/gnuradio/branches/developers/eb/t367/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11021-11025
/gnuradio/branches/developers/eb/t371/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10958-10971
/gnuradio/branches/developers/eb/t378/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10683-10688
/gnuradio/branches/developers/jblum/grc/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10680-10938,11187-11273,11310-11357
/gnuradio/branches/developers/jblum/vlen/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10667-10677
/gnuradio/branches/developers/jblum/wxgui/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/gpio2/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10771-10887
/gnuradio/branches/developers/jcorgan/np/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11124-11148
/gnuradio/branches/developers/jcorgan/omni/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gnuradio-core/src/python/gnuradio/gr/pubsub.py:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11378-11390
/gnuradio/branches/developers/michaelld/two_mods/gr-wxgui/src/python/pubsub.py:10540-10546
/gnuradio/branches/developers/trondeau/pfb/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11250-11581
/gnuradio/branches/developers/trondeau/qt/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11235-11360
/gnuradio/branches/features/msg-passing/gnuradio-core/src/python/gnuradio/gr/pubsub.py:11501-11506
Modified: gnuradio/trunk/gnuradio-examples/python/Makefile.am
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/Makefile.am 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/gnuradio-examples/python/Makefile.am 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -32,5 +32,6 @@
multi_usrp \
network \
ofdm \
+ pfb \
usrp \
usrp2
Property changes on:
gnuradio/trunk/gnuradio-examples/python/digital/receive_path.py
___________________________________________________________________
Modified: svn:mergeinfo
-
/gnuradio/branches/developers/balister/arm-configure/gnuradio-examples/python/digital/receive_path.py:11398-11413
/gnuradio/branches/developers/eb/t348/gnuradio-examples/python/digital/receive_path_lb.py:10638-10648
/gnuradio/branches/developers/eb/t364/gnuradio-examples/python/digital/receive_path_lb.py:11016-11017
/gnuradio/branches/developers/eb/t367/gnuradio-examples/python/digital/receive_path_lb.py:11021-11025
/gnuradio/branches/developers/eb/t371/gnuradio-examples/python/digital/receive_path_lb.py:10958-10971
/gnuradio/branches/developers/eb/t378/gnuradio-examples/python/digital/receive_path_lb.py:10683-10688
/gnuradio/branches/developers/jblum/digital/receive_path.py:11402-11405
/gnuradio/branches/developers/jblum/digital/receive_path_lb.py:10901-10941
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/receive_path.py:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/receive_path_lb.py:10680-10938
/gnuradio/branches/developers/jblum/gui_guts/gnuradio-examples/python/digital/receive_path_lb.py:10464-10658
/gnuradio/branches/developers/jblum/vlen/gnuradio-examples/python/digital/receive_path_lb.py:10667-10677
/gnuradio/branches/developers/jblum/wxgui/gnuradio-examples/python/digital/receive_path_lb.py:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/gnuradio-examples/python/digital/receive_path_lb.py:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gnuradio-examples/python/digital/receive_path_lb.py:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/gnuradio-examples/python/digital/receive_path_lb.py:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/gnuradio-examples/python/digital/receive_path_lb.py:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gnuradio-examples/python/digital/receive_path_lb.py:10771-10887
/gnuradio/branches/developers/jcorgan/np/gnuradio-examples/python/digital/receive_path_lb.py:11124-11148
/gnuradio/branches/developers/jcorgan/omni/gnuradio-examples/python/digital/receive_path.py:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gnuradio-examples/python/digital/receive_path.py:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gnuradio-examples/python/digital/receive_path.py:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gnuradio-examples/python/digital/receive_path_lb.py:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gnuradio-examples/python/digital/receive_path.py:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/gnuradio-examples/python/digital/receive_path_lb.py:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/gnuradio-examples/python/digital/receive_path_lb.py:10540-10546
/gnuradio/branches/developers/trondeau/qt/gnuradio-examples/python/digital/receive_path.py:11235-11360
/gnuradio/branches/developers/trondeau/qtdigital/gnuradio-examples/python/digital/receive_path.py:11210-11215
/gnuradio/branches/features/msg-passing/gnuradio-examples/python/digital/receive_path.py:11501-11506
+
/gnuradio/branches/developers/balister/arm-configure/gnuradio-examples/python/digital/receive_path.py:11398-11413
/gnuradio/branches/developers/eb/t348/gnuradio-examples/python/digital/receive_path_lb.py:10638-10648
/gnuradio/branches/developers/eb/t364/gnuradio-examples/python/digital/receive_path_lb.py:11016-11017
/gnuradio/branches/developers/eb/t367/gnuradio-examples/python/digital/receive_path_lb.py:11021-11025
/gnuradio/branches/developers/eb/t371/gnuradio-examples/python/digital/receive_path_lb.py:10958-10971
/gnuradio/branches/developers/eb/t378/gnuradio-examples/python/digital/receive_path_lb.py:10683-10688
/gnuradio/branches/developers/jblum/digital/receive_path.py:11402-11405
/gnuradio/branches/developers/jblum/digital/receive_path_lb.py:10901-10941
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/receive_path.py:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/receive_path_lb.py:10680-10938
/gnuradio/branches/developers/jblum/gui_guts/gnuradio-examples/python/digital/receive_path_lb.py:10464-10658
/gnuradio/branches/developers/jblum/vlen/gnuradio-examples/python/digital/receive_path_lb.py:10667-10677
/gnuradio/branches/developers/jblum/wxgui/gnuradio-examples/python/digital/receive_path_lb.py:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/gnuradio-examples/python/digital/receive_path_lb.py:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gnuradio-examples/python/digital/receive_path_lb.py:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/gnuradio-examples/python/digital/receive_path_lb.py:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/gnuradio-examples/python/digital/receive_path_lb.py:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gnuradio-examples/python/digital/receive_path_lb.py:10771-10887
/gnuradio/branches/developers/jcorgan/np/gnuradio-examples/python/digital/receive_path_lb.py:11124-11148
/gnuradio/branches/developers/jcorgan/omni/gnuradio-examples/python/digital/receive_path.py:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gnuradio-examples/python/digital/receive_path.py:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gnuradio-examples/python/digital/receive_path.py:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gnuradio-examples/python/digital/receive_path_lb.py:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gnuradio-examples/python/digital/receive_path.py:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/gnuradio-examples/python/digital/receive_path_lb.py:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/gnuradio-examples/python/digital/receive_path_lb.py:10540-10546
/gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/digital/receive_path.py:11250-11581
/gnuradio/branches/developers/trondeau/qt/gnuradio-examples/python/digital/receive_path.py:11235-11360
/gnuradio/branches/developers/trondeau/qtdigital/gnuradio-examples/python/digital/receive_path.py:11210-11215
/gnuradio/branches/features/msg-passing/gnuradio-examples/python/digital/receive_path.py:11501-11506
Property changes on:
gnuradio/trunk/gnuradio-examples/python/digital/transmit_path.py
___________________________________________________________________
Modified: svn:mergeinfo
-
/gnuradio/branches/developers/balister/arm-configure/gnuradio-examples/python/digital/transmit_path.py:11398-11413
/gnuradio/branches/developers/eb/t348/gnuradio-examples/python/digital/transmit_path_lb.py:10638-10648
/gnuradio/branches/developers/eb/t364/gnuradio-examples/python/digital/transmit_path_lb.py:11016-11017
/gnuradio/branches/developers/eb/t367/gnuradio-examples/python/digital/transmit_path_lb.py:11021-11025
/gnuradio/branches/developers/eb/t371/gnuradio-examples/python/digital/transmit_path_lb.py:10958-10971
/gnuradio/branches/developers/eb/t378/gnuradio-examples/python/digital/transmit_path_lb.py:10683-10688
/gnuradio/branches/developers/jblum/digital/transmit_path.py:11402-11405
/gnuradio/branches/developers/jblum/digital/transmit_path_lb.py:10901-10941
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/transmit_path.py:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/transmit_path_lb.py:10680-10938
/gnuradio/branches/developers/jblum/gui_guts/gnuradio-examples/python/digital/transmit_path_lb.py:10464-10658
/gnuradio/branches/developers/jblum/vlen/gnuradio-examples/python/digital/transmit_path_lb.py:10667-10677
/gnuradio/branches/developers/jblum/wxgui/gnuradio-examples/python/digital/transmit_path_lb.py:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/gnuradio-examples/python/digital/transmit_path_lb.py:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gnuradio-examples/python/digital/transmit_path_lb.py:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/gnuradio-examples/python/digital/transmit_path_lb.py:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/gnuradio-examples/python/digital/transmit_path_lb.py:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gnuradio-examples/python/digital/transmit_path_lb.py:10771-10887
/gnuradio/branches/developers/jcorgan/np/gnuradio-examples/python/digital/transmit_path_lb.py:11124-11148
/gnuradio/branches/developers/jcorgan/omni/gnuradio-examples/python/digital/transmit_path.py:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gnuradio-examples/python/digital/transmit_path.py:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gnuradio-examples/python/digital/transmit_path.py:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gnuradio-examples/python/digital/transmit_path_lb.py:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gnuradio-examples/python/digital/transmit_path.py:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/gnuradio-examples/python/digital/transmit_path_lb.py:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/gnuradio-examples/python/digital/transmit_path_lb.py:10540-10546
/gnuradio/branches/developers/trondeau/qt/gnuradio-examples/python/digital/transmit_path.py:11235-11360
/gnuradio/branches/developers/trondeau/qtdigital/gnuradio-examples/python/digital/transmit_path.py:11210-11215
/gnuradio/branches/features/msg-passing/gnuradio-examples/python/digital/transmit_path.py:11501-11506
+
/gnuradio/branches/developers/balister/arm-configure/gnuradio-examples/python/digital/transmit_path.py:11398-11413
/gnuradio/branches/developers/eb/t348/gnuradio-examples/python/digital/transmit_path_lb.py:10638-10648
/gnuradio/branches/developers/eb/t364/gnuradio-examples/python/digital/transmit_path_lb.py:11016-11017
/gnuradio/branches/developers/eb/t367/gnuradio-examples/python/digital/transmit_path_lb.py:11021-11025
/gnuradio/branches/developers/eb/t371/gnuradio-examples/python/digital/transmit_path_lb.py:10958-10971
/gnuradio/branches/developers/eb/t378/gnuradio-examples/python/digital/transmit_path_lb.py:10683-10688
/gnuradio/branches/developers/jblum/digital/transmit_path.py:11402-11405
/gnuradio/branches/developers/jblum/digital/transmit_path_lb.py:10901-10941
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/transmit_path.py:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/grc/gnuradio-examples/python/digital/transmit_path_lb.py:10680-10938
/gnuradio/branches/developers/jblum/gui_guts/gnuradio-examples/python/digital/transmit_path_lb.py:10464-10658
/gnuradio/branches/developers/jblum/vlen/gnuradio-examples/python/digital/transmit_path_lb.py:10667-10677
/gnuradio/branches/developers/jblum/wxgui/gnuradio-examples/python/digital/transmit_path_lb.py:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/gnuradio-examples/python/digital/transmit_path_lb.py:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gnuradio-examples/python/digital/transmit_path_lb.py:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/gnuradio-examples/python/digital/transmit_path_lb.py:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/gnuradio-examples/python/digital/transmit_path_lb.py:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gnuradio-examples/python/digital/transmit_path_lb.py:10771-10887
/gnuradio/branches/developers/jcorgan/np/gnuradio-examples/python/digital/transmit_path_lb.py:11124-11148
/gnuradio/branches/developers/jcorgan/omni/gnuradio-examples/python/digital/transmit_path.py:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gnuradio-examples/python/digital/transmit_path.py:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gnuradio-examples/python/digital/transmit_path.py:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gnuradio-examples/python/digital/transmit_path_lb.py:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gnuradio-examples/python/digital/transmit_path.py:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/gnuradio-examples/python/digital/transmit_path_lb.py:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/gnuradio-examples/python/digital/transmit_path_lb.py:10540-10546
/gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/digital/transmit_path.py:11250-11581
/gnuradio/branches/developers/trondeau/qt/gnuradio-examples/python/digital/transmit_path.py:11235-11360
/gnuradio/branches/developers/trondeau/qtdigital/gnuradio-examples/python/digital/transmit_path.py:11210-11215
/gnuradio/branches/features/msg-passing/gnuradio-examples/python/digital/transmit_path.py:11501-11506
Copied: gnuradio/trunk/gnuradio-examples/python/pfb/Makefile.am (from rev
11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/pfb/Makefile.am)
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/pfb/Makefile.am
(rev 0)
+++ gnuradio/trunk/gnuradio-examples/python/pfb/Makefile.am 2009-08-12
03:39:03 UTC (rev 11583)
@@ -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
Copied: gnuradio/trunk/gnuradio-examples/python/pfb/channelize.py (from rev
11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/pfb/channelize.py)
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/pfb/channelize.py
(rev 0)
+++ gnuradio/trunk/gnuradio-examples/python/pfb/channelize.py 2009-08-12
03:39:03 UTC (rev 11583)
@@ -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
+
Copied: gnuradio/trunk/gnuradio-examples/python/pfb/chirp_channelize.py (from
rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/pfb/chirp_channelize.py)
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/pfb/chirp_channelize.py
(rev 0)
+++ gnuradio/trunk/gnuradio-examples/python/pfb/chirp_channelize.py
2009-08-12 03:39:03 UTC (rev 11583)
@@ -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
+
Copied: gnuradio/trunk/gnuradio-examples/python/pfb/decimate.py (from rev
11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/pfb/decimate.py)
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/pfb/decimate.py
(rev 0)
+++ gnuradio/trunk/gnuradio-examples/python/pfb/decimate.py 2009-08-12
03:39:03 UTC (rev 11583)
@@ -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
+
Copied: gnuradio/trunk/gnuradio-examples/python/pfb/fmtest.py (from rev 11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/pfb/fmtest.py)
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/pfb/fmtest.py
(rev 0)
+++ gnuradio/trunk/gnuradio-examples/python/pfb/fmtest.py 2009-08-12
03:39:03 UTC (rev 11583)
@@ -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()
Copied: gnuradio/trunk/gnuradio-examples/python/pfb/interpolate.py (from rev
11581,
gnuradio/branches/developers/trondeau/pfb/gnuradio-examples/python/pfb/interpolate.py)
===================================================================
--- gnuradio/trunk/gnuradio-examples/python/pfb/interpolate.py
(rev 0)
+++ gnuradio/trunk/gnuradio-examples/python/pfb/interpolate.py 2009-08-12
03:39:03 UTC (rev 11583)
@@ -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
+
Property changes on: gnuradio/trunk/gr-audio-alsa/gnuradio-audio-alsa.pc.in
___________________________________________________________________
Modified: svn:mergeinfo
-
/gnuradio/branches/developers/balister/arm-configure/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11398-11413
/gnuradio/branches/developers/eb/t348/gr-audio-alsa/gr-audio-alsa.pc.in:10638-10648
/gnuradio/branches/developers/eb/t364/gr-audio-alsa/gr-audio-alsa.pc.in:11016-11017
/gnuradio/branches/developers/eb/t367/gr-audio-alsa/gr-audio-alsa.pc.in:11021-11025
/gnuradio/branches/developers/eb/t371/gr-audio-alsa/gr-audio-alsa.pc.in:10958-10971
/gnuradio/branches/developers/eb/t378/gr-audio-alsa/gr-audio-alsa.pc.in:10683-10688
/gnuradio/branches/developers/jblum/grc/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/grc/gr-audio-alsa/gr-audio-alsa.pc.in:10680-10938
/gnuradio/branches/developers/jblum/gui_guts/gr-audio-alsa/gr-audio-alsa.pc.in:10464-10658
/gnuradio/branches/developers/jblum/vlen/gr-audio-alsa/gr-audio-alsa.pc.in:10667-10677
/gnuradio/branches/developers/jcorgan/cpphier/gr-audio-alsa/gr-audio-alsa.pc.in:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gr-audio-alsa/gr-audio-alsa.pc.in:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/gr-audio-alsa/gr-audio-alsa.pc.in:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/gr-audio-alsa/gr-audio-alsa.pc.in:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gr-audio-alsa/gr-audio-alsa.pc.in:10771-10887
/gnuradio/branches/developers/jcorgan/omni/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gr-audio-alsa/gr-audio-alsa.pc.in:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/gr-audio-alsa/gr-audio-alsa.pc.in:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/gr-audio-alsa/gr-audio-alsa.pc.in:10540-10546
/gnuradio/branches/developers/trondeau/qt/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11235-11360
/gnuradio/branches/features/msg-passing/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11501-11506
+
/gnuradio/branches/developers/balister/arm-configure/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11398-11413
/gnuradio/branches/developers/eb/t348/gr-audio-alsa/gr-audio-alsa.pc.in:10638-10648
/gnuradio/branches/developers/eb/t364/gr-audio-alsa/gr-audio-alsa.pc.in:11016-11017
/gnuradio/branches/developers/eb/t367/gr-audio-alsa/gr-audio-alsa.pc.in:11021-11025
/gnuradio/branches/developers/eb/t371/gr-audio-alsa/gr-audio-alsa.pc.in:10958-10971
/gnuradio/branches/developers/eb/t378/gr-audio-alsa/gr-audio-alsa.pc.in:10683-10688
/gnuradio/branches/developers/jblum/grc/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/grc/gr-audio-alsa/gr-audio-alsa.pc.in:10680-10938
/gnuradio/branches/developers/jblum/gui_guts/gr-audio-alsa/gr-audio-alsa.pc.in:10464-10658
/gnuradio/branches/developers/jblum/vlen/gr-audio-alsa/gr-audio-alsa.pc.in:10667-10677
/gnuradio/branches/developers/jcorgan/cpphier/gr-audio-alsa/gr-audio-alsa.pc.in:10818-10858
/gnuradio/branches/developers/jcorgan/deb/gr-audio-alsa/gr-audio-alsa.pc.in:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/gr-audio-alsa/gr-audio-alsa.pc.in:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/gr-audio-alsa/gr-audio-alsa.pc.in:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/gr-audio-alsa/gr-audio-alsa.pc.in:10771-10887
/gnuradio/branches/developers/jcorgan/omni/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11453-11459
/gnuradio/branches/developers/jcorgan/t161/gr-audio-alsa/gr-audio-alsa.pc.in:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/gr-audio-alsa/gr-audio-alsa.pc.in:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/gr-audio-alsa/gr-audio-alsa.pc.in:10540-10546
/gnuradio/branches/developers/trondeau/pfb/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11250-11581
/gnuradio/branches/developers/trondeau/qt/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11235-11360
/gnuradio/branches/features/msg-passing/gr-audio-alsa/gnuradio-audio-alsa.pc.in:11501-11506
Modified: gnuradio/trunk/gr-utils/src/python/gr_plot_const.py
===================================================================
--- gnuradio/trunk/gr-utils/src/python/gr_plot_const.py 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/gr-utils/src/python/gr_plot_const.py 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -35,9 +35,6 @@
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 @@
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]))]
Modified: gnuradio/trunk/gr-utils/src/python/gr_plot_fft.py
===================================================================
--- gnuradio/trunk/gr-utils/src/python/gr_plot_fft.py 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/gr-utils/src/python/gr_plot_fft.py 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -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 @@
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))
Modified: gnuradio/trunk/gr-utils/src/python/gr_plot_iq.py
===================================================================
--- gnuradio/trunk/gr-utils/src/python/gr_plot_iq.py 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/gr-utils/src/python/gr_plot_iq.py 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -34,10 +34,7 @@
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 @@
raise SystemExit, 1
filename = args[0]
- dc = draw_fft(filename, options)
+ dc = draw_iq(filename, options)
if __name__ == "__main__":
try:
Modified: gnuradio/trunk/gr-utils/src/python/gr_plot_psd.py
===================================================================
--- gnuradio/trunk/gr-utils/src/python/gr_plot_psd.py 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/gr-utils/src/python/gr_plot_psd.py 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -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 @@
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))
Modified: gnuradio/trunk/gr-utils/src/python/plot_data.py
===================================================================
--- gnuradio/trunk/gr-utils/src/python/plot_data.py 2009-08-12 03:04:23 UTC
(rev 11582)
+++ gnuradio/trunk/gr-utils/src/python/plot_data.py 2009-08-12 03:39:03 UTC
(rev 11583)
@@ -33,9 +33,6 @@
from optparse import OptionParser
-matplotlib.interactive(True)
-matplotlib.use('TkAgg')
-
class plot_data:
def __init__(self, datatype, filenames, options):
self.hfile = list()
Property changes on: gnuradio/trunk/usrp/host/lib/gen-ratios
___________________________________________________________________
Modified: svn:mergeinfo
-
/gnuradio/branches/developers/balister/arm-configure/usrp/host/lib/gen-ratios:11398-11413
/gnuradio/branches/developers/eb/t348/usrp/host/lib/gen-ratios:10638-10648
/gnuradio/branches/developers/eb/t364/usrp/host/lib/gen-ratios:11016-11017
/gnuradio/branches/developers/eb/t367/usrp/host/lib/gen-ratios:11021-11025
/gnuradio/branches/developers/eb/t371/usrp/host/lib/gen-ratios:10958-10971
/gnuradio/branches/developers/eb/t378/usrp/host/lib/gen-ratios:10683-10688
/gnuradio/branches/developers/jblum/grc/usrp/host/lib/gen-ratios:10680-10938,11187-11273,11310-11357
/gnuradio/branches/developers/jblum/gui_guts/usrp/host/lib/gen-ratios:10464-10658
/gnuradio/branches/developers/jblum/vlen/usrp/host/lib/gen-ratios:10667-10677
/gnuradio/branches/developers/jblum/wxgui/usrp/host/lib/gen-ratios:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/usrp/host/lib/gen-ratios:10818-10858
/gnuradio/branches/developers/jcorgan/deb/usrp/host/lib/gen-ratios:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/usrp/host/lib/gen-ratios:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/usrp/host/lib/gen-ratios:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/usrp/host/lib/gen-ratios:10771-10887
/gnuradio/branches/developers/jcorgan/np/usrp/host/lib/gen-ratios:11124-11148
/gnuradio/branches/developers/jcorgan/omni/usrp/host/lib/gen-ratios:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/usrp/host/lib/gen-ratios:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/usrp/host/lib/gen-ratios:11453-11459
/gnuradio/branches/developers/jcorgan/t161/usrp/host/lib/gen-ratios:10876-10880
/gnuradio/branches/developers/michaelld/am_swig_4/usrp/host/lib/gen-ratios:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/usrp/host/lib/gen-ratios:10540-10546
/gnuradio/branches/developers/trondeau/qt/usrp/host/lib/gen-ratios:11235-11360
/gnuradio/branches/features/msg-passing/usrp/host/lib/gen-ratios:11501-11506
+
/gnuradio/branches/developers/balister/arm-configure/usrp/host/lib/gen-ratios:11398-11413
/gnuradio/branches/developers/eb/t348/usrp/host/lib/gen-ratios:10638-10648
/gnuradio/branches/developers/eb/t364/usrp/host/lib/gen-ratios:11016-11017
/gnuradio/branches/developers/eb/t367/usrp/host/lib/gen-ratios:11021-11025
/gnuradio/branches/developers/eb/t371/usrp/host/lib/gen-ratios:10958-10971
/gnuradio/branches/developers/eb/t378/usrp/host/lib/gen-ratios:10683-10688
/gnuradio/branches/developers/jblum/grc/usrp/host/lib/gen-ratios:10680-10938,11187-11273,11310-11357
/gnuradio/branches/developers/jblum/gui_guts/usrp/host/lib/gen-ratios:10464-10658
/gnuradio/branches/developers/jblum/vlen/usrp/host/lib/gen-ratios:10667-10677
/gnuradio/branches/developers/jblum/wxgui/usrp/host/lib/gen-ratios:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/usrp/host/lib/gen-ratios:10818-10858
/gnuradio/branches/developers/jcorgan/deb/usrp/host/lib/gen-ratios:10949-10959,11013-11022,11046-11059,11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/usrp/host/lib/gen-ratios:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/usrp/host/lib/gen-ratios:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/usrp/host/lib/gen-ratios:10771-10887
/gnuradio/branches/developers/jcorgan/np/usrp/host/lib/gen-ratios:11124-11148
/gnuradio/branches/developers/jcorgan/omni/usrp/host/lib/gen-ratios:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/usrp/host/lib/gen-ratios:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/usrp/host/lib/gen-ratios:11453-11459
/gnuradio/branches/developers/jcorgan/t161/usrp/host/lib/gen-ratios:10876-10880
/gnuradio/branches/developers/michaelld/am_swig_4/usrp/host/lib/gen-ratios:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/usrp/host/lib/gen-ratios:10540-10546
/gnuradio/branches/developers/trondeau/pfb/usrp/host/lib/gen-ratios:11250-11581
/gnuradio/branches/developers/trondeau/qt/usrp/host/lib/gen-ratios:11235-11360
/gnuradio/branches/features/msg-passing/usrp/host/lib/gen-ratios:11501-11506
Property changes on: gnuradio/trunk/usrp2/host/include/usrp2/mimo_config.h
___________________________________________________________________
Modified: svn:mergeinfo
-
/gnuradio/branches/developers/balister/arm-configure/usrp2/host/include/usrp2/mimo_config.h:11398-11413
/gnuradio/branches/developers/eb/t348/usrp2/firmware/include/usrp2_mimo_config.h:10638-10648
/gnuradio/branches/developers/eb/t364/usrp2/firmware/include/usrp2_mimo_config.h:11016-11017
/gnuradio/branches/developers/eb/t367/usrp2/firmware/include/usrp2_mimo_config.h:11021-11025
/gnuradio/branches/developers/eb/t371/usrp2/firmware/include/usrp2_mimo_config.h:10958-10971
/gnuradio/branches/developers/eb/t378/usrp2/firmware/include/usrp2_mimo_config.h:10683-10688
/gnuradio/branches/developers/jblum/grc/usrp2/firmware/include/usrp2_mimo_config.h:10680-10938
/gnuradio/branches/developers/jblum/grc/usrp2/host/include/usrp2/mimo_config.h:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/gui_guts/usrp2/firmware/include/usrp2_mimo_config.h:10464-10658
/gnuradio/branches/developers/jblum/vlen/usrp2/firmware/include/usrp2_mimo_config.h:10667-10677
/gnuradio/branches/developers/jblum/wxgui/usrp2/host/include/usrp2/mimo_config.h:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/usrp2/firmware/include/usrp2_mimo_config.h:10818-10858
/gnuradio/branches/developers/jcorgan/deb/usrp2/firmware/include/usrp2_mimo_config.h:10949-10959,11013-11022
/gnuradio/branches/developers/jcorgan/deb/usrp2/host/include/usrp2/mimo_config.h:11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/usrp2/firmware/include/usrp2_mimo_config.h:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/usrp2/firmware/include/usrp2_mimo_config.h:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/usrp2/firmware/include/usrp2_mimo_config.h:10771-10887
/gnuradio/branches/developers/jcorgan/np/usrp2/host/include/usrp2/mimo_config.h:11124-11148
/gnuradio/branches/developers/jcorgan/omni/usrp2/host/include/usrp2/mimo_config.h:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/usrp2/host/include/usrp2/mimo_config.h:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/usrp2/host/include/usrp2/mimo_config.h:11453-11459
/gnuradio/branches/developers/jcorgan/t161/usrp2/firmware/include/usrp2_mimo_config.h:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/usrp2/host/include/usrp2/mimo_config.h:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/usrp2/firmware/include/usrp2_mimo_config.h:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/usrp2/firmware/include/usrp2_mimo_config.h:10540-10546
/gnuradio/branches/developers/trondeau/qt/usrp2/host/include/usrp2/mimo_config.h:11235-11360
/gnuradio/branches/features/msg-passing/usrp2/host/include/usrp2/mimo_config.h:11501-11506
+
/gnuradio/branches/developers/balister/arm-configure/usrp2/host/include/usrp2/mimo_config.h:11398-11413
/gnuradio/branches/developers/eb/t348/usrp2/firmware/include/usrp2_mimo_config.h:10638-10648
/gnuradio/branches/developers/eb/t364/usrp2/firmware/include/usrp2_mimo_config.h:11016-11017
/gnuradio/branches/developers/eb/t367/usrp2/firmware/include/usrp2_mimo_config.h:11021-11025
/gnuradio/branches/developers/eb/t371/usrp2/firmware/include/usrp2_mimo_config.h:10958-10971
/gnuradio/branches/developers/eb/t378/usrp2/firmware/include/usrp2_mimo_config.h:10683-10688
/gnuradio/branches/developers/jblum/grc/usrp2/firmware/include/usrp2_mimo_config.h:10680-10938
/gnuradio/branches/developers/jblum/grc/usrp2/host/include/usrp2/mimo_config.h:11187-11273,11310-11357
/gnuradio/branches/developers/jblum/gui_guts/usrp2/firmware/include/usrp2_mimo_config.h:10464-10658
/gnuradio/branches/developers/jblum/vlen/usrp2/firmware/include/usrp2_mimo_config.h:10667-10677
/gnuradio/branches/developers/jblum/wxgui/usrp2/host/include/usrp2/mimo_config.h:11125-11183
/gnuradio/branches/developers/jcorgan/cpphier/usrp2/firmware/include/usrp2_mimo_config.h:10818-10858
/gnuradio/branches/developers/jcorgan/deb/usrp2/firmware/include/usrp2_mimo_config.h:10949-10959,11013-11022
/gnuradio/branches/developers/jcorgan/deb/usrp2/host/include/usrp2/mimo_config.h:11075-11077
/gnuradio/branches/developers/jcorgan/fw-optimize/usrp2/firmware/include/usrp2_mimo_config.h:10428-10429
/gnuradio/branches/developers/jcorgan/gpio2/usrp2/firmware/include/usrp2_mimo_config.h:10713-10765
/gnuradio/branches/developers/jcorgan/iad2/usrp2/firmware/include/usrp2_mimo_config.h:10771-10887
/gnuradio/branches/developers/jcorgan/np/usrp2/host/include/usrp2/mimo_config.h:11124-11148
/gnuradio/branches/developers/jcorgan/omni/usrp2/host/include/usrp2/mimo_config.h:11463-11485
/gnuradio/branches/developers/jcorgan/pmt/usrp2/host/include/usrp2/mimo_config.h:11492-11494
/gnuradio/branches/developers/jcorgan/pmt-gruel/usrp2/host/include/usrp2/mimo_config.h:11453-11459
/gnuradio/branches/developers/jcorgan/t161/usrp2/firmware/include/usrp2_mimo_config.h:10876-10880
/gnuradio/branches/developers/jcorgan/usrp-headers/usrp2/host/include/usrp2/mimo_config.h:11378-11390
/gnuradio/branches/developers/michaelld/am_swig_4/usrp2/firmware/include/usrp2_mimo_config.h:10555-10595
/gnuradio/branches/developers/michaelld/two_mods/usrp2/firmware/include/usrp2_mimo_config.h:10540-10546
/gnuradio/branches/developers/trondeau/pfb/usrp2/host/include/usrp2/mimo_config.h:11250-11581
/gnuradio/branches/developers/trondeau/qt/usrp2/host/include/usrp2/mimo_config.h:11235-11360
/gnuradio/branches/features/msg-passing/usrp2/host/include/usrp2/mimo_config.h:11501-11506
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r11583 - in gnuradio/trunk: . config gnuradio-core/src/lib/filter gnuradio-core/src/python/gnuradio/blks2impl gnuradio-core/src/python/gnuradio/gr gnuradio-examples/python gnuradio-examples/python/digital gnuradio-examples/python/pfb gr-audio-alsa gr-utils/src/python usrp/host/lib usrp2/host/include/usrp2,
trondeau <=