2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP HRPT Receiver
5 # Generated: Sat Aug 29 11:48:57 2009
6 ##################################################
8 from gnuradio import gr
9 from gnuradio import noaa
10 from gnuradio.eng_option import eng_option
11 from gnuradio.wxgui import fftsink2
12 from gnuradio.wxgui import forms
13 from gnuradio.wxgui import scopesink2
14 from grc_gnuradio import wxgui as grc_wxgui
15 from optparse import OptionParser
19 class usrp_rx_hrpt(grc_wxgui.top_block_gui):
22 grc_wxgui.top_block_gui.__init__(self, title="USRP HRPT Receiver")
24 ##################################################
26 ##################################################
27 self.decim = decim = 16
28 self.sym_rate = sym_rate = 600*1109
29 self.sample_rate = sample_rate = 64e6/decim
30 self.sps = sps = sample_rate/sym_rate
31 self.sync_alpha = sync_alpha = 0.005
32 self.pll_alpha = pll_alpha = 0.005
33 self.max_sync_offset = max_sync_offset = 0.01
34 self.max_carrier_offset = max_carrier_offset = 2*math.pi*100e3/sample_rate
35 self.hs = hs = int(sps/2.0)
37 ##################################################
39 ##################################################
40 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
41 self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX")
42 self.displays.AddPage(grc_wxgui.Panel(self.displays), "PLL")
43 self.displays.AddPage(grc_wxgui.Panel(self.displays), "SYNC")
44 self.GridAdd(self.displays, 1, 0, 1, 2)
46 ##################################################
48 ##################################################
49 _sync_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
50 self._sync_alpha_text_box = forms.text_box(
52 sizer=_sync_alpha_sizer,
53 value=self.sync_alpha,
54 callback=self.set_sync_alpha,
56 converter=forms.float_converter(),
59 self._sync_alpha_slider = forms.slider(
61 sizer=_sync_alpha_sizer,
62 value=self.sync_alpha,
63 callback=self.set_sync_alpha,
67 style=wx.SL_HORIZONTAL,
71 self.GridAdd(_sync_alpha_sizer, 0, 1, 1, 1)
72 _pll_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
73 self._pll_alpha_text_box = forms.text_box(
75 sizer=_pll_alpha_sizer,
77 callback=self.set_pll_alpha,
79 converter=forms.float_converter(),
82 self._pll_alpha_slider = forms.slider(
84 sizer=_pll_alpha_sizer,
86 callback=self.set_pll_alpha,
90 style=wx.SL_HORIZONTAL,
94 self.GridAdd(_pll_alpha_sizer, 0, 0, 1, 1)
96 ##################################################
98 ##################################################
99 self.agr = gr.agc_cc(1e-6, 1.0, 1.0, 1.0)
100 self.gr_moving_average_xx_0 = gr.moving_average_cc(hs, 1.0/hs, 4000)
101 self.noaa_hrpt_pll_cc_0 = noaa.hrpt_pll_cc(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
102 self.rx_fftsink = fftsink2.fft_sink_c(
103 self.displays.GetPage(0).GetWin(),
104 baseband_freq=1698e6,
108 sample_rate=sample_rate,
116 self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1)
117 self.src = gr.file_source(gr.sizeof_gr_complex*1, "poes-d16.dat", True)
118 self.sync = noaa.hrpt_sync_cc(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset)
119 self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate)
120 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
121 self.displays.GetPage(0).GetWin(),
123 sample_rate=sample_rate,
125 t_scale=20.0/sample_rate,
130 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
131 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_c(
132 self.displays.GetPage(1).GetWin(),
134 sample_rate=sample_rate,
136 t_scale=20.0/sample_rate,
141 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
142 self.wxgui_scopesink2_0_0_0 = scopesink2.scope_sink_c(
143 self.displays.GetPage(1).GetWin(),
145 sample_rate=sample_rate,
147 t_scale=20.0/sample_rate,
152 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0_0.win, 1, 0, 1, 1)
153 self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_c(
154 self.displays.GetPage(2).GetWin(),
156 sample_rate=sample_rate,
158 t_scale=20.0/sample_rate,
163 self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_0_0.win, 1, 0, 1, 1)
164 self.wxgui_scopesink2_0_0_1 = scopesink2.scope_sink_c(
165 self.displays.GetPage(2).GetWin(),
167 sample_rate=sample_rate,
169 t_scale=20.0/sample_rate,
174 self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_1.win, 0, 0, 1, 1)
176 ##################################################
178 ##################################################
179 self.connect((self.src, 0), (self.throttle, 0))
180 self.connect((self.throttle, 0), (self.agr, 0))
181 self.connect((self.agr, 0), (self.gr_moving_average_xx_0, 0))
182 self.connect((self.agr, 0), (self.rx_fftsink, 0))
183 self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0))
184 self.connect((self.gr_moving_average_xx_0, 0), (self.noaa_hrpt_pll_cc_0, 0))
185 self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0, 0))
186 self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0_0, 0))
187 self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.sync, 0))
188 self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_1, 0))
189 self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_0_0, 0))
191 def set_decim(self, decim):
193 self.set_sample_rate(64e6/self.decim)
195 def set_sym_rate(self, sym_rate):
196 self.sym_rate = sym_rate
197 self.set_sps(self.sample_rate/self.sym_rate)
199 def set_sample_rate(self, sample_rate):
200 self.sample_rate = sample_rate
201 self.set_sps(self.sample_rate/self.sym_rate)
202 self.rx_fftsink.set_sample_rate(self.sample_rate)
203 self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate)
204 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
205 self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate)
206 self.wxgui_scopesink2_0_0_1.set_sample_rate(self.sample_rate)
207 self.wxgui_scopesink2_0_0_0.set_sample_rate(self.sample_rate)
208 self.wxgui_scopesink2_0_0_0_0.set_sample_rate(self.sample_rate)
210 def set_sps(self, sps):
212 self.set_hs(int(self.sps/2.0))
214 def set_sync_alpha(self, sync_alpha):
215 self.sync_alpha = sync_alpha
216 self._sync_alpha_slider.set_value(self.sync_alpha)
217 self._sync_alpha_text_box.set_value(self.sync_alpha)
218 self.sync.set_alpha(self.sync_alpha)
219 self.sync.set_beta(self.sync_alpha**2/4.0)
221 def set_pll_alpha(self, pll_alpha):
222 self.pll_alpha = pll_alpha
223 self._pll_alpha_slider.set_value(self.pll_alpha)
224 self._pll_alpha_text_box.set_value(self.pll_alpha)
225 self.noaa_hrpt_pll_cc_0.set_alpha(self.pll_alpha)
226 self.noaa_hrpt_pll_cc_0.set_beta(self.pll_alpha**2/4.0)
228 def set_max_sync_offset(self, max_sync_offset):
229 self.max_sync_offset = max_sync_offset
230 self.sync.set_max_offset(self.max_sync_offset)
232 def set_max_carrier_offset(self, max_carrier_offset):
233 self.max_carrier_offset = max_carrier_offset
234 self.noaa_hrpt_pll_cc_0.set_max_offset(self.max_carrier_offset)
236 def set_hs(self, hs):
238 self.gr_moving_average_xx_0.set_length_and_scale(self.hs, 1.0/self.hs)
240 if __name__ == '__main__':
241 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
242 (options, args) = parser.parse_args()