2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP HRPT Receiver
5 # Generated: Sun Nov 1 19:28:13 2009
6 ##################################################
8 from gnuradio import eng_notation
9 from gnuradio import gr
10 from gnuradio import noaa
11 from gnuradio import window
12 from gnuradio.eng_option import eng_option
13 from gnuradio.gr import firdes
14 from gnuradio.wxgui import fftsink2
15 from gnuradio.wxgui import forms
16 from gnuradio.wxgui import scopesink2
17 from grc_gnuradio import usrp as grc_usrp
18 from grc_gnuradio import wxgui as grc_wxgui
19 from optparse import OptionParser
24 class usrp_rx_hrpt(grc_wxgui.top_block_gui):
27 grc_wxgui.top_block_gui.__init__(self, title="USRP HRPT Receiver")
29 ##################################################
31 ##################################################
32 self.config_filename = config_filename = os.environ['HOME']+'/.gnuradio/config.conf'
33 self._decim_config = ConfigParser.ConfigParser()
34 self._decim_config.read(config_filename)
35 try: decim = self._decim_config.getfloat('usrp_rx_hrpt', 'decim')
38 self.sym_rate = sym_rate = 600*1109
39 self.sample_rate = sample_rate = 64e6/decim
40 self.sps = sps = sample_rate/sym_rate
41 self._side_config = ConfigParser.ConfigParser()
42 self._side_config.read(config_filename)
43 try: side = self._side_config.get('usrp_rx_hrpt', 'side')
46 self._saved_pll_alpha_config = ConfigParser.ConfigParser()
47 self._saved_pll_alpha_config.read(config_filename)
48 try: saved_pll_alpha = self._saved_pll_alpha_config.getfloat('usrp_rx_hrpt', 'pll_alpha')
49 except: saved_pll_alpha = 0.05
50 self.saved_pll_alpha = saved_pll_alpha
51 self._saved_gain_config = ConfigParser.ConfigParser()
52 self._saved_gain_config.read(config_filename)
53 try: saved_gain = self._saved_gain_config.getfloat('usrp_rx_hrpt', 'gain')
54 except: saved_gain = 35
55 self.saved_gain = saved_gain
56 self._saved_freq_config = ConfigParser.ConfigParser()
57 self._saved_freq_config.read(config_filename)
58 try: saved_freq = self._saved_freq_config.getfloat('usrp_rx_hrpt', 'freq')
59 except: saved_freq = 1698e6
60 self.saved_freq = saved_freq
61 self._saved_clock_alpha_config = ConfigParser.ConfigParser()
62 self._saved_clock_alpha_config.read(config_filename)
63 try: saved_clock_alpha = self._saved_clock_alpha_config.getfloat('usrp_rx_hrpt', 'clock_alpha')
64 except: saved_clock_alpha = 0.05
65 self.saved_clock_alpha = saved_clock_alpha
66 self.side_text = side_text = side
67 self.pll_alpha = pll_alpha = saved_pll_alpha
68 self._output_filename_config = ConfigParser.ConfigParser()
69 self._output_filename_config.read(config_filename)
70 try: output_filename = self._output_filename_config.get('usrp_rx_hrpt', 'filename')
71 except: output_filename = 'frames.dat'
72 self.output_filename = output_filename
73 self.max_clock_offset = max_clock_offset = 0.1
74 self.max_carrier_offset = max_carrier_offset = 2*math.pi*100e3/sample_rate
75 self.hs = hs = int(sps/2.0)
76 self.gain = gain = saved_gain
77 self.freq = freq = saved_freq
78 self.decim_text = decim_text = decim
79 self.clock_alpha = clock_alpha = saved_clock_alpha
81 ##################################################
83 ##################################################
84 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
85 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Spectrum")
86 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Demod")
87 self.GridAdd(self.displays, 2, 0, 1, 4)
89 ##################################################
91 ##################################################
92 self._side_text_static_text = forms.static_text(
95 callback=self.set_side_text,
97 converter=forms.str_converter(),
99 self.GridAdd(self._side_text_static_text, 1, 0, 1, 1)
100 _pll_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
101 self._pll_alpha_text_box = forms.text_box(
102 parent=self.GetWin(),
103 sizer=_pll_alpha_sizer,
104 value=self.pll_alpha,
105 callback=self.set_pll_alpha,
107 converter=forms.float_converter(),
110 self._pll_alpha_slider = forms.slider(
111 parent=self.GetWin(),
112 sizer=_pll_alpha_sizer,
113 value=self.pll_alpha,
114 callback=self.set_pll_alpha,
118 style=wx.SL_HORIZONTAL,
122 self.GridAdd(_pll_alpha_sizer, 0, 2, 1, 1)
123 _gain_sizer = wx.BoxSizer(wx.VERTICAL)
124 self._gain_text_box = forms.text_box(
125 parent=self.GetWin(),
128 callback=self.set_gain,
130 converter=forms.float_converter(),
133 self._gain_slider = forms.slider(
134 parent=self.GetWin(),
137 callback=self.set_gain,
141 style=wx.SL_HORIZONTAL,
145 self.GridAdd(_gain_sizer, 0, 1, 1, 1)
146 self._freq_text_box = forms.text_box(
147 parent=self.GetWin(),
149 callback=self.set_freq,
151 converter=forms.float_converter(),
153 self.GridAdd(self._freq_text_box, 0, 0, 1, 1)
154 self._decim_text_static_text = forms.static_text(
155 parent=self.GetWin(),
156 value=self.decim_text,
157 callback=self.set_decim_text,
159 converter=forms.float_converter(),
161 self.GridAdd(self._decim_text_static_text, 1, 1, 1, 1)
162 _clock_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
163 self._clock_alpha_text_box = forms.text_box(
164 parent=self.GetWin(),
165 sizer=_clock_alpha_sizer,
166 value=self.clock_alpha,
167 callback=self.set_clock_alpha,
169 converter=forms.float_converter(),
172 self._clock_alpha_slider = forms.slider(
173 parent=self.GetWin(),
174 sizer=_clock_alpha_sizer,
175 value=self.clock_alpha,
176 callback=self.set_clock_alpha,
180 style=wx.SL_HORIZONTAL,
184 self.GridAdd(_clock_alpha_sizer, 0, 3, 1, 1)
186 ##################################################
188 ##################################################
189 self.agc = gr.agc_cc(1e-6, 1.0, 1.0, 1.0)
190 self.decoder = noaa.hrpt_decoder()
191 self.deframer = noaa.hrpt_deframer()
192 self.demod_scope = scopesink2.scope_sink_f(
193 self.displays.GetPage(1).GetWin(),
195 sample_rate=sym_rate*2.0,
198 t_scale=10.0/sym_rate,
203 self.displays.GetPage(1).GridAdd(self.demod_scope.win, 0, 0, 1, 1)
204 self.frame_sink = gr.file_sink(gr.sizeof_short*1, output_filename)
205 self.gr_binary_slicer_fb_0 = gr.binary_slicer_fb()
206 self.gr_clock_recovery_mm_xx_0 = gr.clock_recovery_mm_ff(sps/2.0, clock_alpha**2/4.0, 0.5, clock_alpha, max_clock_offset)
207 self.gr_moving_average_xx_0 = gr.moving_average_ff(hs, 1.0/hs, 4000)
208 self.noaa_hrpt_bit_sync_0 = noaa.hrpt_bit_sync()
209 self.pll = noaa.hrpt_pll_cf(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
210 self.rx_fft = fftsink2.fft_sink_c(
211 self.displays.GetPage(0).GetWin(),
217 sample_rate=sample_rate,
226 self.displays.GetPage(0).GridAdd(self.rx_fft.win, 0, 0, 1, 1)
227 self.usrp_source = grc_usrp.simple_source_c(which=0, side=side, rx_ant="RXA")
228 self.usrp_source.set_decim_rate(decim)
229 self.usrp_source.set_frequency(freq, verbose=True)
230 self.usrp_source.set_gain(gain)
232 ##################################################
234 ##################################################
235 self.connect((self.noaa_hrpt_bit_sync_0, 0), (self.deframer, 0))
236 self.connect((self.gr_binary_slicer_fb_0, 0), (self.noaa_hrpt_bit_sync_0, 0))
237 self.connect((self.gr_clock_recovery_mm_xx_0, 0), (self.gr_binary_slicer_fb_0, 0))
238 self.connect((self.deframer, 0), (self.frame_sink, 0))
239 self.connect((self.deframer, 0), (self.decoder, 0))
240 self.connect((self.gr_clock_recovery_mm_xx_0, 0), (self.demod_scope, 0))
241 self.connect((self.gr_moving_average_xx_0, 0), (self.gr_clock_recovery_mm_xx_0, 0))
242 self.connect((self.pll, 0), (self.gr_moving_average_xx_0, 0))
243 self.connect((self.agc, 0), (self.pll, 0))
244 self.connect((self.usrp_source, 0), (self.agc, 0))
245 self.connect((self.agc, 0), (self.rx_fft, 0))
247 def set_config_filename(self, config_filename):
248 self.config_filename = config_filename
249 self._saved_freq_config = ConfigParser.ConfigParser()
250 self._saved_freq_config.read(self.config_filename)
251 if not self._saved_freq_config.has_section('usrp_rx_hrpt'):
252 self._saved_freq_config.add_section('usrp_rx_hrpt')
253 self._saved_freq_config.set('usrp_rx_hrpt', 'freq', str(self.freq))
254 self._saved_freq_config.write(open(self.config_filename, 'w'))
255 self._saved_gain_config = ConfigParser.ConfigParser()
256 self._saved_gain_config.read(self.config_filename)
257 if not self._saved_gain_config.has_section('usrp_rx_hrpt'):
258 self._saved_gain_config.add_section('usrp_rx_hrpt')
259 self._saved_gain_config.set('usrp_rx_hrpt', 'gain', str(self.gain))
260 self._saved_gain_config.write(open(self.config_filename, 'w'))
261 self._output_filename_config = ConfigParser.ConfigParser()
262 self._output_filename_config.read(self.config_filename)
263 if not self._output_filename_config.has_section('usrp_rx_hrpt'):
264 self._output_filename_config.add_section('usrp_rx_hrpt')
265 self._output_filename_config.set('usrp_rx_hrpt', 'filename', str(self.output_filename))
266 self._output_filename_config.write(open(self.config_filename, 'w'))
267 self._saved_pll_alpha_config = ConfigParser.ConfigParser()
268 self._saved_pll_alpha_config.read(self.config_filename)
269 if not self._saved_pll_alpha_config.has_section('usrp_rx_hrpt'):
270 self._saved_pll_alpha_config.add_section('usrp_rx_hrpt')
271 self._saved_pll_alpha_config.set('usrp_rx_hrpt', 'pll_alpha', str(self.pll_alpha))
272 self._saved_pll_alpha_config.write(open(self.config_filename, 'w'))
273 self._saved_clock_alpha_config = ConfigParser.ConfigParser()
274 self._saved_clock_alpha_config.read(self.config_filename)
275 if not self._saved_clock_alpha_config.has_section('usrp_rx_hrpt'):
276 self._saved_clock_alpha_config.add_section('usrp_rx_hrpt')
277 self._saved_clock_alpha_config.set('usrp_rx_hrpt', 'clock_alpha', str(self.clock_alpha))
278 self._saved_clock_alpha_config.write(open(self.config_filename, 'w'))
279 self._decim_config = ConfigParser.ConfigParser()
280 self._decim_config.read(self.config_filename)
281 if not self._decim_config.has_section('usrp_rx_hrpt'):
282 self._decim_config.add_section('usrp_rx_hrpt')
283 self._decim_config.set('usrp_rx_hrpt', 'decim', str(self.decim))
284 self._decim_config.write(open(self.config_filename, 'w'))
285 self._side_config = ConfigParser.ConfigParser()
286 self._side_config.read(self.config_filename)
287 if not self._side_config.has_section('usrp_rx_hrpt'):
288 self._side_config.add_section('usrp_rx_hrpt')
289 self._side_config.set('usrp_rx_hrpt', 'side', str(self.side))
290 self._side_config.write(open(self.config_filename, 'w'))
292 def set_decim(self, decim):
294 self.set_sample_rate(64e6/self.decim)
295 self.set_decim_text(self.decim)
296 self._decim_config = ConfigParser.ConfigParser()
297 self._decim_config.read(self.config_filename)
298 if not self._decim_config.has_section('usrp_rx_hrpt'):
299 self._decim_config.add_section('usrp_rx_hrpt')
300 self._decim_config.set('usrp_rx_hrpt', 'decim', str(self.decim))
301 self._decim_config.write(open(self.config_filename, 'w'))
302 self.usrp_source.set_decim_rate(self.decim)
304 def set_sym_rate(self, sym_rate):
305 self.sym_rate = sym_rate
306 self.set_sps(self.sample_rate/self.sym_rate)
307 self.demod_scope.set_sample_rate(self.sym_rate*2.0)
309 def set_sample_rate(self, sample_rate):
310 self.sample_rate = sample_rate
311 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
312 self.set_sps(self.sample_rate/self.sym_rate)
313 self.rx_fft.set_sample_rate(self.sample_rate)
315 def set_sps(self, sps):
317 self.set_hs(int(self.sps/2.0))
318 self.gr_clock_recovery_mm_xx_0.set_omega(self.sps/2.0)
320 def set_side(self, side):
322 self.set_side_text(self.side)
323 self._side_config = ConfigParser.ConfigParser()
324 self._side_config.read(self.config_filename)
325 if not self._side_config.has_section('usrp_rx_hrpt'):
326 self._side_config.add_section('usrp_rx_hrpt')
327 self._side_config.set('usrp_rx_hrpt', 'side', str(self.side))
328 self._side_config.write(open(self.config_filename, 'w'))
330 def set_saved_pll_alpha(self, saved_pll_alpha):
331 self.saved_pll_alpha = saved_pll_alpha
332 self.set_pll_alpha(self.saved_pll_alpha)
334 def set_saved_gain(self, saved_gain):
335 self.saved_gain = saved_gain
336 self.set_gain(self.saved_gain)
338 def set_saved_freq(self, saved_freq):
339 self.saved_freq = saved_freq
340 self.set_freq(self.saved_freq)
342 def set_saved_clock_alpha(self, saved_clock_alpha):
343 self.saved_clock_alpha = saved_clock_alpha
344 self.set_clock_alpha(self.saved_clock_alpha)
346 def set_side_text(self, side_text):
347 self.side_text = side_text
348 self._side_text_static_text.set_value(self.side_text)
350 def set_pll_alpha(self, pll_alpha):
351 self.pll_alpha = pll_alpha
352 self._pll_alpha_slider.set_value(self.pll_alpha)
353 self._pll_alpha_text_box.set_value(self.pll_alpha)
354 self._saved_pll_alpha_config = ConfigParser.ConfigParser()
355 self._saved_pll_alpha_config.read(self.config_filename)
356 if not self._saved_pll_alpha_config.has_section('usrp_rx_hrpt'):
357 self._saved_pll_alpha_config.add_section('usrp_rx_hrpt')
358 self._saved_pll_alpha_config.set('usrp_rx_hrpt', 'pll_alpha', str(self.pll_alpha))
359 self._saved_pll_alpha_config.write(open(self.config_filename, 'w'))
360 self.pll.set_alpha(self.pll_alpha)
361 self.pll.set_beta(self.pll_alpha**2/4.0)
363 def set_output_filename(self, output_filename):
364 self.output_filename = output_filename
365 self._output_filename_config = ConfigParser.ConfigParser()
366 self._output_filename_config.read(self.config_filename)
367 if not self._output_filename_config.has_section('usrp_rx_hrpt'):
368 self._output_filename_config.add_section('usrp_rx_hrpt')
369 self._output_filename_config.set('usrp_rx_hrpt', 'filename', str(self.output_filename))
370 self._output_filename_config.write(open(self.config_filename, 'w'))
372 def set_max_clock_offset(self, max_clock_offset):
373 self.max_clock_offset = max_clock_offset
375 def set_max_carrier_offset(self, max_carrier_offset):
376 self.max_carrier_offset = max_carrier_offset
377 self.pll.set_max_offset(self.max_carrier_offset)
379 def set_hs(self, hs):
381 self.gr_moving_average_xx_0.set_length_and_scale(self.hs, 1.0/self.hs)
383 def set_gain(self, gain):
385 self._gain_slider.set_value(self.gain)
386 self._gain_text_box.set_value(self.gain)
387 self._saved_gain_config = ConfigParser.ConfigParser()
388 self._saved_gain_config.read(self.config_filename)
389 if not self._saved_gain_config.has_section('usrp_rx_hrpt'):
390 self._saved_gain_config.add_section('usrp_rx_hrpt')
391 self._saved_gain_config.set('usrp_rx_hrpt', 'gain', str(self.gain))
392 self._saved_gain_config.write(open(self.config_filename, 'w'))
393 self.usrp_source.set_gain(self.gain)
395 def set_freq(self, freq):
397 self._freq_text_box.set_value(self.freq)
398 self._saved_freq_config = ConfigParser.ConfigParser()
399 self._saved_freq_config.read(self.config_filename)
400 if not self._saved_freq_config.has_section('usrp_rx_hrpt'):
401 self._saved_freq_config.add_section('usrp_rx_hrpt')
402 self._saved_freq_config.set('usrp_rx_hrpt', 'freq', str(self.freq))
403 self._saved_freq_config.write(open(self.config_filename, 'w'))
404 self.usrp_source.set_frequency(self.freq)
405 self.rx_fft.set_baseband_freq(self.freq)
407 def set_decim_text(self, decim_text):
408 self.decim_text = decim_text
409 self._decim_text_static_text.set_value(self.decim_text)
411 def set_clock_alpha(self, clock_alpha):
412 self.clock_alpha = clock_alpha
413 self._clock_alpha_slider.set_value(self.clock_alpha)
414 self._clock_alpha_text_box.set_value(self.clock_alpha)
415 self._saved_clock_alpha_config = ConfigParser.ConfigParser()
416 self._saved_clock_alpha_config.read(self.config_filename)
417 if not self._saved_clock_alpha_config.has_section('usrp_rx_hrpt'):
418 self._saved_clock_alpha_config.add_section('usrp_rx_hrpt')
419 self._saved_clock_alpha_config.set('usrp_rx_hrpt', 'clock_alpha', str(self.clock_alpha))
420 self._saved_clock_alpha_config.write(open(self.config_filename, 'w'))
421 self.gr_clock_recovery_mm_xx_0.set_gain_omega(self.clock_alpha**2/4.0)
422 self.gr_clock_recovery_mm_xx_0.set_gain_mu(self.clock_alpha)
424 if __name__ == '__main__':
425 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
426 (options, args) = parser.parse_args()