/* -*- c++ -*- */
/*
- * Copyright 2009 Free Software Foundation, Inc.
+ * Copyright 2009,2010 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
#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);
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
// 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;