summaryrefslogtreecommitdiff
path: root/gnuradio-core
diff options
context:
space:
mode:
authorTom Rondeau2010-04-07 18:25:46 -0400
committerTom Rondeau2010-04-07 18:25:46 -0400
commite06d290279803c47bff2331859d6ad4e68236a13 (patch)
treee2f04667ed284eb4f50c8c18402e44ed4d9a89ad /gnuradio-core
parent1ae689ff9238dcffbf65881b8ca03aa8df3844aa (diff)
downloadgnuradio-e06d290279803c47bff2331859d6ad4e68236a13.tar.gz
gnuradio-e06d290279803c47bff2331859d6ad4e68236a13.tar.bz2
gnuradio-e06d290279803c47bff2331859d6ad4e68236a13.zip
Opening up channelizer to have different sampling rates out. This first pass produces the correct output for oversampling_rate = 1.
Diffstat (limited to 'gnuradio-core')
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc51
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h12
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i8
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py8
4 files changed, 62 insertions, 17 deletions
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
index 7e34551c8..4ba073efd 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2009 Free Software Foundation, Inc.
+ * Copyright 2009,2010 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -33,18 +33,21 @@
#include <cstring>
gr_pfb_channelizer_ccf_sptr gr_make_pfb_channelizer_ccf (unsigned int numchans,
- const std::vector<float> &taps)
+ const std::vector<float> &taps,
+ float oversample_rate)
{
- return gr_pfb_channelizer_ccf_sptr (new gr_pfb_channelizer_ccf (numchans, taps));
+ return gr_pfb_channelizer_ccf_sptr (new gr_pfb_channelizer_ccf (numchans, taps,
+ oversample_rate));
}
gr_pfb_channelizer_ccf::gr_pfb_channelizer_ccf (unsigned int numchans,
- const std::vector<float> &taps)
+ const std::vector<float> &taps,
+ float oversample_rate)
: 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_updated (false), d_oversample_rate(oversample_rate)
{
d_numchans = numchans;
d_filters = std::vector<gr_fir_ccf*>(d_numchans);
@@ -133,7 +136,39 @@ gr_pfb_channelizer_ccf::work (int noutput_items,
return 0; // history requirements may have changed.
}
- for(int i = 0; i < noutput_items; i++) {
+ int M = d_oversample_rate;
+ int N = d_numchans;
+ int r = N / M;
+
+ int n=0, i=0, j=0;
+
+ printf("\nnoutput_items = %d\n", noutput_items);
+ printf("N = %d M = %d r = %d\n", N, M, r);
+
+ //for(int n = 1; n < noutput_items; n++) {
+ while(n < noutput_items) {
+ j = 0;
+ i = (i + r - 1) % N;
+ //printf("i = %d i >= 0 n = %d\n", i, n);
+ while(i >= 0) {
+ in = (gr_complex*)input_items[j];
+ d_fft->get_inbuf()[i] = d_filters[i]->filter(&in[n]);
+ j++;
+ i--;
+ }
+
+ i = N;
+ //printf("i = %d r = %d i >= r\n", i, r);
+ while(i > r) {
+ i--;
+ in = (gr_complex*)input_items[j];
+ d_fft->get_inbuf()[i] = d_filters[i]->filter(&in[n-1]);
+ j++;
+ }
+
+ n += (i+r) >= N;
+
+ /*
// 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
@@ -142,10 +177,12 @@ gr_pfb_channelizer_ccf::work (int noutput_items,
// 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));
+ memcpy(&out[d_numchans*n], d_fft->get_outbuf(), d_numchans*sizeof(gr_complex));
+ //memcpy(&out[d_numchans*i], d_fft->get_outbuf(), d_numchans*sizeof(gr_complex));
}
return noutput_items;
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
index b2e67e817..c73300459 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2009 Free Software Foundation, Inc.
+ * Copyright 2009,2010 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -29,7 +29,8 @@
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);
+ const std::vector<float> &taps,
+ float oversample_rate=1);
class gr_fir_ccf;
class gri_fft_complex;
@@ -105,7 +106,8 @@ class gr_pfb_channelizer_ccf : public gr_sync_block
* \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);
+ const std::vector<float> &taps,
+ float oversample_rate);
std::vector<gr_fir_ccf*> d_filters;
std::vector< std::vector<float> > d_taps;
@@ -113,6 +115,7 @@ class gr_pfb_channelizer_ccf : public gr_sync_block
unsigned int d_numchans;
unsigned int d_taps_per_filter;
bool d_updated;
+ float d_oversample_rate;
/*!
* Build the polyphase filterbank decimator.
@@ -120,7 +123,8 @@ class gr_pfb_channelizer_ccf : public gr_sync_block
* \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);
+ const std::vector<float> &taps,
+ float oversample_rate);
public:
~gr_pfb_channelizer_ccf ();
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
index 4bef90e22..d9c4581a2 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
+++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.i
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2009 Free Software Foundation, Inc.
+ * Copyright 2009,2010 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,13 +23,15 @@
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);
+ const std::vector<float> &taps,
+ float oversample_rate=1);
class gr_pfb_channelizer_ccf : public gr_sync_block
{
private:
gr_pfb_channelizer_ccf (unsigned int numchans,
- const std::vector<float> &taps);
+ const std::vector<float> &taps,
+ float oversample_rate);
public:
~gr_pfb_channelizer_ccf ();
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
index c45ae4d1a..a479ed48e 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pfb_channelizer.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2009 Free Software Foundation, Inc.
+# Copyright 2009,2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -29,16 +29,18 @@ class pfb_channelizer_ccf(gr.hier_block2):
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):
+ def __init__(self, numchans, taps, oversample_rate=1):
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._oversample_rate = oversample_rate
self.s2ss = gr.stream_to_streams(gr.sizeof_gr_complex, self._numchans)
- self.pfb = gr.pfb_channelizer_ccf(self._numchans, self._taps)
+ self.pfb = gr.pfb_channelizer_ccf(self._numchans, self._taps,
+ self._oversample_rate)
self.v2s = gr.vector_to_streams(gr.sizeof_gr_complex, self._numchans)
self.connect(self, self.s2ss)