From: Johnathan Corgan Date: Sat, 29 Aug 2009 20:24:58 +0000 (-0700) Subject: Implemented crude timing recovery using zero crossings but no resampling X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=225d3141a7f4754eae5a1a041e1d18dc38131772;p=debian%2Fgnuradio Implemented crude timing recovery using zero crossings but no resampling --- diff --git a/gr-noaa/grc/usrp_rx_hrpt.grc b/gr-noaa/grc/usrp_rx_hrpt.grc index d3c6603a..b304bd35 100644 --- a/gr-noaa/grc/usrp_rx_hrpt.grc +++ b/gr-noaa/grc/usrp_rx_hrpt.grc @@ -1,6 +1,6 @@ - Sat Aug 29 11:48:56 2009 + Sat Aug 29 13:16:19 2009 options @@ -257,85 +257,56 @@ - wxgui_fftsink2 + variable id - rx_fftsink + max_carrier_offset _enabled True - type - complex - - - title - RX Spectrum - - - samp_rate - sample_rate - - - baseband_freq - 1698e6 - - - y_per_div - 5 - - - y_divs - 8 - - - ref_level - 20 + value + 2*math.pi*100e3/sample_rate - fft_size - 1024 + _coordinate + (668, 107) - fft_rate - 30 + _rotation + 0 + + + variable - peak_hold - False + id + max_sync_offset - average + _enabled True - avg_alpha - 0.1 - - - grid_pos - 0, 0, 1, 1 - - - notebook - displays, 0 + value + 0.01 _coordinate - (194, 263) + (665, 173) _rotation - 180 + 0 wxgui_scopesink2 id - wxgui_scopesink2_0 + wxgui_scopesink2_0_0 _enabled @@ -347,7 +318,7 @@ title - RX Waveform + Post-PLL samp_rate @@ -355,7 +326,7 @@ v_scale - 0 + 0.5 t_scale @@ -375,15 +346,15 @@ grid_pos - 1, 0, 1, 1 + 0, 0, 1, 1 notebook - displays, 0 + displays, 1 _coordinate - (198, 609) + (618, 335) _rotation @@ -391,38 +362,34 @@ - gr_agc_xx + notebook id - agr + displays _enabled True - type - complex - - - rate - 1e-6 + style + wx.NB_TOP - reference - 1.0 + labels + ['RX','PLL','SYNC'] - gain - 1.0 + grid_pos + 1, 0, 1, 2 - max_gain - 1.0 + notebook + _coordinate - (261, 494) + (9, 99) _rotation @@ -430,10 +397,10 @@ - gr_moving_average_xx + wxgui_scopesink2 id - gr_moving_average_xx_0 + wxgui_scopesink2_0_0_0 _enabled @@ -444,66 +411,79 @@ complex - length - hs + title + Post-PLL - scale - 1.0/hs + samp_rate + sample_rate - max_iter - 4000 + v_scale + 0.5 - _coordinate - (434, 502) + t_scale + 20.0/sample_rate - _rotation - 0 + ac_couple + False - - - variable - id - max_carrier_offset + xy_mode + True - _enabled - True + num_inputs + 1 - value - 2*math.pi*100e3/sample_rate + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 1 _coordinate - (668, 107) + (618, 614) _rotation - 0 + 180 - variable + noaa_hrpt_sync_cc id - max_sync_offset + sync _enabled True - value - 0.01 + alpha + sync_alpha + + + beta + sync_alpha**2/4.0 + + + sps + sps + + + max_offset + max_sync_offset _coordinate - (665, 173) + (865, 494) _rotation @@ -511,140 +491,156 @@ - variable_slider + wxgui_scopesink2 id - pll_alpha + wxgui_scopesink2_0_0_0_0 _enabled True - label - PLL Alpha + type + complex - value - 0.005 + title + Post-SYNC - min - 0.0 + samp_rate + sym_rate - max + v_scale 0.5 - num_steps - 500 + t_scale + 20.0/sym_rate - style - wx.SL_HORIZONTAL + ac_couple + False - converver - float_converter + xy_mode + True + + + num_inputs + 1 grid_pos - 0, 0, 1, 1 + 1, 0, 1, 1 notebook - + displays, 2 _coordinate - (192, 100) + (872, 607) _rotation - 0 + 180 - variable_slider + wxgui_scopesink2 id - sync_alpha + wxgui_scopesink2_0_0_1 _enabled True - label - SYNC Alpha + type + complex - value - 0.005 + title + Post-SYNC - min - 0.0 + samp_rate + sym_rate - max + v_scale 0.5 - num_steps - 500 + t_scale + 20.0/sym_rate - style - wx.SL_HORIZONTAL + ac_couple + False - converver - float_converter + xy_mode + False + + + num_inputs + 1 grid_pos - 0, 1, 1, 1 + 0, 0, 1, 1 notebook - + displays, 2 _coordinate - (344, 101) + (872, 341) _rotation - 0 + 180 - noaa_hrpt_pll_cc + gr_agc_xx id - noaa_hrpt_pll_cc_0 + agr _enabled True - alpha - pll_alpha + type + complex - beta - pll_alpha**2/4.0 + rate + 1e-6 - max_offset - max_carrier_offset + reference + 1.0 + + + gain + 1.0 + + + max_gain + 1.0 _coordinate - (628, 502) + (261, 494) _rotation @@ -652,69 +648,41 @@ - wxgui_scopesink2 + noaa_hrpt_pll_cc id - wxgui_scopesink2_0_0 + noaa_hrpt_pll_cc_0 _enabled True - type - complex - - - title - Post-PLL - - - samp_rate - sample_rate - - - v_scale - 0.5 - - - t_scale - 20.0/sample_rate - - - ac_couple - False - - - xy_mode - False - - - num_inputs - 1 + alpha + pll_alpha - grid_pos - 0, 0, 1, 1 + beta + pll_alpha**2/4.0 - notebook - displays, 1 + max_offset + max_carrier_offset _coordinate - (618, 335) + (628, 502) _rotation - 180 + 0 - wxgui_scopesink2 + wxgui_fftsink2 id - wxgui_scopesink2_0_0_1 + rx_fftsink _enabled @@ -726,78 +694,59 @@ title - Post-SYNC + RX Spectrum samp_rate sample_rate - v_scale - 0.5 - - - t_scale - 20.0/sample_rate - - - ac_couple - False - - - xy_mode - False + baseband_freq + 1698e6 - num_inputs - 1 + y_per_div + 5 - grid_pos - 0, 0, 1, 1 + y_divs + 8 - notebook - displays, 2 + ref_level + 20 - _coordinate - (872, 341) + fft_size + 1024 - _rotation - 180 + fft_rate + 30 - - - notebook - id - displays + peak_hold + False - _enabled + average True - style - wx.NB_TOP - - - labels - ['RX','PLL','SYNC'] + avg_alpha + 0.1 grid_pos - 1, 0, 1, 2 + 0, 0, 1, 1 notebook - + displays, 0 _coordinate - (9, 99) + (433, 297) _rotation @@ -808,7 +757,7 @@ wxgui_scopesink2 id - wxgui_scopesink2_0_0_0 + wxgui_scopesink2_0 _enabled @@ -820,7 +769,7 @@ title - Post-PLL + RX Waveform samp_rate @@ -828,7 +777,7 @@ v_scale - 0.5 + 0 t_scale @@ -840,7 +789,7 @@ xy_mode - True + False num_inputs @@ -852,46 +801,66 @@ notebook - displays, 1 + displays, 0 _coordinate - (618, 614) + (434, 603) _rotation - 180 + 0 - noaa_hrpt_sync_cc + variable_slider id - sync + pll_alpha _enabled True - alpha - sync_alpha + label + PLL Alpha - beta - sync_alpha**2/4.0 + value + 0.001 - sps - sps + min + 0.0 - max_offset - max_sync_offset + max + 0.5 + + + num_steps + 500 + + + style + wx.SL_HORIZONTAL + + + converver + float_converter + + + grid_pos + 0, 0, 1, 1 + + + notebook + _coordinate - (865, 494) + (192, 100) _rotation @@ -899,62 +868,58 @@ - wxgui_scopesink2 + variable_slider id - wxgui_scopesink2_0_0_0_0 + sync_alpha _enabled True - type - complex + label + SYNC Alpha - title - Post-SYNC + value + 0.001 - samp_rate - sample_rate + min + 0.0 - v_scale + max 0.5 - t_scale - 20.0/sample_rate - - - ac_couple - False + num_steps + 500 - xy_mode - True + style + wx.SL_HORIZONTAL - num_inputs - 1 + converver + float_converter grid_pos - 1, 0, 1, 1 + 0, 1, 1, 1 notebook - displays, 2 + _coordinate - (872, 607) + (344, 101) _rotation - 180 + 0 @@ -969,12 +934,6 @@ 0 0 - - agr - gr_moving_average_xx_0 - 0 - 0 - agr rx_fftsink @@ -987,12 +946,6 @@ 0 0 - - gr_moving_average_xx_0 - noaa_hrpt_pll_cc_0 - 0 - 0 - noaa_hrpt_pll_cc_0 wxgui_scopesink2_0_0 @@ -1023,4 +976,10 @@ 0 0 + + agr + noaa_hrpt_pll_cc_0 + 0 + 0 + diff --git a/gr-noaa/grc/usrp_rx_hrpt.py b/gr-noaa/grc/usrp_rx_hrpt.py index ed641733..5cfaf784 100755 --- a/gr-noaa/grc/usrp_rx_hrpt.py +++ b/gr-noaa/grc/usrp_rx_hrpt.py @@ -2,7 +2,7 @@ ################################################## # Gnuradio Python Flow Graph # Title: USRP HRPT Receiver -# Generated: Sat Aug 29 11:48:57 2009 +# Generated: Sat Aug 29 13:16:19 2009 ################################################## from gnuradio import gr @@ -28,8 +28,8 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): self.sym_rate = sym_rate = 600*1109 self.sample_rate = sample_rate = 64e6/decim self.sps = sps = sample_rate/sym_rate - self.sync_alpha = sync_alpha = 0.005 - self.pll_alpha = pll_alpha = 0.005 + self.sync_alpha = sync_alpha = 0.001 + self.pll_alpha = pll_alpha = 0.001 self.max_sync_offset = max_sync_offset = 0.01 self.max_carrier_offset = max_carrier_offset = 2*math.pi*100e3/sample_rate self.hs = hs = int(sps/2.0) @@ -97,7 +97,6 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): # Blocks ################################################## self.agr = gr.agc_cc(1e-6, 1.0, 1.0, 1.0) - self.gr_moving_average_xx_0 = gr.moving_average_cc(hs, 1.0/hs, 4000) self.noaa_hrpt_pll_cc_0 = noaa.hrpt_pll_cc(pll_alpha, pll_alpha**2/4.0, max_carrier_offset) self.rx_fftsink = fftsink2.fft_sink_c( self.displays.GetPage(0).GetWin(), @@ -153,9 +152,9 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_c( self.displays.GetPage(2).GetWin(), title="Post-SYNC", - sample_rate=sample_rate, + sample_rate=sym_rate, v_scale=0.5, - t_scale=20.0/sample_rate, + t_scale=20.0/sym_rate, ac_couple=False, xy_mode=True, num_inputs=1, @@ -164,9 +163,9 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): self.wxgui_scopesink2_0_0_1 = scopesink2.scope_sink_c( self.displays.GetPage(2).GetWin(), title="Post-SYNC", - sample_rate=sample_rate, + sample_rate=sym_rate, v_scale=0.5, - t_scale=20.0/sample_rate, + t_scale=20.0/sym_rate, ac_couple=False, xy_mode=False, num_inputs=1, @@ -178,15 +177,14 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): ################################################## self.connect((self.src, 0), (self.throttle, 0)) self.connect((self.throttle, 0), (self.agr, 0)) - self.connect((self.agr, 0), (self.gr_moving_average_xx_0, 0)) self.connect((self.agr, 0), (self.rx_fftsink, 0)) self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0)) - self.connect((self.gr_moving_average_xx_0, 0), (self.noaa_hrpt_pll_cc_0, 0)) self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0, 0)) self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0_0, 0)) self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.sync, 0)) self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_1, 0)) self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_0_0, 0)) + self.connect((self.agr, 0), (self.noaa_hrpt_pll_cc_0, 0)) def set_decim(self, decim): self.decim = decim @@ -195,17 +193,17 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): def set_sym_rate(self, sym_rate): self.sym_rate = sym_rate self.set_sps(self.sample_rate/self.sym_rate) + self.wxgui_scopesink2_0_0_0_0.set_sample_rate(self.sym_rate) + self.wxgui_scopesink2_0_0_1.set_sample_rate(self.sym_rate) def set_sample_rate(self, sample_rate): self.sample_rate = sample_rate self.set_sps(self.sample_rate/self.sym_rate) - self.rx_fftsink.set_sample_rate(self.sample_rate) - self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate) self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate) self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate) - self.wxgui_scopesink2_0_0_1.set_sample_rate(self.sample_rate) self.wxgui_scopesink2_0_0_0.set_sample_rate(self.sample_rate) - self.wxgui_scopesink2_0_0_0_0.set_sample_rate(self.sample_rate) + self.rx_fftsink.set_sample_rate(self.sample_rate) + self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate) def set_sps(self, sps): self.sps = sps @@ -213,17 +211,17 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): def set_sync_alpha(self, sync_alpha): self.sync_alpha = sync_alpha - self._sync_alpha_slider.set_value(self.sync_alpha) - self._sync_alpha_text_box.set_value(self.sync_alpha) self.sync.set_alpha(self.sync_alpha) self.sync.set_beta(self.sync_alpha**2/4.0) + self._sync_alpha_slider.set_value(self.sync_alpha) + self._sync_alpha_text_box.set_value(self.sync_alpha) def set_pll_alpha(self, pll_alpha): self.pll_alpha = pll_alpha - self._pll_alpha_slider.set_value(self.pll_alpha) - self._pll_alpha_text_box.set_value(self.pll_alpha) self.noaa_hrpt_pll_cc_0.set_alpha(self.pll_alpha) self.noaa_hrpt_pll_cc_0.set_beta(self.pll_alpha**2/4.0) + self._pll_alpha_slider.set_value(self.pll_alpha) + self._pll_alpha_text_box.set_value(self.pll_alpha) def set_max_sync_offset(self, max_sync_offset): self.max_sync_offset = max_sync_offset @@ -235,7 +233,6 @@ class usrp_rx_hrpt(grc_wxgui.top_block_gui): def set_hs(self, hs): self.hs = hs - self.gr_moving_average_xx_0.set_length_and_scale(self.hs, 1.0/self.hs) if __name__ == '__main__': parser = OptionParser(option_class=eng_option, usage="%prog: [options]") diff --git a/gr-noaa/lib/noaa_hrpt_sync_cc.cc b/gr-noaa/lib/noaa_hrpt_sync_cc.cc index 47858d75..46cc277b 100644 --- a/gr-noaa/lib/noaa_hrpt_sync_cc.cc +++ b/gr-noaa/lib/noaa_hrpt_sync_cc.cc @@ -27,6 +27,11 @@ #include #include +inline int signum(float f) +{ + return f >= 0.0 ? 1 : -1; +} + noaa_hrpt_sync_cc_sptr noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset) { @@ -37,8 +42,10 @@ noaa_hrpt_sync_cc::noaa_hrpt_sync_cc(float alpha, float beta, float sps, float m : gr_block("noaa_hrpt_sync_cc", gr_make_io_signature(1, 1, sizeof(gr_complex)), gr_make_io_signature(1, 1, sizeof(gr_complex))), - d_alpha(alpha), d_beta(beta), d_sps(sps), d_max_offset(max_offset), - d_phase(0.0), d_freq(0.0) + d_alpha(alpha), d_beta(beta), + d_sps(sps), d_max_offset(max_offset), + d_phase(0.0), d_freq(1.0/sps), + d_last_sign(1) { } @@ -54,7 +61,25 @@ noaa_hrpt_sync_cc::general_work(int noutput_items, int i = 0, j = 0; while (i < ninputs && j < noutput_items) { - out[j++] = in[i++]; + float sample = in[i++].imag(); + int sign = signum(sample); + d_phase += d_freq; + + // Train on zero crossings in center region of symbol + if (sign != d_last_sign) { + if (d_phase > 0.25 && d_phase < 0.75) { + float phase_err = d_phase-0.5; + d_phase -= phase_err*d_alpha; // 1st order phase adjustment + d_freq -= phase_err*d_beta; // 2nd order frequency adjustment + } + + d_last_sign = sign; + } + + if (d_phase > 1.0) { + out[j++] = in[i]; + d_phase -= 1.0; + } } consume_each(i); diff --git a/gr-noaa/lib/noaa_hrpt_sync_cc.h b/gr-noaa/lib/noaa_hrpt_sync_cc.h index f5b23cca..6abbcad4 100644 --- a/gr-noaa/lib/noaa_hrpt_sync_cc.h +++ b/gr-noaa/lib/noaa_hrpt_sync_cc.h @@ -42,6 +42,7 @@ class noaa_hrpt_sync_cc : public gr_block float d_max_offset; // Maximum frequency offset for d_sps, samples/symbol float d_phase; // Instantaneous symbol phase float d_freq; // Instantaneous symbol frequency, samples/symbol + int d_last_sign; // Tracks zero crossings public: int general_work(int noutput_items,