2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP HRPT Receiver
5 # Generated: Sat Aug 29 13:16:19 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.001
32 self.pll_alpha = pll_alpha = 0.001
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.noaa_hrpt_pll_cc_0 = noaa.hrpt_pll_cc(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
101 self.rx_fftsink = fftsink2.fft_sink_c(
102 self.displays.GetPage(0).GetWin(),
103 baseband_freq=1698e6,
107 sample_rate=sample_rate,
115 self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1)
116 self.src = gr.file_source(gr.sizeof_gr_complex*1, "poes-d16.dat", True)
117 self.sync = noaa.hrpt_sync_cc(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset)
118 self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate)
119 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
120 self.displays.GetPage(0).GetWin(),
122 sample_rate=sample_rate,
124 t_scale=20.0/sample_rate,
129 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
130 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_c(
131 self.displays.GetPage(1).GetWin(),
133 sample_rate=sample_rate,
135 t_scale=20.0/sample_rate,
140 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
141 self.wxgui_scopesink2_0_0_0 = scopesink2.scope_sink_c(
142 self.displays.GetPage(1).GetWin(),
144 sample_rate=sample_rate,
146 t_scale=20.0/sample_rate,
151 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0_0.win, 1, 0, 1, 1)
152 self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_c(
153 self.displays.GetPage(2).GetWin(),
155 sample_rate=sym_rate,
157 t_scale=20.0/sym_rate,
162 self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_0_0.win, 1, 0, 1, 1)
163 self.wxgui_scopesink2_0_0_1 = scopesink2.scope_sink_c(
164 self.displays.GetPage(2).GetWin(),
166 sample_rate=sym_rate,
168 t_scale=20.0/sym_rate,
173 self.displays.GetPage(2).GridAdd(self.wxgui_scopesink2_0_0_1.win, 0, 0, 1, 1)
175 ##################################################
177 ##################################################
178 self.connect((self.src, 0), (self.throttle, 0))
179 self.connect((self.throttle, 0), (self.agr, 0))
180 self.connect((self.agr, 0), (self.rx_fftsink, 0))
181 self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0))
182 self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0, 0))
183 self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.wxgui_scopesink2_0_0_0, 0))
184 self.connect((self.noaa_hrpt_pll_cc_0, 0), (self.sync, 0))
185 self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_1, 0))
186 self.connect((self.sync, 0), (self.wxgui_scopesink2_0_0_0_0, 0))
187 self.connect((self.agr, 0), (self.noaa_hrpt_pll_cc_0, 0))
189 def set_decim(self, decim):
191 self.set_sample_rate(64e6/self.decim)
193 def set_sym_rate(self, sym_rate):
194 self.sym_rate = sym_rate
195 self.set_sps(self.sample_rate/self.sym_rate)
196 self.wxgui_scopesink2_0_0_0_0.set_sample_rate(self.sym_rate)
197 self.wxgui_scopesink2_0_0_1.set_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.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
203 self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate)
204 self.wxgui_scopesink2_0_0_0.set_sample_rate(self.sample_rate)
205 self.rx_fftsink.set_sample_rate(self.sample_rate)
206 self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate)
208 def set_sps(self, sps):
210 self.set_hs(int(self.sps/2.0))
212 def set_sync_alpha(self, sync_alpha):
213 self.sync_alpha = sync_alpha
214 self.sync.set_alpha(self.sync_alpha)
215 self.sync.set_beta(self.sync_alpha**2/4.0)
216 self._sync_alpha_slider.set_value(self.sync_alpha)
217 self._sync_alpha_text_box.set_value(self.sync_alpha)
219 def set_pll_alpha(self, pll_alpha):
220 self.pll_alpha = pll_alpha
221 self.noaa_hrpt_pll_cc_0.set_alpha(self.pll_alpha)
222 self.noaa_hrpt_pll_cc_0.set_beta(self.pll_alpha**2/4.0)
223 self._pll_alpha_slider.set_value(self.pll_alpha)
224 self._pll_alpha_text_box.set_value(self.pll_alpha)
226 def set_max_sync_offset(self, max_sync_offset):
227 self.max_sync_offset = max_sync_offset
228 self.sync.set_max_offset(self.max_sync_offset)
230 def set_max_carrier_offset(self, max_carrier_offset):
231 self.max_carrier_offset = max_carrier_offset
232 self.noaa_hrpt_pll_cc_0.set_max_offset(self.max_carrier_offset)
234 def set_hs(self, hs):
237 if __name__ == '__main__':
238 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
239 (options, args) = parser.parse_args()