2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP HRPT Receiver
5 # Generated: Sun Sep 27 13:32:48 2009
6 ##################################################
8 from gnuradio import eng_notation
9 from gnuradio import gr
10 from gnuradio import noaa
11 from gnuradio.eng_option import eng_option
12 from gnuradio.gr import firdes
13 from gnuradio.wxgui import forms
14 from gnuradio.wxgui import scopesink2
15 from grc_gnuradio import usrp as grc_usrp
16 from grc_gnuradio import wxgui as grc_wxgui
17 from optparse import OptionParser
22 class usrp_rx_hrpt2(grc_wxgui.top_block_gui):
25 grc_wxgui.top_block_gui.__init__(self, title="USRP HRPT Receiver")
27 ##################################################
29 ##################################################
30 self.config_filename = config_filename = 'usrp_rx_hrpt.cfg'
31 self._decim_config = ConfigParser.ConfigParser()
32 self._decim_config.read(config_filename)
33 try: decim = self._decim_config.getfloat('usrp', 'decim')
36 self.sym_rate = sym_rate = 600*1109
37 self.sample_rate = sample_rate = 64e6/decim
38 self.sps = sps = sample_rate/sym_rate
39 self._side_config = ConfigParser.ConfigParser()
40 self._side_config.read(config_filename)
41 try: side = self._side_config.get('usrp', 'side')
44 self._saved_sync_alpha_config = ConfigParser.ConfigParser()
45 self._saved_sync_alpha_config.read(config_filename)
46 try: saved_sync_alpha = self._saved_sync_alpha_config.getfloat('demod', 'sync_alpha')
47 except: saved_sync_alpha = 0.05
48 self.saved_sync_alpha = saved_sync_alpha
49 self._saved_pll_alpha_config = ConfigParser.ConfigParser()
50 self._saved_pll_alpha_config.read(config_filename)
51 try: saved_pll_alpha = self._saved_pll_alpha_config.getfloat('demod', 'pll_alpha')
52 except: saved_pll_alpha = 0.05
53 self.saved_pll_alpha = saved_pll_alpha
54 self._saved_gain_config = ConfigParser.ConfigParser()
55 self._saved_gain_config.read(config_filename)
56 try: saved_gain = self._saved_gain_config.getfloat('usrp', 'gain')
57 except: saved_gain = 35
58 self.saved_gain = saved_gain
59 self._saved_freq_config = ConfigParser.ConfigParser()
60 self._saved_freq_config.read(config_filename)
61 try: saved_freq = self._saved_freq_config.getfloat('usrp', 'freq')
62 except: saved_freq = 1698e6
63 self.saved_freq = saved_freq
64 self.hs = hs = int(sps/2.0)
65 self.sync_alpha = sync_alpha = saved_sync_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('output', 'filename')
71 except: output_filename = 'frames.dat'
72 self.output_filename = output_filename
73 self.mf_taps = mf_taps = [-0.5/hs,]*hs+[0.5/hs,]*hs
74 self.max_sync_offset = max_sync_offset = 0.01
75 self.max_carrier_offset = max_carrier_offset = 2*math.pi*100e3/sample_rate
76 self.gain = gain = saved_gain
77 self.freq = freq = saved_freq
78 self.decim_text = decim_text = decim
80 ##################################################
82 ##################################################
83 _sync_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
84 self._sync_alpha_text_box = forms.text_box(
86 sizer=_sync_alpha_sizer,
87 value=self.sync_alpha,
88 callback=self.set_sync_alpha,
90 converter=forms.float_converter(),
93 self._sync_alpha_slider = forms.slider(
95 sizer=_sync_alpha_sizer,
96 value=self.sync_alpha,
97 callback=self.set_sync_alpha,
101 style=wx.SL_HORIZONTAL,
105 self.GridAdd(_sync_alpha_sizer, 0, 3, 1, 1)
106 self._side_text_static_text = forms.static_text(
107 parent=self.GetWin(),
108 value=self.side_text,
109 callback=self.set_side_text,
111 converter=forms.str_converter(),
113 self.GridAdd(self._side_text_static_text, 1, 0, 1, 1)
114 _pll_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
115 self._pll_alpha_text_box = forms.text_box(
116 parent=self.GetWin(),
117 sizer=_pll_alpha_sizer,
118 value=self.pll_alpha,
119 callback=self.set_pll_alpha,
121 converter=forms.float_converter(),
124 self._pll_alpha_slider = forms.slider(
125 parent=self.GetWin(),
126 sizer=_pll_alpha_sizer,
127 value=self.pll_alpha,
128 callback=self.set_pll_alpha,
132 style=wx.SL_HORIZONTAL,
136 self.GridAdd(_pll_alpha_sizer, 0, 2, 1, 1)
137 _gain_sizer = wx.BoxSizer(wx.VERTICAL)
138 self._gain_text_box = forms.text_box(
139 parent=self.GetWin(),
142 callback=self.set_gain,
144 converter=forms.float_converter(),
147 self._gain_slider = forms.slider(
148 parent=self.GetWin(),
151 callback=self.set_gain,
155 style=wx.SL_HORIZONTAL,
159 self.GridAdd(_gain_sizer, 0, 1, 1, 1)
160 self._freq_text_box = forms.text_box(
161 parent=self.GetWin(),
163 callback=self.set_freq,
165 converter=forms.float_converter(),
167 self.GridAdd(self._freq_text_box, 0, 0, 1, 1)
168 self._decim_text_static_text = forms.static_text(
169 parent=self.GetWin(),
170 value=self.decim_text,
171 callback=self.set_decim_text,
173 converter=forms.float_converter(),
175 self.GridAdd(self._decim_text_static_text, 1, 1, 1, 1)
177 ##################################################
179 ##################################################
180 self.agc = gr.agc_cc(1e-6, 1.0, 1.0, 1.0)
181 self.decoder = noaa.hrpt_decoder()
182 self.deframer = noaa.hrpt_deframer()
183 self.frame_sink = gr.file_sink(gr.sizeof_short*1, output_filename)
184 self.gr_fir_filter_xxx_0 = gr.fir_filter_ccc(1, (mf_taps))
185 self.pll = noaa.hrpt_pll_cf(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
186 self.pll_scope = scopesink2.scope_sink_f(
188 title="Demod Waveform",
189 sample_rate=sample_rate,
191 t_scale=20.0/sample_rate,
196 self.GridAdd(self.pll_scope.win, 2, 0, 1, 4)
197 self.sync = noaa.hrpt_sync_fb(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset)
198 self.usrp_source = grc_usrp.simple_source_c(which=0, side=side, rx_ant="RXA")
199 self.usrp_source.set_decim_rate(decim)
200 self.usrp_source.set_frequency(freq, verbose=True)
201 self.usrp_source.set_gain(gain)
203 ##################################################
205 ##################################################
206 self.connect((self.gr_fir_filter_xxx_0, 0), (self.pll, 0))
207 self.connect((self.agc, 0), (self.gr_fir_filter_xxx_0, 0))
208 self.connect((self.usrp_source, 0), (self.agc, 0))
209 self.connect((self.deframer, 0), (self.decoder, 0))
210 self.connect((self.pll, 0), (self.pll_scope, 0))
211 self.connect((self.pll, 0), (self.sync, 0))
212 self.connect((self.sync, 0), (self.deframer, 0))
213 self.connect((self.deframer, 0), (self.frame_sink, 0))
215 def set_config_filename(self, config_filename):
216 self.config_filename = config_filename
217 self._side_config = ConfigParser.ConfigParser()
218 self._side_config.read(self.config_filename)
219 if not self._side_config.has_section('usrp'):
220 self._side_config.add_section('usrp')
221 self._side_config.set('usrp', 'side', str(self.side))
222 self._side_config.write(open(self.config_filename, 'w'))
223 self._decim_config = ConfigParser.ConfigParser()
224 self._decim_config.read(self.config_filename)
225 if not self._decim_config.has_section('usrp'):
226 self._decim_config.add_section('usrp')
227 self._decim_config.set('usrp', 'decim', str(self.decim))
228 self._decim_config.write(open(self.config_filename, 'w'))
229 self._saved_freq_config = ConfigParser.ConfigParser()
230 self._saved_freq_config.read(self.config_filename)
231 if not self._saved_freq_config.has_section('usrp'):
232 self._saved_freq_config.add_section('usrp')
233 self._saved_freq_config.set('usrp', 'freq', str(self.freq))
234 self._saved_freq_config.write(open(self.config_filename, 'w'))
235 self._saved_gain_config = ConfigParser.ConfigParser()
236 self._saved_gain_config.read(self.config_filename)
237 if not self._saved_gain_config.has_section('usrp'):
238 self._saved_gain_config.add_section('usrp')
239 self._saved_gain_config.set('usrp', 'gain', str(self.gain))
240 self._saved_gain_config.write(open(self.config_filename, 'w'))
241 self._saved_pll_alpha_config = ConfigParser.ConfigParser()
242 self._saved_pll_alpha_config.read(self.config_filename)
243 if not self._saved_pll_alpha_config.has_section('demod'):
244 self._saved_pll_alpha_config.add_section('demod')
245 self._saved_pll_alpha_config.set('demod', 'pll_alpha', str(self.pll_alpha))
246 self._saved_pll_alpha_config.write(open(self.config_filename, 'w'))
247 self._saved_sync_alpha_config = ConfigParser.ConfigParser()
248 self._saved_sync_alpha_config.read(self.config_filename)
249 if not self._saved_sync_alpha_config.has_section('demod'):
250 self._saved_sync_alpha_config.add_section('demod')
251 self._saved_sync_alpha_config.set('demod', 'sync_alpha', str(self.sync_alpha))
252 self._saved_sync_alpha_config.write(open(self.config_filename, 'w'))
253 self._output_filename_config = ConfigParser.ConfigParser()
254 self._output_filename_config.read(self.config_filename)
255 if not self._output_filename_config.has_section('output'):
256 self._output_filename_config.add_section('output')
257 self._output_filename_config.set('output', 'filename', str(self.output_filename))
258 self._output_filename_config.write(open(self.config_filename, 'w'))
260 def set_decim(self, decim):
262 self.set_sample_rate(64e6/self.decim)
263 self._decim_config = ConfigParser.ConfigParser()
264 self._decim_config.read(self.config_filename)
265 if not self._decim_config.has_section('usrp'):
266 self._decim_config.add_section('usrp')
267 self._decim_config.set('usrp', 'decim', str(self.decim))
268 self._decim_config.write(open(self.config_filename, 'w'))
269 self.set_decim_text(self.decim)
270 self.usrp_source.set_decim_rate(self.decim)
272 def set_sym_rate(self, sym_rate):
273 self.sym_rate = sym_rate
274 self.set_sps(self.sample_rate/self.sym_rate)
276 def set_sample_rate(self, sample_rate):
277 self.sample_rate = sample_rate
278 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
279 self.set_sps(self.sample_rate/self.sym_rate)
280 self.pll_scope.set_sample_rate(self.sample_rate)
282 def set_sps(self, sps):
284 self.set_hs(int(self.sps/2.0))
286 def set_side(self, side):
288 self.set_side_text(self.side)
289 self._side_config = ConfigParser.ConfigParser()
290 self._side_config.read(self.config_filename)
291 if not self._side_config.has_section('usrp'):
292 self._side_config.add_section('usrp')
293 self._side_config.set('usrp', 'side', str(self.side))
294 self._side_config.write(open(self.config_filename, 'w'))
296 def set_saved_sync_alpha(self, saved_sync_alpha):
297 self.saved_sync_alpha = saved_sync_alpha
298 self.set_sync_alpha(self.saved_sync_alpha)
300 def set_saved_pll_alpha(self, saved_pll_alpha):
301 self.saved_pll_alpha = saved_pll_alpha
302 self.set_pll_alpha(self.saved_pll_alpha)
304 def set_saved_gain(self, saved_gain):
305 self.saved_gain = saved_gain
306 self.set_gain(self.saved_gain)
308 def set_saved_freq(self, saved_freq):
309 self.saved_freq = saved_freq
310 self.set_freq(self.saved_freq)
312 def set_hs(self, hs):
314 self.set_mf_taps([-0.5/self.hs,]*self.hs+[0.5/self.hs,]*self.hs)
316 def set_sync_alpha(self, sync_alpha):
317 self.sync_alpha = sync_alpha
318 self._sync_alpha_slider.set_value(self.sync_alpha)
319 self._sync_alpha_text_box.set_value(self.sync_alpha)
320 self._saved_sync_alpha_config = ConfigParser.ConfigParser()
321 self._saved_sync_alpha_config.read(self.config_filename)
322 if not self._saved_sync_alpha_config.has_section('demod'):
323 self._saved_sync_alpha_config.add_section('demod')
324 self._saved_sync_alpha_config.set('demod', 'sync_alpha', str(self.sync_alpha))
325 self._saved_sync_alpha_config.write(open(self.config_filename, 'w'))
326 self.sync.set_alpha(self.sync_alpha)
327 self.sync.set_beta(self.sync_alpha**2/4.0)
329 def set_side_text(self, side_text):
330 self.side_text = side_text
331 self._side_text_static_text.set_value(self.side_text)
333 def set_pll_alpha(self, pll_alpha):
334 self.pll_alpha = pll_alpha
335 self._pll_alpha_slider.set_value(self.pll_alpha)
336 self._pll_alpha_text_box.set_value(self.pll_alpha)
337 self._saved_pll_alpha_config = ConfigParser.ConfigParser()
338 self._saved_pll_alpha_config.read(self.config_filename)
339 if not self._saved_pll_alpha_config.has_section('demod'):
340 self._saved_pll_alpha_config.add_section('demod')
341 self._saved_pll_alpha_config.set('demod', 'pll_alpha', str(self.pll_alpha))
342 self._saved_pll_alpha_config.write(open(self.config_filename, 'w'))
343 self.pll.set_alpha(self.pll_alpha)
344 self.pll.set_beta(self.pll_alpha**2/4.0)
346 def set_output_filename(self, output_filename):
347 self.output_filename = output_filename
348 self._output_filename_config = ConfigParser.ConfigParser()
349 self._output_filename_config.read(self.config_filename)
350 if not self._output_filename_config.has_section('output'):
351 self._output_filename_config.add_section('output')
352 self._output_filename_config.set('output', 'filename', str(self.output_filename))
353 self._output_filename_config.write(open(self.config_filename, 'w'))
355 def set_mf_taps(self, mf_taps):
356 self.mf_taps = mf_taps
357 self.gr_fir_filter_xxx_0.set_taps((self.mf_taps))
359 def set_max_sync_offset(self, max_sync_offset):
360 self.max_sync_offset = max_sync_offset
361 self.sync.set_max_offset(self.max_sync_offset)
363 def set_max_carrier_offset(self, max_carrier_offset):
364 self.max_carrier_offset = max_carrier_offset
365 self.pll.set_max_offset(self.max_carrier_offset)
367 def set_gain(self, gain):
369 self._gain_slider.set_value(self.gain)
370 self._gain_text_box.set_value(self.gain)
371 self._saved_gain_config = ConfigParser.ConfigParser()
372 self._saved_gain_config.read(self.config_filename)
373 if not self._saved_gain_config.has_section('usrp'):
374 self._saved_gain_config.add_section('usrp')
375 self._saved_gain_config.set('usrp', 'gain', str(self.gain))
376 self._saved_gain_config.write(open(self.config_filename, 'w'))
377 self.usrp_source.set_gain(self.gain)
379 def set_freq(self, freq):
381 self._freq_text_box.set_value(self.freq)
382 self._saved_freq_config = ConfigParser.ConfigParser()
383 self._saved_freq_config.read(self.config_filename)
384 if not self._saved_freq_config.has_section('usrp'):
385 self._saved_freq_config.add_section('usrp')
386 self._saved_freq_config.set('usrp', 'freq', str(self.freq))
387 self._saved_freq_config.write(open(self.config_filename, 'w'))
388 self.usrp_source.set_frequency(self.freq)
390 def set_decim_text(self, decim_text):
391 self.decim_text = decim_text
392 self._decim_text_static_text.set_value(self.decim_text)
394 if __name__ == '__main__':
395 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
396 (options, args) = parser.parse_args()
397 if gr.enable_realtime_scheduling() != gr.RT_OK:
398 print "Error: failed to enable realtime scheduling."