diff options
author | Tom Rondeau | 2012-01-01 10:59:20 -0500 |
---|---|---|
committer | Tom Rondeau | 2012-01-02 11:32:03 -0500 |
commit | cece444e4de92535a53152fd090e9fa33f60b692 (patch) | |
tree | 8740f91dd179ff79382121c7834a04ef68674d58 /gnuradio-core/src | |
parent | 8bbb1388a1fd3519abe37514fceafaaf62844739 (diff) | |
download | gnuradio-cece444e4de92535a53152fd090e9fa33f60b692.tar.gz gnuradio-cece444e4de92535a53152fd090e9fa33f60b692.tar.bz2 gnuradio-cece444e4de92535a53152fd090e9fa33f60b692.zip |
pfb: bug fix for ccf version of the PFB clock sync to handle the d_osps parameter better.
The block now holds state between calls to work for the number of output symbols instead of requiring a certain number of available outputs (that may never be satisfied).
This commit also changes the number of samples needed in the QA code for the constellation receiver for a faster test.
Diffstat (limited to 'gnuradio-core/src')
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc | 23 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h | 3 |
2 files changed, 19 insertions, 7 deletions
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc index 633c5be07..b5379144d 100644 --- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc +++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc @@ -60,7 +60,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float loop_bw, gr_make_io_signaturev (1, 4, iosig)), d_updated (false), d_nfilters(filter_size), d_max_dev(max_rate_deviation), - d_osps(osps), d_error(0) + d_osps(osps), d_error(0), d_out_idx(0) { d_nfilters = filter_size; d_sps = floor(sps); @@ -376,8 +376,8 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items, float error_r, error_i; // produce output as long as we can and there are enough input samples - while((i < noutput_items-d_osps) && (count < nrequired)) { - for(int k = 0; k < d_osps; k++) { + while((i < noutput_items) && (count < nrequired)) { + while(d_out_idx < d_osps) { d_filtnum = (int)floor(d_k); // Keep the current filter number in [0, d_nfilters] @@ -394,16 +394,27 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items, count -= 1; } - out[i+k] = d_filters[d_filtnum]->filter(&in[count+k]); + out[i+d_out_idx] = d_filters[d_filtnum]->filter(&in[count+d_out_idx]); d_k = d_k + d_rate_i + d_rate_f; // update phase - + d_out_idx++; + if(output_items.size() == 4) { err[i] = d_error; outrate[i] = d_rate_f; outk[i] = d_k; } + + // We've run out of output items we can create; return now. + if(i+d_out_idx >= noutput_items) { + consume_each(count); + return i; + } } + // reset here; if we didn't complete a full osps samples last time, + // the early return would take care of it. + d_out_idx = 0; + // Update the phase and rate estimates for this symbol gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]); error_r = out[i].real() * diff.real(); @@ -421,7 +432,7 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items, i+=d_osps; count += (int)floor(d_sps); } - consume_each(count); + consume_each(count); return i; } diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h index f4f589cd9..1e1bbca10 100644 --- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h +++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h @@ -197,7 +197,8 @@ class GR_CORE_API gr_pfb_clock_sync_ccf : public gr_block int d_filtnum; int d_osps; float d_error; - + int d_out_idx; + /*! * Build the polyphase filterbank timing synchronizer. */ |