From 6b6a5522e0b1d12ef5d697b1067a87dfe584cec6 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Sat, 29 Aug 2009 11:12:37 -0700 Subject: [PATCH] Work in progress, incomplete * Renamed noaa.carrier_pll_cc to noaa.hrpt_pll_cc * Added nop noaa.hrpt_sync_cc * Renamed grc apps to use usrp_ prefix and protocol name * Installed grc generated scripts to path --- gr-noaa/grc/Makefile.am | 12 +- ...arrier_pll_cc.xml => noaa_hrpt_pll_cc.xml} | 6 +- gr-noaa/grc/noaa_hrpt_sync_cc.xml | 39 + gr-noaa/grc/{rx_poes.grc => usrp_rx_hrpt.grc} | 562 ++++++--- gr-noaa/grc/usrp_rx_hrpt.py | 245 ++++ gr-noaa/grc/{rx_goes.grc => usrp_rx_lrit.grc} | 1035 +++++++++-------- gr-noaa/grc/usrp_rx_lrit.py | 399 +++++++ gr-noaa/lib/Makefile.am | 6 +- ..._carrier_pll_cc.cc => noaa_hrpt_pll_cc.cc} | 14 +- ...aa_carrier_pll_cc.h => noaa_hrpt_pll_cc.h} | 20 +- gr-noaa/lib/noaa_hrpt_sync_cc.cc | 62 + gr-noaa/lib/noaa_hrpt_sync_cc.h | 57 + gr-noaa/swig/Makefile.am | 3 +- ...aa_carrier_pll_cc.i => noaa_hrpt_pll_cc.i} | 10 +- gr-noaa/swig/noaa_hrpt_sync_cc.i | 37 + gr-noaa/swig/noaa_swig.i | 6 +- 16 files changed, 1803 insertions(+), 710 deletions(-) rename gr-noaa/grc/{noaa_carrier_pll_cc.xml => noaa_hrpt_pll_cc.xml} (83%) create mode 100644 gr-noaa/grc/noaa_hrpt_sync_cc.xml rename gr-noaa/grc/{rx_poes.grc => usrp_rx_hrpt.grc} (72%) mode change 100755 => 100644 create mode 100755 gr-noaa/grc/usrp_rx_hrpt.py rename gr-noaa/grc/{rx_goes.grc => usrp_rx_lrit.grc} (96%) mode change 100755 => 100644 create mode 100755 gr-noaa/grc/usrp_rx_lrit.py rename gr-noaa/lib/{noaa_carrier_pll_cc.cc => noaa_hrpt_pll_cc.cc} (83%) rename gr-noaa/lib/{noaa_carrier_pll_cc.h => noaa_hrpt_pll_cc.h} (73%) create mode 100644 gr-noaa/lib/noaa_hrpt_sync_cc.cc create mode 100644 gr-noaa/lib/noaa_hrpt_sync_cc.h rename gr-noaa/swig/{noaa_carrier_pll_cc.i => noaa_hrpt_pll_cc.i} (81%) create mode 100644 gr-noaa/swig/noaa_hrpt_sync_cc.i diff --git a/gr-noaa/grc/Makefile.am b/gr-noaa/grc/Makefile.am index 18144040..c7552977 100644 --- a/gr-noaa/grc/Makefile.am +++ b/gr-noaa/grc/Makefile.am @@ -22,9 +22,15 @@ include $(top_srcdir)/Makefile.common grcblocksdir = $(prefix)/share/gnuradio/grc/blocks + +dist_bin_SCRIPTS = \ + usrp_rx_hrpt.py \ + usrp_rx_lrit.py + dist_grcblocks_DATA = \ - noaa_carrier_pll_cc.xml + noaa_hrpt_pll_cc.xml \ + noaa_hrpt_sync_cc.xml EXTRA_DIST = \ - rx_goes.grc \ - rx_poes.grc + usrp_rx_hrpt.grc \ + usrp_rx_lrit.grc diff --git a/gr-noaa/grc/noaa_carrier_pll_cc.xml b/gr-noaa/grc/noaa_hrpt_pll_cc.xml similarity index 83% rename from gr-noaa/grc/noaa_carrier_pll_cc.xml rename to gr-noaa/grc/noaa_hrpt_pll_cc.xml index 7b1fdc8f..e56e0b05 100644 --- a/gr-noaa/grc/noaa_carrier_pll_cc.xml +++ b/gr-noaa/grc/noaa_hrpt_pll_cc.xml @@ -1,10 +1,10 @@ - Carrier PLL - noaa_carrier_pll_cc + HRPT PLL + noaa_hrpt_pll_cc NOAA from gnuradio import noaa - noaa.carrier_pll_cc($alpha, $beta, $max_offset) + noaa.hrpt_pll_cc($alpha, $beta, $max_offset) set_alpha($alpha) set_beta($beta) set_max_offset($max_offset) diff --git a/gr-noaa/grc/noaa_hrpt_sync_cc.xml b/gr-noaa/grc/noaa_hrpt_sync_cc.xml new file mode 100644 index 00000000..d311aa94 --- /dev/null +++ b/gr-noaa/grc/noaa_hrpt_sync_cc.xml @@ -0,0 +1,39 @@ + + + HRPT SYNC + noaa_hrpt_sync_cc + NOAA + from gnuradio import noaa + noaa.hrpt_sync_cc($alpha, $beta, $sps, $max_offset) + set_alpha($alpha) + set_beta($beta) + set_max_offset($max_offset) + + Alpha + alpha + real + + + Beta + beta + real + + + Samples/Symbol + sps + real + + + Max Offset + max_offset + real + + + in + complex + + + out + complex + + diff --git a/gr-noaa/grc/rx_poes.grc b/gr-noaa/grc/usrp_rx_hrpt.grc old mode 100755 new mode 100644 similarity index 72% rename from gr-noaa/grc/rx_poes.grc rename to gr-noaa/grc/usrp_rx_hrpt.grc index 1001049a..d3c6603a --- a/gr-noaa/grc/rx_poes.grc +++ b/gr-noaa/grc/usrp_rx_hrpt.grc @@ -1,11 +1,11 @@ - Sat Aug 22 13:06:22 2009 + Sat Aug 29 11:48:56 2009 options id - rx_poes + usrp_rx_hrpt _enabled @@ -13,7 +13,7 @@ title - + USRP HRPT Receiver author @@ -53,22 +53,22 @@ - variable + import id - decim + import_0 _enabled True - value - 16 + import + import math _coordinate - (97, 10) + (9, 202) _rotation @@ -76,22 +76,30 @@ - variable + gr_throttle id - sym_rate + throttle _enabled True - value - 600*1109 + type + complex + + + samples_per_second + sample_rate + + + vlen + 1 _coordinate - (286, 10) + (79, 518) _rotation @@ -99,22 +107,34 @@ - variable + gr_file_source id - sample_rate + src _enabled True - value - 64e6/decim + file + poes-d16.dat + + + type + complex + + + repeat + True + + + vlen + 1 _coordinate - (176, 12) + (34, 423) _rotation @@ -125,7 +145,7 @@ variable id - sps + decim _enabled @@ -133,11 +153,11 @@ value - sample_rate/sym_rate + 16 _coordinate - (382, 14) + (186, 10) _rotation @@ -160,7 +180,7 @@ _coordinate - (492, 16) + (589, 13) _rotation @@ -168,22 +188,22 @@ - import + variable id - import_0 + sym_rate _enabled True - import - import math + value + 600*1109 _coordinate - (9, 202) + (383, 7) _rotation @@ -194,7 +214,7 @@ variable id - max_offset + sps _enabled @@ -202,11 +222,11 @@ value - 2*math.pi*100e3/sample_rate + sample_rate/sym_rate _coordinate - (342, 95) + (479, 11) _rotation @@ -214,42 +234,85 @@ - variable_slider + variable id - pll_alpha + sample_rate _enabled True - label - PLL Alpha + value + 64e6/decim - value - 0.005 + _coordinate + (273, 9) - min - 0.0 + _rotation + 0 + + + wxgui_fftsink2 - max - 0.5 + id + rx_fftsink - num_steps - 500 + _enabled + True - style - wx.SL_HORIZONTAL + type + complex - converver - float_converter + title + RX Spectrum + + + samp_rate + sample_rate + + + baseband_freq + 1698e6 + + + y_per_div + 5 + + + y_divs + 8 + + + ref_level + 20 + + + fft_size + 1024 + + + fft_rate + 30 + + + peak_hold + False + + + average + True + + + avg_alpha + 0.1 grid_pos @@ -257,22 +320,22 @@ notebook - + displays, 0 _coordinate - (192, 100) + (194, 263) _rotation - 0 + 180 - gr_throttle + wxgui_scopesink2 id - throttle + wxgui_scopesink2_0 _enabled @@ -283,20 +346,48 @@ complex - samples_per_second + title + RX Waveform + + + samp_rate sample_rate - vlen + v_scale + 0 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode + False + + + num_inputs 1 + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 0 + _coordinate - (79, 518) + (198, 609) _rotation - 0 + 180 @@ -366,7 +457,7 @@ _coordinate - (429, 502) + (434, 502) _rotation @@ -374,30 +465,45 @@ - noaa_carrier_pll_cc + variable id - noaa_carrier_pll_cc_0 + max_carrier_offset _enabled True - alpha - pll_alpha + value + 2*math.pi*100e3/sample_rate - beta - pll_alpha**2/4.0 + _coordinate + (668, 107) - max_offset - max_offset + _rotation + 0 + + + + variable + + id + max_sync_offset + + + _enabled + True + + + value + 0.01 _coordinate - (636, 502) + (665, 173) _rotation @@ -405,58 +511,54 @@ - wxgui_scopesink2 + variable_slider id - wxgui_scopesink2_0 + pll_alpha _enabled True - type - complex - - - title - RX Waveform + label + PLL Alpha - samp_rate - sample_rate + value + 0.005 - v_scale - 0 + min + 0.0 - t_scale - 20.0/sample_rate + max + 0.5 - ac_couple - False + num_steps + 500 - xy_mode - False + style + wx.SL_HORIZONTAL - num_inputs - 1 + converver + float_converter grid_pos - 1, 0, 1, 1 + 0, 0, 1, 1 notebook - displays, 0 + _coordinate - (433, 612) + (192, 100) _rotation @@ -464,74 +566,85 @@ - wxgui_fftsink2 + variable_slider id - rx_fftsink + sync_alpha _enabled True - type - complex + label + SYNC Alpha - title - RX Spectrum + value + 0.005 - samp_rate - sample_rate + min + 0.0 - baseband_freq - 1698e6 + max + 0.5 - y_per_div - 5 + num_steps + 500 - y_divs - 8 + style + wx.SL_HORIZONTAL - ref_level - 20 + converver + float_converter - fft_size - 1024 + grid_pos + 0, 1, 1, 1 - fft_rate - 30 + notebook + - peak_hold - False + _coordinate + (344, 101) - average + _rotation + 0 + + + + noaa_hrpt_pll_cc + + id + noaa_hrpt_pll_cc_0 + + + _enabled True - avg_alpha - 0.1 + alpha + pll_alpha - grid_pos - 0, 0, 1, 1 + beta + pll_alpha**2/4.0 - notebook - displays, 0 + max_offset + max_carrier_offset _coordinate - (433, 241) + (628, 502) _rotation @@ -539,68 +652,69 @@ - gr_complex_to_imag + wxgui_scopesink2 id - gr_complex_to_imag_0 + wxgui_scopesink2_0_0 _enabled True - vlen - 1 + type + complex - _coordinate - (877, 522) + title + Post-PLL - _rotation - 0 + samp_rate + sample_rate - - - notebook - id - displays + v_scale + 0.5 - _enabled - True + t_scale + 20.0/sample_rate - style - wx.NB_TOP + ac_couple + False - labels - ['RX','Baseband'] + xy_mode + False + + + num_inputs + 1 grid_pos - 1, 0, 1, 1 + 0, 0, 1, 1 notebook - + displays, 1 _coordinate - (9, 99) + (618, 335) _rotation - 0 + 180 wxgui_scopesink2 id - wxgui_scopesink2_0_1_0_1 + wxgui_scopesink2_0_0_1 _enabled @@ -608,11 +722,11 @@ type - float + complex title - Manchester Symbols + Post-SYNC samp_rate @@ -624,7 +738,7 @@ t_scale - 5.0/sym_rate + 20.0/sample_rate ac_couple @@ -640,26 +754,61 @@ grid_pos - 1, 0, 1, 1 + 0, 0, 1, 1 notebook - displays, 1 + displays, 2 _coordinate - (856, 343) + (872, 341) _rotation 180 + + notebook + + id + displays + + + _enabled + True + + + style + wx.NB_TOP + + + labels + ['RX','PLL','SYNC'] + + + grid_pos + 1, 0, 1, 2 + + + notebook + + + + _coordinate + (9, 99) + + + _rotation + 0 + + wxgui_scopesink2 id - wxgui_scopesink2_0_0 + wxgui_scopesink2_0_0_0 _enabled @@ -671,7 +820,7 @@ title - Post-Filter/PLL + Post-PLL samp_rate @@ -691,7 +840,7 @@ xy_mode - False + True num_inputs @@ -699,7 +848,7 @@ grid_pos - 0, 0, 1, 1 + 1, 0, 1, 1 notebook @@ -707,7 +856,7 @@ _coordinate - (634, 335) + (618, 614) _rotation @@ -715,38 +864,97 @@ - gr_file_source + noaa_hrpt_sync_cc id - src + sync _enabled True - file - poes-d16.dat + alpha + sync_alpha + + + beta + sync_alpha**2/4.0 + + + sps + sps + + + max_offset + max_sync_offset + + + _coordinate + (865, 494) + + + _rotation + 0 + + + + wxgui_scopesink2 + + id + wxgui_scopesink2_0_0_0_0 + + + _enabled + True type complex - repeat + title + Post-SYNC + + + samp_rate + sample_rate + + + v_scale + 0.5 + + + t_scale + 20.0/sample_rate + + + ac_couple + False + + + xy_mode True - vlen + num_inputs 1 + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 2 + _coordinate - (34, 423) + (872, 607) _rotation - 0 + 180 @@ -755,12 +963,6 @@ 0 0 - - noaa_carrier_pll_cc_0 - gr_complex_to_imag_0 - 0 - 0 - throttle agr @@ -787,19 +989,37 @@ gr_moving_average_xx_0 - noaa_carrier_pll_cc_0 + noaa_hrpt_pll_cc_0 0 0 - noaa_carrier_pll_cc_0 + noaa_hrpt_pll_cc_0 wxgui_scopesink2_0_0 0 0 - gr_complex_to_imag_0 - wxgui_scopesink2_0_1_0_1 + noaa_hrpt_pll_cc_0 + wxgui_scopesink2_0_0_0 + 0 + 0 + + + noaa_hrpt_pll_cc_0 + sync + 0 + 0 + + + sync + wxgui_scopesink2_0_0_1 + 0 + 0 + + + sync + wxgui_scopesink2_0_0_0_0 0 0 diff --git a/gr-noaa/grc/usrp_rx_hrpt.py b/gr-noaa/grc/usrp_rx_hrpt.py new file mode 100755 index 00000000..ed641733 --- /dev/null +++ b/gr-noaa/grc/usrp_rx_hrpt.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python +################################################## +# Gnuradio Python Flow Graph +# Title: USRP HRPT Receiver +# Generated: Sat Aug 29 11:48:57 2009 +################################################## + +from gnuradio import gr +from gnuradio import noaa +from gnuradio.eng_option import eng_option +from gnuradio.wxgui import fftsink2 +from gnuradio.wxgui import forms +from gnuradio.wxgui import scopesink2 +from grc_gnuradio import wxgui as grc_wxgui +from optparse import OptionParser +import math +import wx + +class usrp_rx_hrpt(grc_wxgui.top_block_gui): + + def __init__(self): + grc_wxgui.top_block_gui.__init__(self, title="USRP HRPT Receiver") + + ################################################## + # Variables + ################################################## + self.decim = decim = 16 + 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.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) + + ################################################## + # Notebooks + ################################################## + self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP) + self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "PLL") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "SYNC") + self.GridAdd(self.displays, 1, 0, 1, 2) + + ################################################## + # Controls + ################################################## + _sync_alpha_sizer = wx.BoxSizer(wx.VERTICAL) + self._sync_alpha_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_sync_alpha_sizer, + value=self.sync_alpha, + callback=self.set_sync_alpha, + label="SYNC Alpha", + converter=forms.float_converter(), + proportion=0, + ) + self._sync_alpha_slider = forms.slider( + parent=self.GetWin(), + sizer=_sync_alpha_sizer, + value=self.sync_alpha, + callback=self.set_sync_alpha, + minimum=0.0, + maximum=0.5, + num_steps=500, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_sync_alpha_sizer, 0, 1, 1, 1) + _pll_alpha_sizer = wx.BoxSizer(wx.VERTICAL) + self._pll_alpha_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_pll_alpha_sizer, + value=self.pll_alpha, + callback=self.set_pll_alpha, + label="PLL Alpha", + converter=forms.float_converter(), + proportion=0, + ) + self._pll_alpha_slider = forms.slider( + parent=self.GetWin(), + sizer=_pll_alpha_sizer, + value=self.pll_alpha, + callback=self.set_pll_alpha, + minimum=0.0, + maximum=0.5, + num_steps=500, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_pll_alpha_sizer, 0, 0, 1, 1) + + ################################################## + # 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(), + baseband_freq=1698e6, + y_per_div=5, + y_divs=8, + ref_level=20, + sample_rate=sample_rate, + fft_size=1024, + fft_rate=30, + average=True, + avg_alpha=0.1, + title="RX Spectrum", + peak_hold=False, + ) + self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1) + self.src = gr.file_source(gr.sizeof_gr_complex*1, "poes-d16.dat", True) + self.sync = noaa.hrpt_sync_cc(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset) + self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate) + self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( + self.displays.GetPage(0).GetWin(), + title="RX Waveform", + sample_rate=sample_rate, + v_scale=0, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Post-PLL", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1) + self.wxgui_scopesink2_0_0_0 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Post-PLL", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_c( + self.displays.GetPage(2).GetWin(), + title="Post-SYNC", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_0_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_0_0_1 = scopesink2.scope_sink_c( + self.displays.GetPage(2).GetWin(), + title="Post-SYNC", + sample_rate=sample_rate, + v_scale=0.5, + t_scale=20.0/sample_rate, + ac_couple=False, + xy_mode=False, + num_inputs=1, + ) + self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_1.win, 0, 0, 1, 1) + + ################################################## + # Connections + ################################################## + 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)) + + def set_decim(self, decim): + self.decim = decim + self.set_sample_rate(64e6/self.decim) + + def set_sym_rate(self, sym_rate): + self.sym_rate = sym_rate + self.set_sps(self.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) + + def set_sps(self, sps): + self.sps = sps + self.set_hs(int(self.sps/2.0)) + + 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) + + 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) + + def set_max_sync_offset(self, max_sync_offset): + self.max_sync_offset = max_sync_offset + self.sync.set_max_offset(self.max_sync_offset) + + def set_max_carrier_offset(self, max_carrier_offset): + self.max_carrier_offset = max_carrier_offset + self.noaa_hrpt_pll_cc_0.set_max_offset(self.max_carrier_offset) + + 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]") + (options, args) = parser.parse_args() + tb = usrp_rx_hrpt() + tb.Run(True) + diff --git a/gr-noaa/grc/rx_goes.grc b/gr-noaa/grc/usrp_rx_lrit.grc old mode 100755 new mode 100644 similarity index 96% rename from gr-noaa/grc/rx_goes.grc rename to gr-noaa/grc/usrp_rx_lrit.grc index ebd21da4..55fe3978 --- a/gr-noaa/grc/rx_goes.grc +++ b/gr-noaa/grc/usrp_rx_lrit.grc @@ -1,11 +1,11 @@ - Sat Aug 1 22:58:41 2009 + Sat Aug 29 11:26:03 2009 options id - rx_goes + usrp_rx_lrit _enabled @@ -13,7 +13,7 @@ title - USRP GOES Receiver + USRP LRIT Receiver author @@ -122,10 +122,10 @@ - variable_slider + variable_text_box id - gain + decim _enabled @@ -133,35 +133,23 @@ label - Gain + Decim value - saved_gain - - - min - 0 - - - max - 115 - - - num_steps - 115 + saved_decim - style - wx.SL_HORIZONTAL + converver + int_converter - converver - float_converter + formatter + None grid_pos - 0, 1, 1, 1 + 0, 0, 1, 1 notebook @@ -169,7 +157,7 @@ _coordinate - (392, 12) + (243, 13) _rotation @@ -177,42 +165,58 @@ - variable_config + wxgui_scopesink2 id - saved_gain + wxgui_scopesink2_0 _enabled True - value - 33 + type + complex - type - real + title + Waveform - config_file - rx_goes.cfg + samp_rate + samp_rate - section - main + v_scale + 0.5 - option - gain + t_scale + 20.0/samp_rate - writeback - gain + ac_couple + False + + + xy_mode + True + + + num_inputs + 1 + + + grid_pos + 1, 0, 1, 1 + + + notebook + displays, 0 _coordinate - (392, 163) + (434, 551) _rotation @@ -220,42 +224,38 @@ - variable_config + gr_agc_xx id - saved_gain_mu + gr_agc_xx_0 _enabled True - - value - 0.005 - type - real + complex - config_file - rx_goes.cfg + rate + 1e-6 - section - main + reference + 1.0 - option - gain_mu + gain + 1.0/32767.0 - writeback - gain_mu + max_gain + 1.0 _coordinate - (835, 162) + (261, 493) _rotation @@ -263,42 +263,50 @@ - variable_config + root_raised_cosine_filter id - saved_costas_alpha + root_raised_cosine_filter_0 _enabled - True + False - value - 0.005 + type + fir_filter_ccf - type - real + decim + 1 - config_file - rx_goes.cfg + interp + 1 - section - main + gain + 1 - option - costas_alpha + samp_rate + samp_rate - writeback - costas_alpha + sym_rate + symbol_rate + + + alpha + 0.5 + + + ntaps + 50 _coordinate - (688, 162) + (618, 373) _rotation @@ -306,54 +314,58 @@ - variable_slider + usrp_simple_source_x id - gain_mu + usrp_simple_source_x_0 _enabled - True + False - label - Gain Mu + type + complex - value - saved_gain_mu + format + - min + which 0 - max - 0.5 + decimation + decim - num_steps - 100 + frequency + freq - style - wx.SL_HORIZONTAL + lo_offset + float('inf') - converver - float_converter + gain + gain - grid_pos - 1, 1, 1, 1 + side + B - notebook + rx_ant + RXA + + + hb_filters _coordinate - (833, 14) + (11, 477) _rotation @@ -361,54 +373,74 @@ - variable_slider + wxgui_fftsink2 id - costas_alpha + wxgui_fftsink2_0 _enabled True - label - Costas Alpha + type + complex - value - saved_costas_alpha + title + Spectrum - min - 0 + samp_rate + samp_rate - max - 0.5 + baseband_freq + freq - num_steps - 100 + y_per_div + 10 - style - wx.SL_HORIZONTAL + y_divs + 10 - converver - float_converter + ref_level + 50 + + + fft_size + 1024 + + + fft_rate + 30 + + + peak_hold + False + + + average + False + + + avg_alpha + 0 grid_pos - 1, 0, 1, 1 + 0, 0, 1, 1 notebook - + displays, 0 _coordinate - (688, 13) + (434, 337) _rotation @@ -416,54 +448,30 @@ - variable_slider + gr_throttle id - freq + gr_throttle_0 _enabled True - label - Frequency + type + complex - value - saved_freq + samples_per_second + samp_rate - min - 135e6 - - - max - 139e6 - - - num_steps - 400 - - - style - wx.SL_HORIZONTAL - - - converver - float_converter - - - grid_pos - 0, 2, 1, 1 - - - notebook - + vlen + 1 _coordinate - (540, 13) + (181, 663) _rotation @@ -471,42 +479,58 @@ - variable_config + wxgui_scopesink2 id - saved_freq + wxgui_scopesink2_1 _enabled True - value - 137e6 + type + complex - type - real + title + Scope Plot - config_file - rx_goes.cfg + samp_rate + samp_rate - section - main + v_scale + 0.4 - option - freq + t_scale + 20.0/samp_rate - writeback - freq + ac_couple + False + + + xy_mode + True + + + num_inputs + 1 + + + grid_pos + 0, 0, 1, 1 + + + notebook + displays, 1 _coordinate - (541, 162) + (1126, 251) _rotation @@ -514,42 +538,30 @@ - variable_config + gr_probe_mpsk_snr_c id - saved_decim + gr_probe_mpsk_snr_c_0 _enabled True - - value - 160 - type - int - - - config_file - rx_goes.cfg - - - section - main + snr - option - decim + alpha + 0.0001 - writeback - decim + probe_rate + 10 _coordinate - (245, 161) + (1126, 723) _rotation @@ -557,77 +569,82 @@ - variable_text_box + wxgui_numbersink2 id - decim + wxgui_numbersink2_0 _enabled True - label - Decim + type + float - value - saved_decim + title + SNR - converver - int_converter + units + dB - formatter - None + samp_rate + 10 - grid_pos - 0, 0, 1, 1 + min_value + 0 - notebook - + max_value + 30 - _coordinate - (243, 13) + factor + 1.0 - _rotation + decimal_places + 1 + + + ref_level 0 - - - notebook - id - displays + number_rate + 10 - _enabled - True + peak_hold + False - style - wx.NB_TOP + average + False - labels - ['USRP RX', 'Costas Output'] + avg_alpha + 0 + + + show_gauge + True grid_pos - 2, 0, 1, 3 + 2, 0, 1, 1 notebook - + displays, 1 _coordinate - (12, 287) + (1335, 651) _rotation @@ -635,58 +652,62 @@ - wxgui_scopesink2 + gr_mpsk_receiver_cc id - wxgui_scopesink2_0 + gr_mpsk_receiver_cc_0 _enabled True - type - complex + M + 2 - title - Waveform + theta + 0 - samp_rate - samp_rate + alpha + costas_alpha - v_scale - 0.5 + beta + costas_alpha*costas_alpha/4.0 - t_scale - 20.0/samp_rate + fmin + -0.05 - ac_couple - False + fmax + 0.05 - xy_mode - True + mu + 0.5 - num_inputs - 1 + gain_mu + gain_mu - grid_pos - 1, 0, 1, 1 + omega + sps - notebook - displays, 0 + gain_omega + gain_mu*gain_mu/4.0 + + + omega_relative_limit + 0.05 _coordinate - (434, 551) + (881, 437) _rotation @@ -694,38 +715,41 @@ - gr_agc_xx + gr_complex_to_real id - gr_agc_xx_0 + gr_complex_to_real_0 _enabled True - type - complex + vlen + 1 - rate - 1e-6 + _coordinate + (1133, 521) - reference - 1.0 + _rotation + 0 + + + gr_char_to_float - gain - 1.0/32767.0 + id + gr_char_to_float_0 - max_gain - 1.0 + _enabled + True _coordinate - (261, 493) + (1523, 521) _rotation @@ -733,50 +757,49 @@ - root_raised_cosine_filter + gr_binary_slicer_fb id - root_raised_cosine_filter_0 + gr_binary_slicer_fb_0 _enabled - False - - - type - fir_filter_ccf + True - decim - 1 + _coordinate + (1343, 521) - interp - 1 + _rotation + 0 + + + gr_add_const_vxx - gain - 1 + id + gr_add_const_vxx_0 - samp_rate - samp_rate + _enabled + True - sym_rate - symbol_rate + type + float - alpha - 0.5 + const + 48.0 - ntaps - 50 + vlen + 1 _coordinate - (618, 373) + (1707, 517) _rotation @@ -784,58 +807,49 @@ - usrp_simple_source_x + gr_float_to_char id - usrp_simple_source_x_0 + gr_float_to_char_0 _enabled - False - - - type - complex + True - format - + _coordinate + (1878, 521) - which + _rotation 0 + + + gr_file_sink - decimation - decim - - - frequency - freq - - - lo_offset - float('inf') + id + gr_file_sink_0 - gain - gain + _enabled + True - side - B + file + bits.dat - rx_ant - RXA + type + byte - hb_filters - + vlen + 1 _coordinate - (11, 477) + (2059, 517) _rotation @@ -843,74 +857,69 @@ - wxgui_fftsink2 + gr_file_source id - wxgui_fftsink2_0 + gr_file_source_0 _enabled True - type - complex - - - title - Spectrum - - - samp_rate - samp_rate + file + lrit.dat - baseband_freq - freq + type + complex - y_per_div - 10 + repeat + False - y_divs - 10 + vlen + 1 - ref_level - 50 + _coordinate + (11, 655) - fft_size - 1024 + _rotation + 0 + + + notebook - fft_rate - 30 + id + displays - peak_hold - False + _enabled + True - average - False + style + wx.NB_TOP - avg_alpha - 0 + labels + ['USRP RX', 'Costas Output'] grid_pos - 0, 0, 1, 1 + 2, 0, 1, 3 notebook - displays, 0 + _coordinate - (434, 337) + (14, 351) _rotation @@ -918,30 +927,42 @@ - gr_throttle + variable_config id - gr_throttle_0 + saved_decim _enabled True + + value + 160 + type - complex + int - samples_per_second - samp_rate + config_file + config_filename - vlen - 1 + section + main + + + option + decim + + + writeback + decim _coordinate - (181, 663) + (246, 172) _rotation @@ -949,58 +970,54 @@ - wxgui_scopesink2 + variable_slider id - wxgui_scopesink2_1 + gain _enabled True - type - complex - - - title - Scope Plot + label + Gain - samp_rate - samp_rate + value + saved_gain - v_scale - 0.4 + min + 0 - t_scale - 20.0/samp_rate + max + 115 - ac_couple - False + num_steps + 115 - xy_mode - True + style + wx.SL_HORIZONTAL - num_inputs - 1 + converver + float_converter grid_pos - 0, 0, 1, 1 + 0, 1, 1, 1 notebook - displays, 1 + _coordinate - (1126, 251) + (411, 11) _rotation @@ -1008,30 +1025,42 @@ - gr_probe_mpsk_snr_c + variable_config id - gr_probe_mpsk_snr_c_0 + saved_gain _enabled True + + value + 33 + type - snr + real - alpha - 0.0001 + config_file + config_filename - probe_rate - 10 + section + main + + + option + gain + + + writeback + gain _coordinate - (1126, 723) + (412, 172) _rotation @@ -1039,82 +1068,97 @@ - wxgui_numbersink2 + variable_slider id - wxgui_numbersink2_0 + freq _enabled True - type - float + label + Frequency - title - SNR + value + saved_freq - units - dB + min + 135e6 - samp_rate - 10 + max + 139e6 - min_value - 0 + num_steps + 400 - max_value - 30 + style + wx.SL_HORIZONTAL - factor - 1.0 + converver + float_converter - decimal_places - 1 + grid_pos + 0, 2, 1, 1 - ref_level + notebook + + + + _coordinate + (574, 12) + + + _rotation 0 + + + variable_config - number_rate - 10 + id + saved_freq - peak_hold - False + _enabled + True - average - False + value + 137e6 - avg_alpha - 0 + type + real - show_gauge - True + config_file + config_filename - grid_pos - 2, 0, 1, 1 + section + main - notebook - displays, 1 + option + freq + + + writeback + freq _coordinate - (1335, 651) + (576, 170) _rotation @@ -1122,62 +1166,54 @@ - gr_mpsk_receiver_cc + variable_slider id - gr_mpsk_receiver_cc_0 + costas_alpha _enabled True - M - 2 - - - theta - 0 - - - alpha - costas_alpha + label + Costas Alpha - beta - costas_alpha*costas_alpha/4.0 + value + saved_costas_alpha - fmin - -0.05 + min + 0 - fmax - 0.05 + max + 0.5 - mu - 0.5 + num_steps + 100 - gain_mu - gain_mu + style + wx.SL_HORIZONTAL - omega - sps + converver + float_converter - gain_omega - gain_mu*gain_mu/4.0 + grid_pos + 1, 0, 1, 1 - omega_relative_limit - 0.05 + notebook + _coordinate - (881, 437) + (738, 13) _rotation @@ -1185,41 +1221,42 @@ - gr_complex_to_real + variable_config id - gr_complex_to_real_0 + saved_costas_alpha _enabled True - vlen - 1 + value + 0.005 - _coordinate - (1133, 521) + type + real - _rotation - 0 + config_file + config_filename - - - gr_char_to_float - id - gr_char_to_float_0 + section + main - _enabled - True + option + costas_alpha + + + writeback + costas_alpha _coordinate - (1523, 521) + (739, 170) _rotation @@ -1227,49 +1264,42 @@ - gr_binary_slicer_fb + variable_config id - gr_binary_slicer_fb_0 + saved_gain_mu _enabled True - _coordinate - (1343, 521) - - - _rotation - 0 + value + 0.005 - - - gr_add_const_vxx - id - gr_add_const_vxx_0 + type + real - _enabled - True + config_file + config_filename - type - float + section + main - const - 48.0 + option + gain_mu - vlen - 1 + writeback + gain_mu _coordinate - (1707, 517) + (900, 170) _rotation @@ -1277,49 +1307,54 @@ - gr_float_to_char + variable_slider id - gr_float_to_char_0 + gain_mu _enabled True - _coordinate - (1878, 521) + label + Gain Mu - _rotation + value + saved_gain_mu + + + min 0 - - - gr_file_sink - id - gr_file_sink_0 + max + 0.5 - _enabled - True + num_steps + 100 - file - bits.dat + style + wx.SL_HORIZONTAL - type - byte + converver + float_converter - vlen - 1 + grid_pos + 1, 1, 1, 1 + + + notebook + _coordinate - (2059, 517) + (902, 13) _rotation @@ -1327,34 +1362,22 @@ - gr_file_source + variable id - gr_file_source_0 + config_filename _enabled True - file - lrit.dat - - - type - complex - - - repeat - False - - - vlen - 1 + value + "usrp_rx_lrit.cfg" _coordinate - (11, 655) + (13, 283) _rotation diff --git a/gr-noaa/grc/usrp_rx_lrit.py b/gr-noaa/grc/usrp_rx_lrit.py new file mode 100755 index 00000000..bc313e3a --- /dev/null +++ b/gr-noaa/grc/usrp_rx_lrit.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python +################################################## +# Gnuradio Python Flow Graph +# Title: USRP LRIT Receiver +# Generated: Sat Aug 29 11:26:03 2009 +################################################## + +from gnuradio import gr +from gnuradio.eng_option import eng_option +from gnuradio.wxgui import fftsink2 +from gnuradio.wxgui import forms +from gnuradio.wxgui import numbersink2 +from gnuradio.wxgui import scopesink2 +from grc_gnuradio import blks2 as grc_blks2 +from grc_gnuradio import wxgui as grc_wxgui +from optparse import OptionParser +import ConfigParser +import wx + +class usrp_rx_lrit(grc_wxgui.top_block_gui): + + def __init__(self): + grc_wxgui.top_block_gui.__init__(self, title="USRP LRIT Receiver") + + ################################################## + # Variables + ################################################## + self.config_filename = config_filename = "usrp_rx_lrit.cfg" + self._saved_decim_config = ConfigParser.ConfigParser() + self._saved_decim_config.read(config_filename) + try: saved_decim = self._saved_decim_config.getint("main", "decim") + except: saved_decim = 160 + self.saved_decim = saved_decim + self.decim = decim = saved_decim + self.symbol_rate = symbol_rate = 293e3 + self._saved_gain_mu_config = ConfigParser.ConfigParser() + self._saved_gain_mu_config.read(config_filename) + try: saved_gain_mu = self._saved_gain_mu_config.getfloat("main", "gain_mu") + except: saved_gain_mu = 0.005 + self.saved_gain_mu = saved_gain_mu + self._saved_gain_config = ConfigParser.ConfigParser() + self._saved_gain_config.read(config_filename) + try: saved_gain = self._saved_gain_config.getfloat("main", "gain") + except: saved_gain = 33 + self.saved_gain = saved_gain + self._saved_freq_config = ConfigParser.ConfigParser() + self._saved_freq_config.read(config_filename) + try: saved_freq = self._saved_freq_config.getfloat("main", "freq") + except: saved_freq = 137e6 + self.saved_freq = saved_freq + self._saved_costas_alpha_config = ConfigParser.ConfigParser() + self._saved_costas_alpha_config.read(config_filename) + try: saved_costas_alpha = self._saved_costas_alpha_config.getfloat("main", "costas_alpha") + except: saved_costas_alpha = 0.005 + self.saved_costas_alpha = saved_costas_alpha + self.samp_rate = samp_rate = 64e6/decim + self.sps = sps = samp_rate/symbol_rate + self.gain_mu = gain_mu = saved_gain_mu + self.gain = gain = saved_gain + self.freq = freq = saved_freq + self.costas_alpha = costas_alpha = saved_costas_alpha + + ################################################## + # Notebooks + ################################################## + self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP) + self.displays.AddPage(grc_wxgui.Panel(self.displays), "USRP RX") + self.displays.AddPage(grc_wxgui.Panel(self.displays), "Costas Output") + self.GridAdd(self.displays, 2, 0, 1, 3) + + ################################################## + # Controls + ################################################## + self._decim_text_box = forms.text_box( + parent=self.GetWin(), + value=self.decim, + callback=self.set_decim, + label="Decim", + converter=forms.int_converter(), + ) + self.GridAdd(self._decim_text_box, 0, 0, 1, 1) + _gain_mu_sizer = wx.BoxSizer(wx.VERTICAL) + self._gain_mu_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_gain_mu_sizer, + value=self.gain_mu, + callback=self.set_gain_mu, + label="Gain Mu", + converter=forms.float_converter(), + proportion=0, + ) + self._gain_mu_slider = forms.slider( + parent=self.GetWin(), + sizer=_gain_mu_sizer, + value=self.gain_mu, + callback=self.set_gain_mu, + minimum=0, + maximum=0.5, + num_steps=100, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_gain_mu_sizer, 1, 1, 1, 1) + _gain_sizer = wx.BoxSizer(wx.VERTICAL) + self._gain_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_gain_sizer, + value=self.gain, + callback=self.set_gain, + label="Gain", + converter=forms.float_converter(), + proportion=0, + ) + self._gain_slider = forms.slider( + parent=self.GetWin(), + sizer=_gain_sizer, + value=self.gain, + callback=self.set_gain, + minimum=0, + maximum=115, + num_steps=115, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_gain_sizer, 0, 1, 1, 1) + _freq_sizer = wx.BoxSizer(wx.VERTICAL) + self._freq_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_freq_sizer, + value=self.freq, + callback=self.set_freq, + label="Frequency", + converter=forms.float_converter(), + proportion=0, + ) + self._freq_slider = forms.slider( + parent=self.GetWin(), + sizer=_freq_sizer, + value=self.freq, + callback=self.set_freq, + minimum=135e6, + maximum=139e6, + num_steps=400, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_freq_sizer, 0, 2, 1, 1) + _costas_alpha_sizer = wx.BoxSizer(wx.VERTICAL) + self._costas_alpha_text_box = forms.text_box( + parent=self.GetWin(), + sizer=_costas_alpha_sizer, + value=self.costas_alpha, + callback=self.set_costas_alpha, + label="Costas Alpha", + converter=forms.float_converter(), + proportion=0, + ) + self._costas_alpha_slider = forms.slider( + parent=self.GetWin(), + sizer=_costas_alpha_sizer, + value=self.costas_alpha, + callback=self.set_costas_alpha, + minimum=0, + maximum=0.5, + num_steps=100, + style=wx.SL_HORIZONTAL, + cast=float, + proportion=1, + ) + self.GridAdd(_costas_alpha_sizer, 1, 0, 1, 1) + + ################################################## + # Blocks + ################################################## + self.gr_add_const_vxx_0 = gr.add_const_vff((48.0, )) + self.gr_agc_xx_0 = gr.agc_cc(1e-6, 1.0, 1.0/32767.0, 1.0) + self.gr_binary_slicer_fb_0 = gr.binary_slicer_fb() + self.gr_char_to_float_0 = gr.char_to_float() + self.gr_complex_to_real_0 = gr.complex_to_real(1) + self.gr_file_sink_0 = gr.file_sink(gr.sizeof_char*1, "bits.dat") + self.gr_file_source_0 = gr.file_source(gr.sizeof_gr_complex*1, "lrit.dat", False) + self.gr_float_to_char_0 = gr.float_to_char() + self.gr_mpsk_receiver_cc_0 = gr.mpsk_receiver_cc(2, 0, costas_alpha, costas_alpha*costas_alpha/4.0, -0.05, 0.05, 0.5, gain_mu, sps, gain_mu*gain_mu/4.0, 0.05) + self.gr_probe_mpsk_snr_c_0 = grc_blks2.probe_mpsk_snr_c( + type='snr', + alpha=0.0001, + probe_rate=10, + ) + self.gr_throttle_0 = gr.throttle(gr.sizeof_gr_complex*1, samp_rate) + self.wxgui_fftsink2_0 = fftsink2.fft_sink_c( + self.displays.GetPage(0).GetWin(), + baseband_freq=freq, + y_per_div=10, + y_divs=10, + ref_level=50, + sample_rate=samp_rate, + fft_size=1024, + fft_rate=30, + average=False, + avg_alpha=None, + title="Spectrum", + peak_hold=False, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1) + self.wxgui_numbersink2_0 = numbersink2.number_sink_f( + self.displays.GetPage(1).GetWin(), + unit="dB", + minval=0, + maxval=30, + factor=1.0, + decimal_places=1, + ref_level=0, + sample_rate=10, + number_rate=10, + average=False, + avg_alpha=None, + label="SNR", + peak_hold=False, + show_gauge=True, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_numbersink2_0.win, 2, 0, 1, 1) + self.wxgui_scopesink2_0 = scopesink2.scope_sink_c( + self.displays.GetPage(0).GetWin(), + title="Waveform", + sample_rate=samp_rate, + v_scale=0.5, + t_scale=20.0/samp_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1) + self.wxgui_scopesink2_1 = scopesink2.scope_sink_c( + self.displays.GetPage(1).GetWin(), + title="Scope Plot", + sample_rate=samp_rate, + v_scale=0.4, + t_scale=20.0/samp_rate, + ac_couple=False, + xy_mode=True, + num_inputs=1, + ) + self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_1.win, 0, 0, 1, 1) + + ################################################## + # Connections + ################################################## + self.connect((self.gr_agc_xx_0, 0), (self.wxgui_scopesink2_0, 0)) + self.connect((self.gr_file_source_0, 0), (self.gr_throttle_0, 0)) + self.connect((self.gr_throttle_0, 0), (self.gr_agc_xx_0, 0)) + self.connect((self.gr_probe_mpsk_snr_c_0, 0), (self.wxgui_numbersink2_0, 0)) + self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_probe_mpsk_snr_c_0, 0)) + self.connect((self.gr_agc_xx_0, 0), (self.gr_mpsk_receiver_cc_0, 0)) + self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0)) + self.connect((self.gr_agc_xx_0, 0), (self.wxgui_fftsink2_0, 0)) + self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_complex_to_real_0, 0)) + self.connect((self.gr_complex_to_real_0, 0), (self.gr_binary_slicer_fb_0, 0)) + self.connect((self.gr_binary_slicer_fb_0, 0), (self.gr_char_to_float_0, 0)) + self.connect((self.gr_char_to_float_0, 0), (self.gr_add_const_vxx_0, 0)) + self.connect((self.gr_add_const_vxx_0, 0), (self.gr_float_to_char_0, 0)) + self.connect((self.gr_float_to_char_0, 0), (self.gr_file_sink_0, 0)) + + def set_config_filename(self, config_filename): + self.config_filename = config_filename + self._saved_decim_config = ConfigParser.ConfigParser() + self._saved_decim_config.read(self.config_filename) + if not self._saved_decim_config.has_section("main"): + self._saved_decim_config.add_section("main") + self._saved_decim_config.set("main", "decim", str(self.decim)) + self._saved_decim_config.write(open(self.config_filename, 'w')) + self._saved_gain_config = ConfigParser.ConfigParser() + self._saved_gain_config.read(self.config_filename) + if not self._saved_gain_config.has_section("main"): + self._saved_gain_config.add_section("main") + self._saved_gain_config.set("main", "gain", str(self.gain)) + self._saved_gain_config.write(open(self.config_filename, 'w')) + self._saved_freq_config = ConfigParser.ConfigParser() + self._saved_freq_config.read(self.config_filename) + if not self._saved_freq_config.has_section("main"): + self._saved_freq_config.add_section("main") + self._saved_freq_config.set("main", "freq", str(self.freq)) + self._saved_freq_config.write(open(self.config_filename, 'w')) + self._saved_costas_alpha_config = ConfigParser.ConfigParser() + self._saved_costas_alpha_config.read(self.config_filename) + if not self._saved_costas_alpha_config.has_section("main"): + self._saved_costas_alpha_config.add_section("main") + self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha)) + self._saved_costas_alpha_config.write(open(self.config_filename, 'w')) + self._saved_gain_mu_config = ConfigParser.ConfigParser() + self._saved_gain_mu_config.read(self.config_filename) + if not self._saved_gain_mu_config.has_section("main"): + self._saved_gain_mu_config.add_section("main") + self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu)) + self._saved_gain_mu_config.write(open(self.config_filename, 'w')) + + def set_saved_decim(self, saved_decim): + self.saved_decim = saved_decim + self.set_decim(self.saved_decim) + + def set_decim(self, decim): + self.decim = decim + self.set_samp_rate(64e6/self.decim) + self._decim_text_box.set_value(self.decim) + self._saved_decim_config = ConfigParser.ConfigParser() + self._saved_decim_config.read(self.config_filename) + if not self._saved_decim_config.has_section("main"): + self._saved_decim_config.add_section("main") + self._saved_decim_config.set("main", "decim", str(self.decim)) + self._saved_decim_config.write(open(self.config_filename, 'w')) + + def set_symbol_rate(self, symbol_rate): + self.symbol_rate = symbol_rate + self.set_sps(self.samp_rate/self.symbol_rate) + + def set_saved_gain_mu(self, saved_gain_mu): + self.saved_gain_mu = saved_gain_mu + self.set_gain_mu(self.saved_gain_mu) + + def set_saved_gain(self, saved_gain): + self.saved_gain = saved_gain + self.set_gain(self.saved_gain) + + def set_saved_freq(self, saved_freq): + self.saved_freq = saved_freq + self.set_freq(self.saved_freq) + + def set_saved_costas_alpha(self, saved_costas_alpha): + self.saved_costas_alpha = saved_costas_alpha + self.set_costas_alpha(self.saved_costas_alpha) + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.set_sps(self.samp_rate/self.symbol_rate) + self.wxgui_scopesink2_0.set_sample_rate(self.samp_rate) + self.wxgui_fftsink2_0.set_sample_rate(self.samp_rate) + self.wxgui_scopesink2_1.set_sample_rate(self.samp_rate) + + def set_sps(self, sps): + self.sps = sps + self.gr_mpsk_receiver_cc_0.set_omega(self.sps) + + def set_gain_mu(self, gain_mu): + self.gain_mu = gain_mu + self.gr_mpsk_receiver_cc_0.set_gain_mu(self.gain_mu) + self.gr_mpsk_receiver_cc_0.set_gain_omega(self.gain_mu*self.gain_mu/4.0) + self._saved_gain_mu_config = ConfigParser.ConfigParser() + self._saved_gain_mu_config.read(self.config_filename) + if not self._saved_gain_mu_config.has_section("main"): + self._saved_gain_mu_config.add_section("main") + self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu)) + self._saved_gain_mu_config.write(open(self.config_filename, 'w')) + self._gain_mu_slider.set_value(self.gain_mu) + self._gain_mu_text_box.set_value(self.gain_mu) + + def set_gain(self, gain): + self.gain = gain + self._gain_slider.set_value(self.gain) + self._gain_text_box.set_value(self.gain) + self._saved_gain_config = ConfigParser.ConfigParser() + self._saved_gain_config.read(self.config_filename) + if not self._saved_gain_config.has_section("main"): + self._saved_gain_config.add_section("main") + self._saved_gain_config.set("main", "gain", str(self.gain)) + self._saved_gain_config.write(open(self.config_filename, 'w')) + + def set_freq(self, freq): + self.freq = freq + self.wxgui_fftsink2_0.set_baseband_freq(self.freq) + self._freq_slider.set_value(self.freq) + self._freq_text_box.set_value(self.freq) + self._saved_freq_config = ConfigParser.ConfigParser() + self._saved_freq_config.read(self.config_filename) + if not self._saved_freq_config.has_section("main"): + self._saved_freq_config.add_section("main") + self._saved_freq_config.set("main", "freq", str(self.freq)) + self._saved_freq_config.write(open(self.config_filename, 'w')) + + def set_costas_alpha(self, costas_alpha): + self.costas_alpha = costas_alpha + self.gr_mpsk_receiver_cc_0.set_alpha(self.costas_alpha) + self.gr_mpsk_receiver_cc_0.set_beta(self.costas_alpha*self.costas_alpha/4.0) + self._costas_alpha_slider.set_value(self.costas_alpha) + self._costas_alpha_text_box.set_value(self.costas_alpha) + self._saved_costas_alpha_config = ConfigParser.ConfigParser() + self._saved_costas_alpha_config.read(self.config_filename) + if not self._saved_costas_alpha_config.has_section("main"): + self._saved_costas_alpha_config.add_section("main") + self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha)) + self._saved_costas_alpha_config.write(open(self.config_filename, 'w')) + +if __name__ == '__main__': + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + (options, args) = parser.parse_args() + tb = usrp_rx_lrit() + tb.Run(True) + diff --git a/gr-noaa/lib/Makefile.am b/gr-noaa/lib/Makefile.am index 39a4f115..2690ddb5 100644 --- a/gr-noaa/lib/Makefile.am +++ b/gr-noaa/lib/Makefile.am @@ -29,7 +29,8 @@ lib_LTLIBRARIES = \ libgnuradio-noaa.la libgnuradio_noaa_la_SOURCES = \ - noaa_carrier_pll_cc.cc + noaa_hrpt_pll_cc.cc \ + noaa_hrpt_sync_cc.cc libgnuradio_noaa_la_LIBADD = \ $(GNURADIO_CORE_LA) @@ -37,4 +38,5 @@ libgnuradio_noaa_la_LIBADD = \ libgnuradio_noaa_la_LDFLAGS = $(NO_UNDEFINED) -version-info 0:0:0 grinclude_HEADERS = \ - noaa_carrier_pll_cc.h + noaa_hrpt_pll_cc.h \ + noaa_hrpt_sync_cc.h diff --git a/gr-noaa/lib/noaa_carrier_pll_cc.cc b/gr-noaa/lib/noaa_hrpt_pll_cc.cc similarity index 83% rename from gr-noaa/lib/noaa_carrier_pll_cc.cc rename to gr-noaa/lib/noaa_hrpt_pll_cc.cc index d6a86faa..46fe24da 100644 --- a/gr-noaa/lib/noaa_carrier_pll_cc.cc +++ b/gr-noaa/lib/noaa_hrpt_pll_cc.cc @@ -24,21 +24,21 @@ #include "config.h" #endif -#include +#include #include #include #include #define M_TWOPI (2*M_PI) -noaa_carrier_pll_cc_sptr -noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset) +noaa_hrpt_pll_cc_sptr +noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset) { - return gnuradio::get_initial_sptr(new noaa_carrier_pll_cc(alpha, beta, max_offset)); + return gnuradio::get_initial_sptr(new noaa_hrpt_pll_cc(alpha, beta, max_offset)); } -noaa_carrier_pll_cc::noaa_carrier_pll_cc(float alpha, float beta, float max_offset) - : gr_sync_block("noaa_carrier_pll_cc", +noaa_hrpt_pll_cc::noaa_hrpt_pll_cc(float alpha, float beta, float max_offset) + : gr_sync_block("noaa_hrpt_pll_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_max_offset(max_offset), @@ -58,7 +58,7 @@ phase_wrap(float phase) } int -noaa_carrier_pll_cc::work(int noutput_items, +noaa_hrpt_pll_cc::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { diff --git a/gr-noaa/lib/noaa_carrier_pll_cc.h b/gr-noaa/lib/noaa_hrpt_pll_cc.h similarity index 73% rename from gr-noaa/lib/noaa_carrier_pll_cc.h rename to gr-noaa/lib/noaa_hrpt_pll_cc.h index 8e6de866..81045440 100644 --- a/gr-noaa/lib/noaa_carrier_pll_cc.h +++ b/gr-noaa/lib/noaa_hrpt_pll_cc.h @@ -20,21 +20,21 @@ * Boston, MA 02110-1301, USA. */ -#ifndef INCLUDED_NOAA_CARRIER_PLL_CC_H -#define INCLUDED_NOAA_CARRIER_PLL_CC_H +#ifndef INCLUDED_NOAA_HRPT_PLL_CC_H +#define INCLUDED_NOAA_HRPT_PLL_CC_H #include -class noaa_carrier_pll_cc; -typedef boost::shared_ptr noaa_carrier_pll_cc_sptr; +class noaa_hrpt_pll_cc; +typedef boost::shared_ptr noaa_hrpt_pll_cc_sptr; -noaa_carrier_pll_cc_sptr -noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset); +noaa_hrpt_pll_cc_sptr +noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset); -class noaa_carrier_pll_cc : public gr_sync_block +class noaa_hrpt_pll_cc : public gr_sync_block { - friend noaa_carrier_pll_cc_sptr noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset); - noaa_carrier_pll_cc(float alpha, float beta, float max_offset); + friend noaa_hrpt_pll_cc_sptr noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset); + noaa_hrpt_pll_cc(float alpha, float beta, float max_offset); float d_alpha; // 1st order loop constant float d_beta; // 2nd order loop constant @@ -52,4 +52,4 @@ class noaa_carrier_pll_cc : public gr_sync_block void set_max_offset(float max_offset) { d_max_offset = max_offset; } }; -#endif /* INCLUDED_NOAA_CARRIER_PLL_CC_H */ +#endif /* INCLUDED_NOAA_HRPT_PLL_CC_H */ diff --git a/gr-noaa/lib/noaa_hrpt_sync_cc.cc b/gr-noaa/lib/noaa_hrpt_sync_cc.cc new file mode 100644 index 00000000..47858d75 --- /dev/null +++ b/gr-noaa/lib/noaa_hrpt_sync_cc.cc @@ -0,0 +1,62 @@ +/* -*- 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 + +noaa_hrpt_sync_cc_sptr +noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset) +{ + return gnuradio::get_initial_sptr(new noaa_hrpt_sync_cc(alpha, beta, sps, max_offset)); +} + +noaa_hrpt_sync_cc::noaa_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset) + : 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) +{ +} + +int +noaa_hrpt_sync_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + int ninputs = ninput_items[0]; + const gr_complex *in = (const gr_complex *) input_items[0]; + gr_complex *out = (gr_complex *) output_items[0]; + + int i = 0, j = 0; + while (i < ninputs && j < noutput_items) { + out[j++] = in[i++]; + } + + consume_each(i); + return j; +} diff --git a/gr-noaa/lib/noaa_hrpt_sync_cc.h b/gr-noaa/lib/noaa_hrpt_sync_cc.h new file mode 100644 index 00000000..f5b23cca --- /dev/null +++ b/gr-noaa/lib/noaa_hrpt_sync_cc.h @@ -0,0 +1,57 @@ +/* -*- 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_NOAA_HRPT_SYNC_CC_H +#define INCLUDED_NOAA_HRPT_SYNC_CC_H + +#include + +class noaa_hrpt_sync_cc; +typedef boost::shared_ptr noaa_hrpt_sync_cc_sptr; + +noaa_hrpt_sync_cc_sptr +noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + +class noaa_hrpt_sync_cc : public gr_block +{ + friend noaa_hrpt_sync_cc_sptr noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + noaa_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + + float d_alpha; // 1st order loop constant + float d_beta; // 2nd order loop constant + float d_sps; // samples per symbol + 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 + + public: + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + + void set_alpha(float alpha) { d_alpha = alpha; } + void set_beta(float beta) { d_beta = beta; } + void set_max_offset(float max_offset) { d_max_offset = max_offset; } +}; + +#endif /* INCLUDED_NOAA_HRPT_SYNC_CC_H */ diff --git a/gr-noaa/swig/Makefile.am b/gr-noaa/swig/Makefile.am index 927c6cfb..18cb5920 100644 --- a/gr-noaa/swig/Makefile.am +++ b/gr-noaa/swig/Makefile.am @@ -53,7 +53,8 @@ noaa_swig_python = \ # additional SWIG files to be installed noaa_swig_swiginclude_headers = \ noaa_swig.i \ - noaa_carrier_pll_cc.i + noaa_hrpt_pll_cc.i \ + noaa_hrpt_sync_cc.i include $(top_srcdir)/Makefile.swig diff --git a/gr-noaa/swig/noaa_carrier_pll_cc.i b/gr-noaa/swig/noaa_hrpt_pll_cc.i similarity index 81% rename from gr-noaa/swig/noaa_carrier_pll_cc.i rename to gr-noaa/swig/noaa_hrpt_pll_cc.i index 4d61f393..a29eaa38 100644 --- a/gr-noaa/swig/noaa_carrier_pll_cc.i +++ b/gr-noaa/swig/noaa_hrpt_pll_cc.i @@ -20,15 +20,15 @@ * Boston, MA 02110-1301, USA. */ -GR_SWIG_BLOCK_MAGIC(noaa,carrier_pll_cc) +GR_SWIG_BLOCK_MAGIC(noaa,hrpt_pll_cc) -noaa_carrier_pll_cc_sptr -noaa_make_carrier_pll_cc(float alpha, float beta, float max_offset); +noaa_hrpt_pll_cc_sptr +noaa_make_hrpt_pll_cc(float alpha, float beta, float max_offset); -class noaa_carrier_pll_cc : public gr_sync_block +class noaa_hrpt_pll_cc : public gr_sync_block { private: - noaa_carrier_pll_cc(); + noaa_hrpt_pll_cc(); public: void set_alpha(float alpha); diff --git a/gr-noaa/swig/noaa_hrpt_sync_cc.i b/gr-noaa/swig/noaa_hrpt_sync_cc.i new file mode 100644 index 00000000..6dcfa57d --- /dev/null +++ b/gr-noaa/swig/noaa_hrpt_sync_cc.i @@ -0,0 +1,37 @@ +/* -*- 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(noaa,hrpt_sync_cc) + +noaa_hrpt_sync_cc_sptr +noaa_make_hrpt_sync_cc(float alpha, float beta, float sps, float max_offset); + +class noaa_hrpt_sync_cc : public gr_sync_block +{ +private: + noaa_hrpt_sync_cc(); + +public: + void set_alpha(float alpha); + void set_beta(float beta); + void set_max_offset(float min_freq); +}; diff --git a/gr-noaa/swig/noaa_swig.i b/gr-noaa/swig/noaa_swig.i index 384f4e6a..470f5f96 100644 --- a/gr-noaa/swig/noaa_swig.i +++ b/gr-noaa/swig/noaa_swig.i @@ -23,7 +23,9 @@ %include "gnuradio.i" %{ -#include +#include +#include %} -%include "noaa_carrier_pll_cc.i" +%include "noaa_hrpt_pll_cc.i" +%include "noaa_hrpt_sync_cc.i" -- 2.30.2