2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP LRIT Receiver
5 # Generated: Sat Aug 29 11:26:03 2009
6 ##################################################
8 from gnuradio import gr
9 from gnuradio.eng_option import eng_option
10 from gnuradio.wxgui import fftsink2
11 from gnuradio.wxgui import forms
12 from gnuradio.wxgui import numbersink2
13 from gnuradio.wxgui import scopesink2
14 from grc_gnuradio import blks2 as grc_blks2
15 from grc_gnuradio import wxgui as grc_wxgui
16 from optparse import OptionParser
20 class usrp_rx_lrit(grc_wxgui.top_block_gui):
23 grc_wxgui.top_block_gui.__init__(self, title="USRP LRIT Receiver")
25 ##################################################
27 ##################################################
28 self.config_filename = config_filename = "usrp_rx_lrit.cfg"
29 self._saved_decim_config = ConfigParser.ConfigParser()
30 self._saved_decim_config.read(config_filename)
31 try: saved_decim = self._saved_decim_config.getint("main", "decim")
32 except: saved_decim = 160
33 self.saved_decim = saved_decim
34 self.decim = decim = saved_decim
35 self.symbol_rate = symbol_rate = 293e3
36 self._saved_gain_mu_config = ConfigParser.ConfigParser()
37 self._saved_gain_mu_config.read(config_filename)
38 try: saved_gain_mu = self._saved_gain_mu_config.getfloat("main", "gain_mu")
39 except: saved_gain_mu = 0.005
40 self.saved_gain_mu = saved_gain_mu
41 self._saved_gain_config = ConfigParser.ConfigParser()
42 self._saved_gain_config.read(config_filename)
43 try: saved_gain = self._saved_gain_config.getfloat("main", "gain")
44 except: saved_gain = 33
45 self.saved_gain = saved_gain
46 self._saved_freq_config = ConfigParser.ConfigParser()
47 self._saved_freq_config.read(config_filename)
48 try: saved_freq = self._saved_freq_config.getfloat("main", "freq")
49 except: saved_freq = 137e6
50 self.saved_freq = saved_freq
51 self._saved_costas_alpha_config = ConfigParser.ConfigParser()
52 self._saved_costas_alpha_config.read(config_filename)
53 try: saved_costas_alpha = self._saved_costas_alpha_config.getfloat("main", "costas_alpha")
54 except: saved_costas_alpha = 0.005
55 self.saved_costas_alpha = saved_costas_alpha
56 self.samp_rate = samp_rate = 64e6/decim
57 self.sps = sps = samp_rate/symbol_rate
58 self.gain_mu = gain_mu = saved_gain_mu
59 self.gain = gain = saved_gain
60 self.freq = freq = saved_freq
61 self.costas_alpha = costas_alpha = saved_costas_alpha
63 ##################################################
65 ##################################################
66 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
67 self.displays.AddPage(grc_wxgui.Panel(self.displays), "USRP RX")
68 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Costas Output")
69 self.GridAdd(self.displays, 2, 0, 1, 3)
71 ##################################################
73 ##################################################
74 self._decim_text_box = forms.text_box(
77 callback=self.set_decim,
79 converter=forms.int_converter(),
81 self.GridAdd(self._decim_text_box, 0, 0, 1, 1)
82 _gain_mu_sizer = wx.BoxSizer(wx.VERTICAL)
83 self._gain_mu_text_box = forms.text_box(
87 callback=self.set_gain_mu,
89 converter=forms.float_converter(),
92 self._gain_mu_slider = forms.slider(
96 callback=self.set_gain_mu,
100 style=wx.SL_HORIZONTAL,
104 self.GridAdd(_gain_mu_sizer, 1, 1, 1, 1)
105 _gain_sizer = wx.BoxSizer(wx.VERTICAL)
106 self._gain_text_box = forms.text_box(
107 parent=self.GetWin(),
110 callback=self.set_gain,
112 converter=forms.float_converter(),
115 self._gain_slider = forms.slider(
116 parent=self.GetWin(),
119 callback=self.set_gain,
123 style=wx.SL_HORIZONTAL,
127 self.GridAdd(_gain_sizer, 0, 1, 1, 1)
128 _freq_sizer = wx.BoxSizer(wx.VERTICAL)
129 self._freq_text_box = forms.text_box(
130 parent=self.GetWin(),
133 callback=self.set_freq,
135 converter=forms.float_converter(),
138 self._freq_slider = forms.slider(
139 parent=self.GetWin(),
142 callback=self.set_freq,
146 style=wx.SL_HORIZONTAL,
150 self.GridAdd(_freq_sizer, 0, 2, 1, 1)
151 _costas_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
152 self._costas_alpha_text_box = forms.text_box(
153 parent=self.GetWin(),
154 sizer=_costas_alpha_sizer,
155 value=self.costas_alpha,
156 callback=self.set_costas_alpha,
157 label="Costas Alpha",
158 converter=forms.float_converter(),
161 self._costas_alpha_slider = forms.slider(
162 parent=self.GetWin(),
163 sizer=_costas_alpha_sizer,
164 value=self.costas_alpha,
165 callback=self.set_costas_alpha,
169 style=wx.SL_HORIZONTAL,
173 self.GridAdd(_costas_alpha_sizer, 1, 0, 1, 1)
175 ##################################################
177 ##################################################
178 self.gr_add_const_vxx_0 = gr.add_const_vff((48.0, ))
179 self.gr_agc_xx_0 = gr.agc_cc(1e-6, 1.0, 1.0/32767.0, 1.0)
180 self.gr_binary_slicer_fb_0 = gr.binary_slicer_fb()
181 self.gr_char_to_float_0 = gr.char_to_float()
182 self.gr_complex_to_real_0 = gr.complex_to_real(1)
183 self.gr_file_sink_0 = gr.file_sink(gr.sizeof_char*1, "bits.dat")
184 self.gr_file_source_0 = gr.file_source(gr.sizeof_gr_complex*1, "lrit.dat", False)
185 self.gr_float_to_char_0 = gr.float_to_char()
186 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)
187 self.gr_probe_mpsk_snr_c_0 = grc_blks2.probe_mpsk_snr_c(
192 self.gr_throttle_0 = gr.throttle(gr.sizeof_gr_complex*1, samp_rate)
193 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
194 self.displays.GetPage(0).GetWin(),
199 sample_rate=samp_rate,
207 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1)
208 self.wxgui_numbersink2_0 = numbersink2.number_sink_f(
209 self.displays.GetPage(1).GetWin(),
224 self.displays.GetPage(1).GridAdd(self.wxgui_numbersink2_0.win, 2, 0, 1, 1)
225 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
226 self.displays.GetPage(0).GetWin(),
228 sample_rate=samp_rate,
230 t_scale=20.0/samp_rate,
235 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
236 self.wxgui_scopesink2_1 = scopesink2.scope_sink_c(
237 self.displays.GetPage(1).GetWin(),
239 sample_rate=samp_rate,
241 t_scale=20.0/samp_rate,
246 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_1.win, 0, 0, 1, 1)
248 ##################################################
250 ##################################################
251 self.connect((self.gr_agc_xx_0, 0), (self.wxgui_scopesink2_0, 0))
252 self.connect((self.gr_file_source_0, 0), (self.gr_throttle_0, 0))
253 self.connect((self.gr_throttle_0, 0), (self.gr_agc_xx_0, 0))
254 self.connect((self.gr_probe_mpsk_snr_c_0, 0), (self.wxgui_numbersink2_0, 0))
255 self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_probe_mpsk_snr_c_0, 0))
256 self.connect((self.gr_agc_xx_0, 0), (self.gr_mpsk_receiver_cc_0, 0))
257 self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0))
258 self.connect((self.gr_agc_xx_0, 0), (self.wxgui_fftsink2_0, 0))
259 self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_complex_to_real_0, 0))
260 self.connect((self.gr_complex_to_real_0, 0), (self.gr_binary_slicer_fb_0, 0))
261 self.connect((self.gr_binary_slicer_fb_0, 0), (self.gr_char_to_float_0, 0))
262 self.connect((self.gr_char_to_float_0, 0), (self.gr_add_const_vxx_0, 0))
263 self.connect((self.gr_add_const_vxx_0, 0), (self.gr_float_to_char_0, 0))
264 self.connect((self.gr_float_to_char_0, 0), (self.gr_file_sink_0, 0))
266 def set_config_filename(self, config_filename):
267 self.config_filename = config_filename
268 self._saved_decim_config = ConfigParser.ConfigParser()
269 self._saved_decim_config.read(self.config_filename)
270 if not self._saved_decim_config.has_section("main"):
271 self._saved_decim_config.add_section("main")
272 self._saved_decim_config.set("main", "decim", str(self.decim))
273 self._saved_decim_config.write(open(self.config_filename, 'w'))
274 self._saved_gain_config = ConfigParser.ConfigParser()
275 self._saved_gain_config.read(self.config_filename)
276 if not self._saved_gain_config.has_section("main"):
277 self._saved_gain_config.add_section("main")
278 self._saved_gain_config.set("main", "gain", str(self.gain))
279 self._saved_gain_config.write(open(self.config_filename, 'w'))
280 self._saved_freq_config = ConfigParser.ConfigParser()
281 self._saved_freq_config.read(self.config_filename)
282 if not self._saved_freq_config.has_section("main"):
283 self._saved_freq_config.add_section("main")
284 self._saved_freq_config.set("main", "freq", str(self.freq))
285 self._saved_freq_config.write(open(self.config_filename, 'w'))
286 self._saved_costas_alpha_config = ConfigParser.ConfigParser()
287 self._saved_costas_alpha_config.read(self.config_filename)
288 if not self._saved_costas_alpha_config.has_section("main"):
289 self._saved_costas_alpha_config.add_section("main")
290 self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha))
291 self._saved_costas_alpha_config.write(open(self.config_filename, 'w'))
292 self._saved_gain_mu_config = ConfigParser.ConfigParser()
293 self._saved_gain_mu_config.read(self.config_filename)
294 if not self._saved_gain_mu_config.has_section("main"):
295 self._saved_gain_mu_config.add_section("main")
296 self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu))
297 self._saved_gain_mu_config.write(open(self.config_filename, 'w'))
299 def set_saved_decim(self, saved_decim):
300 self.saved_decim = saved_decim
301 self.set_decim(self.saved_decim)
303 def set_decim(self, decim):
305 self.set_samp_rate(64e6/self.decim)
306 self._decim_text_box.set_value(self.decim)
307 self._saved_decim_config = ConfigParser.ConfigParser()
308 self._saved_decim_config.read(self.config_filename)
309 if not self._saved_decim_config.has_section("main"):
310 self._saved_decim_config.add_section("main")
311 self._saved_decim_config.set("main", "decim", str(self.decim))
312 self._saved_decim_config.write(open(self.config_filename, 'w'))
314 def set_symbol_rate(self, symbol_rate):
315 self.symbol_rate = symbol_rate
316 self.set_sps(self.samp_rate/self.symbol_rate)
318 def set_saved_gain_mu(self, saved_gain_mu):
319 self.saved_gain_mu = saved_gain_mu
320 self.set_gain_mu(self.saved_gain_mu)
322 def set_saved_gain(self, saved_gain):
323 self.saved_gain = saved_gain
324 self.set_gain(self.saved_gain)
326 def set_saved_freq(self, saved_freq):
327 self.saved_freq = saved_freq
328 self.set_freq(self.saved_freq)
330 def set_saved_costas_alpha(self, saved_costas_alpha):
331 self.saved_costas_alpha = saved_costas_alpha
332 self.set_costas_alpha(self.saved_costas_alpha)
334 def set_samp_rate(self, samp_rate):
335 self.samp_rate = samp_rate
336 self.set_sps(self.samp_rate/self.symbol_rate)
337 self.wxgui_scopesink2_0.set_sample_rate(self.samp_rate)
338 self.wxgui_fftsink2_0.set_sample_rate(self.samp_rate)
339 self.wxgui_scopesink2_1.set_sample_rate(self.samp_rate)
341 def set_sps(self, sps):
343 self.gr_mpsk_receiver_cc_0.set_omega(self.sps)
345 def set_gain_mu(self, gain_mu):
346 self.gain_mu = gain_mu
347 self.gr_mpsk_receiver_cc_0.set_gain_mu(self.gain_mu)
348 self.gr_mpsk_receiver_cc_0.set_gain_omega(self.gain_mu*self.gain_mu/4.0)
349 self._saved_gain_mu_config = ConfigParser.ConfigParser()
350 self._saved_gain_mu_config.read(self.config_filename)
351 if not self._saved_gain_mu_config.has_section("main"):
352 self._saved_gain_mu_config.add_section("main")
353 self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu))
354 self._saved_gain_mu_config.write(open(self.config_filename, 'w'))
355 self._gain_mu_slider.set_value(self.gain_mu)
356 self._gain_mu_text_box.set_value(self.gain_mu)
358 def set_gain(self, gain):
360 self._gain_slider.set_value(self.gain)
361 self._gain_text_box.set_value(self.gain)
362 self._saved_gain_config = ConfigParser.ConfigParser()
363 self._saved_gain_config.read(self.config_filename)
364 if not self._saved_gain_config.has_section("main"):
365 self._saved_gain_config.add_section("main")
366 self._saved_gain_config.set("main", "gain", str(self.gain))
367 self._saved_gain_config.write(open(self.config_filename, 'w'))
369 def set_freq(self, freq):
371 self.wxgui_fftsink2_0.set_baseband_freq(self.freq)
372 self._freq_slider.set_value(self.freq)
373 self._freq_text_box.set_value(self.freq)
374 self._saved_freq_config = ConfigParser.ConfigParser()
375 self._saved_freq_config.read(self.config_filename)
376 if not self._saved_freq_config.has_section("main"):
377 self._saved_freq_config.add_section("main")
378 self._saved_freq_config.set("main", "freq", str(self.freq))
379 self._saved_freq_config.write(open(self.config_filename, 'w'))
381 def set_costas_alpha(self, costas_alpha):
382 self.costas_alpha = costas_alpha
383 self.gr_mpsk_receiver_cc_0.set_alpha(self.costas_alpha)
384 self.gr_mpsk_receiver_cc_0.set_beta(self.costas_alpha*self.costas_alpha/4.0)
385 self._costas_alpha_slider.set_value(self.costas_alpha)
386 self._costas_alpha_text_box.set_value(self.costas_alpha)
387 self._saved_costas_alpha_config = ConfigParser.ConfigParser()
388 self._saved_costas_alpha_config.read(self.config_filename)
389 if not self._saved_costas_alpha_config.has_section("main"):
390 self._saved_costas_alpha_config.add_section("main")
391 self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha))
392 self._saved_costas_alpha_config.write(open(self.config_filename, 'w'))
394 if __name__ == '__main__':
395 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
396 (options, args) = parser.parse_args()