From 0b9a0ba3594c8a4226319402f3c02d53d404c5a2 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Sat, 31 Oct 2009 10:17:20 -0700 Subject: [PATCH] core: added gr.pfb_clock_sync_fff based on _ccf version, updated example --- gnuradio-core/src/lib/filter/Makefile.am | 7 +- .../src/lib/filter/gr_pfb_clock_sync_ccf.cc | 4 +- .../src/lib/filter/gr_pfb_clock_sync_fff.cc | 281 +++++++ .../src/lib/filter/gr_pfb_clock_sync_fff.h | 128 +++ .../src/lib/filter/gr_pfb_clock_sync_fff.i | 54 ++ gnuradio-examples/grc/demod/pam_timing.grc | 754 +++++++++--------- grc/blocks/gr_pfb_clock_sync.xml | 28 +- 7 files changed, 893 insertions(+), 363 deletions(-) create mode 100644 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.cc create mode 100644 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.h create mode 100644 gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.i diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am index d5afd571..9cd6e9f3 100644 --- a/gnuradio-core/src/lib/filter/Makefile.am +++ b/gnuradio-core/src/lib/filter/Makefile.am @@ -206,7 +206,8 @@ libfilter_la_common_SOURCES = \ gr_pfb_decimator_ccf.cc \ gr_pfb_interpolator_ccf.cc \ gr_pfb_arb_resampler_ccf.cc \ - gr_pfb_clock_sync_ccf.cc + gr_pfb_clock_sync_ccf.cc \ + gr_pfb_clock_sync_fff.cc libfilter_qa_la_common_SOURCES = \ qa_filter.cc \ @@ -286,7 +287,8 @@ grinclude_HEADERS = \ gr_pfb_decimator_ccf.h \ gr_pfb_interpolator_ccf.h \ gr_pfb_arb_resampler_ccf.h \ - gr_pfb_clock_sync_ccf.h + gr_pfb_clock_sync_ccf.h \ + gr_pfb_clock_sync_fff.h noinst_HEADERS = \ assembly.h \ @@ -342,6 +344,7 @@ swiginclude_HEADERS = \ gr_pfb_interpolator_ccf.i \ gr_pfb_arb_resampler_ccf.i \ gr_pfb_clock_sync_ccf.i \ + gr_pfb_clock_sync_fff.i \ $(GENERATED_I) endif 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 433b7d61..59454afe 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 @@ -45,8 +45,8 @@ gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (double sps, float gain, max_rate_deviation)); } -int ios[] = {sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float)}; -std::vector iosig(ios, ios+sizeof(ios)/sizeof(int)); +static int ios[] = {sizeof(gr_complex), sizeof(float), sizeof(float), sizeof(float)}; +static std::vector iosig(ios, ios+sizeof(ios)/sizeof(int)); gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (double sps, float gain, const std::vector &taps, unsigned int filter_size, diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.cc new file mode 100644 index 00000000..d1d2f05d --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.cc @@ -0,0 +1,281 @@ +/* -*- 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 +#include + +#include +#include +#include +#include +#include + +gr_pfb_clock_sync_fff_sptr gr_make_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size, + float init_phase, + float max_rate_deviation) +{ + return gr_pfb_clock_sync_fff_sptr (new gr_pfb_clock_sync_fff (sps, gain, taps, + filter_size, + init_phase, + max_rate_deviation)); +} + +static int ios[] = {sizeof(float), sizeof(float), sizeof(float), sizeof(float)}; +static std::vector iosig(ios, ios+sizeof(ios)/sizeof(int)); +gr_pfb_clock_sync_fff::gr_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size, + float init_phase, + float max_rate_deviation) + : gr_block ("pfb_clock_sync_fff", + gr_make_io_signature (1, 1, sizeof(float)), + gr_make_io_signaturev (1, 4, iosig)), + d_updated (false), d_nfilters(filter_size), + d_max_dev(max_rate_deviation) +{ + d_nfilters = filter_size; + d_sps = floor(sps); + + // Store the last filter between calls to work + // The accumulator keeps track of overflow to increment the stride correctly. + // set it here to the fractional difference based on the initial phaes + set_alpha(gain); + set_beta(0.25*gain*gain); + d_k = init_phase; + d_rate = (sps-floor(sps))*(double)d_nfilters; + d_rate_i = (int)floor(d_rate); + d_rate_f = d_rate - (float)d_rate_i; + d_filtnum = (int)floor(d_k); + + d_filters = std::vector(d_nfilters); + d_diff_filters = std::vector(d_nfilters); + + // Create an FIR filter for each channel and zero out the taps + std::vector vtaps(0, d_nfilters); + for(int i = 0; i < d_nfilters; i++) { + d_filters[i] = gr_fir_util::create_gr_fir_fff(vtaps); + d_diff_filters[i] = gr_fir_util::create_gr_fir_fff(vtaps); + } + + // Now, actually set the filters' taps + std::vector dtaps; + create_diff_taps(taps, dtaps); + set_taps(taps, d_taps, d_filters); + set_taps(dtaps, d_dtaps, d_diff_filters); +} + +gr_pfb_clock_sync_fff::~gr_pfb_clock_sync_fff () +{ + for(int i = 0; i < d_nfilters; i++) { + delete d_filters[i]; + } +} + +void +gr_pfb_clock_sync_fff::set_taps (const std::vector &newtaps, + std::vector< std::vector > &ourtaps, + std::vector &ourfilter) +{ + int i,j; + + unsigned int ntaps = newtaps.size(); + d_taps_per_filter = (unsigned int)ceil((double)ntaps/(double)d_nfilters); + + // Create d_numchan vectors to store each channel's taps + ourtaps.resize(d_nfilters); + + // 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 tmp_taps; + tmp_taps = newtaps; + while((float)(tmp_taps.size()) < d_nfilters*d_taps_per_filter) { + tmp_taps.push_back(0.0); + } + + // Partition the filter + for(i = 0; i < d_nfilters; i++) { + // Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out + ourtaps[d_nfilters-1-i] = std::vector(d_taps_per_filter, 0); + for(j = 0; j < d_taps_per_filter; j++) { + ourtaps[d_nfilters - 1 - i][j] = tmp_taps[i + j*d_nfilters]; + } + + // Build a filter for each channel and add it's taps to it + ourfilter[i]->set_taps(ourtaps[d_nfilters-1-i]); + } + + // Set the history to ensure enough input items for each filter + set_history (d_taps_per_filter + d_sps); + + d_updated = true; +} + +void +gr_pfb_clock_sync_fff::create_diff_taps(const std::vector &newtaps, + std::vector &difftaps) +{ + float maxtap = 1e-20; + difftaps.clear(); + difftaps.push_back(0); //newtaps[0]); + for(unsigned int i = 1; i < newtaps.size()-1; i++) { + float tap = newtaps[i+1] - newtaps[i-1]; + difftaps.push_back(tap); + if(tap > maxtap) { + maxtap = tap; + } + } + difftaps.push_back(0);//-newtaps[newtaps.size()-1]); + + // Scale the differential taps; helps scale error term to better update state + // FIXME: should this be scaled this way or use the same gain as the taps? + for(unsigned int i = 0; i < difftaps.size(); i++) { + difftaps[i] /= maxtap; + } +} + +void +gr_pfb_clock_sync_fff::print_taps() +{ + int i, j; + printf("[ "); + for(i = 0; i < d_nfilters; i++) { + printf("[%.4e, ", d_taps[i][0]); + for(j = 1; j < d_taps_per_filter-1; j++) { + printf("%.4e,", d_taps[i][j]); + } + printf("%.4e],", d_taps[i][j]); + } + printf(" ]\n"); +} + +void +gr_pfb_clock_sync_fff::print_diff_taps() +{ + int i, j; + printf("[ "); + for(i = 0; i < d_nfilters; i++) { + printf("[%.4e, ", d_dtaps[i][0]); + for(j = 1; j < d_taps_per_filter-1; j++) { + printf("%.4e,", d_dtaps[i][j]); + } + printf("%.4e],", d_dtaps[i][j]); + } + printf(" ]\n"); +} + + +std::vector +gr_pfb_clock_sync_fff::channel_taps(int channel) +{ + std::vector taps; + for(int i = 0; i < d_taps_per_filter; i++) { + taps.push_back(d_taps[channel][i]); + } + return taps; +} + +std::vector +gr_pfb_clock_sync_fff::diff_channel_taps(int channel) +{ + std::vector taps; + for(int i = 0; i < d_taps_per_filter; i++) { + taps.push_back(d_dtaps[channel][i]); + } + return taps; +} + + +int +gr_pfb_clock_sync_fff::general_work (int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + float *in = (float *) input_items[0]; + float *out = (float *) output_items[0]; + + float *err, *outrate, *outk; + if(output_items.size() > 2) { + err = (float *) output_items[1]; + outrate = (float*)output_items[2]; + outk = (float*)output_items[3]; + } + + if (d_updated) { + d_updated = false; + return 0; // history requirements may have changed. + } + + // We need this many to process one output + int nrequired = ninput_items[0] - d_taps_per_filter; + + int i = 0, count = 0; + float error; + + // produce output as long as we can and there are enough input samples + while((i < noutput_items) && (count < nrequired)) { + d_filtnum = (int)floor(d_k); + + // Keep the current filter number in [0, d_nfilters] + // If we've run beyond the last filter, wrap around and go to next sample + // If we've go below 0, wrap around and go to previous sample + while(d_filtnum >= d_nfilters) { + d_k -= d_nfilters; + d_filtnum -= d_nfilters; + count += 1; + } + while(d_filtnum < 0) { + d_k += d_nfilters; + d_filtnum += d_nfilters; + count -= 1; + } + + out[i] = d_filters[d_filtnum]->filter(&in[count]); + float diff = d_diff_filters[d_filtnum]->filter(&in[count]); + error = out[i] * diff; + + // Run the control loop to update the current phase (k) and tracking rate + d_k = d_k + d_alpha*error + d_rate_i + d_rate_f; + d_rate_f = d_rate_f + d_beta*error; + + // Keep our rate within a good range + d_rate_f = gr_branchless_clip(d_rate_f, d_max_dev); + + i++; + count += (int)floor(d_sps); + + if(output_items.size() > 2) { + err[i] = error; + outrate[i] = d_rate_f; + outk[i] = d_k; + } + } + consume_each(count); + + return i; +} diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.h new file mode 100644 index 00000000..913f798f --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.h @@ -0,0 +1,128 @@ +/* -*- 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_CLOCK_SYNC_FFF_H +#define INCLUDED_GR_PFB_CLOCK_SYNC_FFF_H + +#include + +class gr_pfb_clock_sync_fff; +typedef boost::shared_ptr gr_pfb_clock_sync_fff_sptr; +gr_pfb_clock_sync_fff_sptr gr_make_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size=32, + float init_phase=0, + float max_rate_deviation=1.5); + +class gr_fir_fff; + +/*! + * \class gr_pfb_clock_sync_fff + * + * \brief Timing synchronizer using polyphase filterbanks + * + * \ingroup filter_blk + * + */ + +class gr_pfb_clock_sync_fff : public gr_block +{ + private: + /*! + * Build the polyphase filterbank timing synchronizer. + */ + friend gr_pfb_clock_sync_fff_sptr gr_make_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size, + float init_phase, + float max_rate_deviation); + + bool d_updated; + double d_sps; + double d_sample_num; + float d_alpha; + float d_beta; + int d_nfilters; + std::vector d_filters; + std::vector d_diff_filters; + std::vector< std::vector > d_taps; + std::vector< std::vector > d_dtaps; + float d_k; + float d_rate; + float d_rate_i; + float d_rate_f; + float d_max_dev; + int d_filtnum; + int d_taps_per_filter; + + /*! + * Build the polyphase filterbank timing synchronizer. + */ + gr_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size, + float init_phase, + float max_rate_deviation); + + void create_diff_taps(const std::vector &newtaps, + std::vector &difftaps); + +public: + ~gr_pfb_clock_sync_fff (); + + /*! + * Resets the filterbank's filter taps with the new prototype filter + */ + void set_taps (const std::vector &taps, + std::vector< std::vector > &ourtaps, + std::vector &ourfilter); + std::vector channel_taps(int channel); + std::vector diff_channel_taps(int channel); + + /*! + * Print all of the filterbank taps to screen. + */ + void print_taps(); + void print_diff_taps(); + + void set_alpha(float alpha) + { + d_alpha = alpha; + } + void set_beta(float beta) + { + d_beta = beta; + } + + void set_max_rate_deviation(float m) + { + d_max_dev = m; + } + + int general_work (int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.i new file mode 100644 index 00000000..d6bb7873 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_fff.i @@ -0,0 +1,54 @@ +/* -*- 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_clock_sync_fff); + +gr_pfb_clock_sync_fff_sptr gr_make_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size=32, + float init_phase=0, + float max_rate_deviation=1.5); + +class gr_pfb_clock_sync_fff : public gr_block +{ + private: + gr_pfb_clock_sync_fff (double sps, float gain, + const std::vector &taps, + unsigned int filter_size, + float init_phase, + float max_rate_deviation); + + public: + ~gr_pfb_clock_sync_fff (); + + void set_taps (const std::vector &taps, + std::vector< std::vector > &ourtaps, + std::vector &ourfilter); + + std::vector channel_taps(int channel); + std::vector diff_channel_taps(int channel); + void print_taps(); + void print_diff_taps(); + void set_alpha(float alpha); + void set_beta(float beta); + void set_max_rate_deviation(float m); +}; diff --git a/gnuradio-examples/grc/demod/pam_timing.grc b/gnuradio-examples/grc/demod/pam_timing.grc index 4e2a2f86..149e4c70 100644 --- a/gnuradio-examples/grc/demod/pam_timing.grc +++ b/gnuradio-examples/grc/demod/pam_timing.grc @@ -1,6 +1,6 @@ - Mon Oct 12 17:54:59 2009 + Sat Oct 31 10:26:48 2009 options @@ -327,124 +327,6 @@ 0 - - wxgui_scopesink2 - - id - wxgui_scopesink2_0_0_0_0 - - - _enabled - True - - - type - float - - - title - Scope Plot - - - samp_rate - samp_rate - - - v_scale - 1.25 - - - t_scale - 0 - - - ac_couple - False - - - xy_mode - False - - - num_inputs - 1 - - - grid_pos - - - - notebook - notebook_0,2 - - - _coordinate - (1111, 767) - - - _rotation - 0 - - - - wxgui_scopesink2 - - id - wxgui_scopesink2_0_0_0 - - - _enabled - True - - - type - float - - - title - Scope Plot - - - samp_rate - samp_rate - - - v_scale - 9 - - - t_scale - 0 - - - ac_couple - False - - - xy_mode - False - - - num_inputs - 1 - - - grid_pos - - - - notebook - notebook_0,1 - - - _coordinate - (1112, 881) - - - _rotation - 0 - - gr_channel_model @@ -484,37 +366,6 @@ 0 - - gr_throttle - - id - gr_throttle_0 - - - _enabled - True - - - type - complex - - - samples_per_second - samp_rate - - - vlen - 1 - - - _coordinate - (290, 575) - - - _rotation - 0 - - notebook @@ -576,6 +427,10 @@ v_scale .5 + + v_offset + 0 + t_scale 0 @@ -592,6 +447,10 @@ num_inputs 1 + + win_size + + grid_pos @@ -695,46 +554,65 @@ - wxgui_scopesink2 + variable id - wxgui_scopesink2_0 + nfilts _enabled True - type - complex + value + 32 - title - Scope Plot + _coordinate + (435, 686) - samp_rate - samp_rate + _rotation + 0 + + + variable_slider - v_scale + id + noise_amp + + + _enabled + True + + + label + Channel Noise + + + value 0 - t_scale + min 0 - ac_couple - False + max + 1.0 - xy_mode - False + num_steps + 1000 - num_inputs - 1 + style + wx.SL_HORIZONTAL + + + converver + float_converter grid_pos @@ -746,7 +624,7 @@ _coordinate - (1116, 500) + (168, 684) _rotation @@ -754,69 +632,77 @@ - variable + variable_slider id - nfilts + interpratio _enabled True - value - 32 + label + Timing Offset - _coordinate - (435, 686) + value + 1.00 - _rotation - 0 + min + 0.99 - - - gr_pfb_clock_sync_ccf - id - gr_pfb_clock_sync_ccf_0 + max + 1.01 - _enabled - True + num_steps + 1000 - sps - spb + style + wx.SL_HORIZONTAL - alpha - alpha + converver + float_converter - beta - beta + grid_pos + - taps - rrctaps + notebook + - filter_size - nfilts + _coordinate + (40, 684) - init_phase - 16 - + _rotation + 180 + + + + variable - max_dev - 1.5 + id + spb_gen + + + _enabled + True + + + value + 4 _coordinate - (512, 527) + (119, 841) _rotation @@ -827,7 +713,7 @@ variable_slider id - noise_amp + beta _enabled @@ -835,7 +721,7 @@ label - Channel Noise + Timing Beta value @@ -843,11 +729,11 @@ min - 0 + 0.0 max - 1.0 + 0.1 num_steps @@ -871,18 +757,18 @@ _coordinate - (168, 684) + (668, 5) _rotation - 0 + 180 variable_slider id - interpratio + alpha _enabled @@ -890,19 +776,19 @@ label - Timing Offset + Timing Alpha value - 1.00 + 0 min - 0.99 + 0 max - 1.01 + 1 num_steps @@ -926,30 +812,58 @@ _coordinate - (40, 684) + (552, 4) _rotation - 180 + 0 - variable + root_raised_cosine_filter id - spb_gen + root_raised_cosine_filter_0 _enabled True - value - 4 + type + interp_fir_filter_ccf + + + decim + 1 + + + interp + spb_gen + + + gain + 2*spb_gen + + + samp_rate + 1.0 + + + sym_rate + 1./spb_gen + + + alpha + 0.35 + + + ntaps + 11*spb_gen _coordinate - (119, 841) + (834, 157) _rotation @@ -957,109 +871,130 @@ - variable_slider + blks2_pfb_arb_resampler_ccf id - beta + blks2_pfb_arb_resampler_ccf_0 _enabled True - label - Timing Beta + rate + float(spb)/float(spb_gen) - value - 0 + taps + firdes.low_pass(128, 128, 0.45, 0.1) - min - 0.0 + size + 128 - max - 0.1 + _coordinate + (617, 374) - num_steps - 1000 + _rotation + 0 + + + gr_multiply_const_vxx - style - wx.SL_HORIZONTAL + id + gr_multiply_const_vxx_0 - converver - float_converter + _enabled + True - grid_pos - + type + complex - notebook - + const + sig_amp + + + vlen + 1 _coordinate - (668, 5) + (1096, 197) _rotation - 180 + 0 - variable_slider + variable id - alpha + pam_amp _enabled True - label - Timing Alpha + value + 2 - value - 0 + _coordinate + (223, 9) - min + _rotation 0 + + + variable - max - 1 + id + spb - num_steps - 1000 + _enabled + True - style - wx.SL_HORIZONTAL + value + 4.1 - converver - float_converter + _coordinate + (32, 842) - grid_pos - + _rotation + 0 + + + variable - notebook - + id + sig_amp + + + _enabled + True + + + value + 1 _coordinate - (552, 4) + (315, 9) _rotation @@ -1070,7 +1005,7 @@ wxgui_scopesink2 id - wxgui_scopesink2_0_0 + wxgui_scopesink2_0 _enabled @@ -1078,11 +1013,11 @@ type - float + complex title - Error + Scope Plot samp_rate @@ -1090,7 +1025,11 @@ v_scale - 3 + 0 + + + v_offset + 0 t_scale @@ -1108,17 +1047,21 @@ num_inputs 1 + + win_size + + grid_pos notebook - notebook_0,0 + _coordinate - (1110, 651) + (1116, 500) _rotation @@ -1126,10 +1069,10 @@ - root_raised_cosine_filter + gr_throttle id - root_raised_cosine_filter_0 + gr_throttle_0 _enabled @@ -1137,70 +1080,86 @@ type - interp_fir_filter_ccf + complex - decim + samples_per_second + samp_rate + + + vlen 1 - interp - spb_gen + _coordinate + (290, 575) - gain - 2*spb_gen + _rotation + 0 + + + wxgui_scopesink2 - samp_rate - 1.0 + id + wxgui_scopesink2_0_0 - sym_rate - 1./spb_gen + _enabled + True - alpha - 0.35 + type + float - ntaps - 11*spb_gen + title + Error - _coordinate - (834, 157) + samp_rate + samp_rate - _rotation + v_scale + 3 + + + v_offset 0 - - - blks2_pfb_arb_resampler_ccf - id - blks2_pfb_arb_resampler_ccf_0 + t_scale + 0 - _enabled - True + ac_couple + False - rate - float(spb)/float(spb_gen) + xy_mode + False - taps - firdes.low_pass(128, 128, 0.45, 0.1) + num_inputs + 1 - size - 128 + win_size + + + + grid_pos + + + + notebook + notebook_0,0 _coordinate - (617, 374) + (1110, 651) _rotation @@ -1208,10 +1167,10 @@ - gr_multiply_const_vxx + wxgui_scopesink2 id - gr_multiply_const_vxx_0 + wxgui_scopesink2_0_0_0_0 _enabled @@ -1219,19 +1178,55 @@ type - complex + float - const - sig_amp + title + Scope Plot - vlen + samp_rate + samp_rate + + + v_scale + 1.25 + + + v_offset + 0 + + + t_scale + 0 + + + ac_couple + False + + + xy_mode + False + + + num_inputs 1 + + win_size + + + + grid_pos + + + + notebook + notebook_0,2 + _coordinate - (1096, 197) + (1111, 767) _rotation @@ -1239,22 +1234,50 @@ - variable + gr_pfb_clock_sync_xxx id - pam_amp + gr_pfb_clock_sync_xxx_0 _enabled True - value - 2 + type + ccf + + + sps + spb + + + alpha + alpha + + + beta + beta + + + taps + rrctaps + + + filter_size + nfilts + + + init_phase + 16 + + + max_dev + 1.5 _coordinate - (223, 9) + (512, 527) _rotation @@ -1262,69 +1285,72 @@ - variable + wxgui_scopesink2 id - spb + wxgui_scopesink2_0_0_0 _enabled True - value - 4.1 + type + float - _coordinate - (32, 842) + title + Scope Plot - _rotation + samp_rate + samp_rate + + + v_scale + 9 + + + v_offset 0 - - - variable - id - sig_amp + t_scale + 0 - _enabled - True + ac_couple + False - value + xy_mode + False + + + num_inputs 1 + + win_size + + + + grid_pos + + + + notebook + notebook_0,1 + _coordinate - (315, 9) + (1112, 881) _rotation 0 - - gr_pfb_clock_sync_ccf_0 - wxgui_scopesink2_0_0 - 1 - 0 - - - gr_pfb_clock_sync_ccf_0 - wxgui_scopesink2_0_0_0 - 3 - 0 - - - gr_pfb_clock_sync_ccf_0 - wxgui_scopesink2_0_0_0_0 - 2 - 0 - random_source_x_0 gr_uchar_to_float_0 @@ -1379,18 +1405,6 @@ 0 0 - - gr_throttle_0 - gr_pfb_clock_sync_ccf_0 - 0 - 0 - - - gr_pfb_clock_sync_ccf_0 - wxgui_scopesink2_0 - 0 - 0 - gr_add_xx_0 gr_float_to_complex_0 @@ -1421,4 +1435,34 @@ 0 0 + + gr_pfb_clock_sync_xxx_0 + wxgui_scopesink2_0 + 0 + 0 + + + gr_throttle_0 + gr_pfb_clock_sync_xxx_0 + 0 + 0 + + + gr_pfb_clock_sync_xxx_0 + wxgui_scopesink2_0_0 + 1 + 0 + + + gr_pfb_clock_sync_xxx_0 + wxgui_scopesink2_0_0_0_0 + 2 + 0 + + + gr_pfb_clock_sync_xxx_0 + wxgui_scopesink2_0_0_0 + 3 + 0 + diff --git a/grc/blocks/gr_pfb_clock_sync.xml b/grc/blocks/gr_pfb_clock_sync.xml index 9cb909ac..26cacfb3 100644 --- a/grc/blocks/gr_pfb_clock_sync.xml +++ b/grc/blocks/gr_pfb_clock_sync.xml @@ -6,14 +6,34 @@ --> Polyphase Clock Sync - gr_pfb_clock_sync_ccf + gr_pfb_clock_sync_xxx from gnuradio import gr - gr.pfb_clock_sync_ccf($sps, $alpha, $taps, $filter_size, $init_phase, $max_dev) + gr.pfb_clock_sync_$(type)($sps, $alpha, $taps, $filter_size, $init_phase, $max_dev) self.$(id).set_beta($beta) set_taps($taps) set_alpha($alpha) set_beta($beta) + + Type + type + enum + + + + Samples/Symbol sps @@ -51,11 +71,11 @@ self.$(id).set_beta($beta) in - complex + $type.input out - complex + $type.output err -- 2.30.2