2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP FLEX Pager Receiver (Single Channel)
5 # Generated: Thu Oct 29 08:04:51 2009
6 ##################################################
8 from gnuradio import blks2
9 from gnuradio import eng_notation
10 from gnuradio import gr
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_flex(grc_wxgui.top_block_gui):
27 grc_wxgui.top_block_gui.__init__(self, title="USRP FLEX Pager Receiver (Single Channel)")
29 ##################################################
31 ##################################################
32 self.config_filename = config_filename = os.environ["HOME"]+"/.gnuradio/config.conf"
33 self.symbol_rate = symbol_rate = 3200
34 self._saved_channel_config = ConfigParser.ConfigParser()
35 self._saved_channel_config.read(config_filename)
36 try: saved_channel = self._saved_channel_config.getint("gr-pager", "channel")
37 except: saved_channel = 25
38 self.saved_channel = saved_channel
39 self._saved_band_freq_config = ConfigParser.ConfigParser()
40 self._saved_band_freq_config.read(config_filename)
41 try: saved_band_freq = self._saved_band_freq_config.getfloat("gr-pager", "band_center")
42 except: saved_band_freq = 930.5125e6
43 self.saved_band_freq = saved_band_freq
44 self.deviation = deviation = 4800
45 self.decim = decim = 20
46 self.adc_rate = adc_rate = 64e6
47 self.sample_rate = sample_rate = adc_rate/decim
48 self.passband = passband = 2*(deviation+symbol_rate)
49 self.channel_rate = channel_rate = 8*3200
50 self.channel = channel = saved_channel
51 self.band_freq = band_freq = saved_band_freq
52 self._saved_rx_gain_config = ConfigParser.ConfigParser()
53 self._saved_rx_gain_config.read(config_filename)
54 try: saved_rx_gain = self._saved_rx_gain_config.getint("gr-pager", "rx_gain")
55 except: saved_rx_gain = 40
56 self.saved_rx_gain = saved_rx_gain
57 self._saved_offset_config = ConfigParser.ConfigParser()
58 self._saved_offset_config.read(config_filename)
59 try: saved_offset = self._saved_offset_config.getfloat("gr-pager", "freq_offset")
60 except: saved_offset = 0
61 self.saved_offset = saved_offset
62 self.freq = freq = band_freq+(channel-61)*25e3
63 self.channel_taps = channel_taps = firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0)
64 self.rx_gain = rx_gain = saved_rx_gain
65 self.offset = offset = saved_offset
66 self.nchan_taps = nchan_taps = len(channel_taps)
67 self.ma_ntaps = ma_ntaps = channel_rate/symbol_rate
68 self.freq_text = freq_text = freq
69 self.demod_k = demod_k = 3*channel_rate/(2*math.pi*deviation)
70 self.channel_decim = channel_decim = int(sample_rate/channel_rate)
72 ##################################################
74 ##################################################
75 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
76 self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX Spectrum")
77 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Baseband")
78 self.GridAdd(self.displays, 1, 0, 1, 5)
80 ##################################################
82 ##################################################
83 _channel_sizer = wx.BoxSizer(wx.VERTICAL)
84 self._channel_text_box = forms.text_box(
88 callback=self.set_channel,
90 converter=forms.int_converter(),
93 self._channel_slider = forms.slider(
97 callback=self.set_channel,
101 style=wx.SL_HORIZONTAL,
105 self.GridAdd(_channel_sizer, 0, 1, 1, 1)
106 self._band_freq_text_box = forms.text_box(
107 parent=self.GetWin(),
108 value=self.band_freq,
109 callback=self.set_band_freq,
111 converter=forms.float_converter(),
113 self.GridAdd(self._band_freq_text_box, 0, 0, 1, 1)
114 _rx_gain_sizer = wx.BoxSizer(wx.VERTICAL)
115 self._rx_gain_text_box = forms.text_box(
116 parent=self.GetWin(),
117 sizer=_rx_gain_sizer,
119 callback=self.set_rx_gain,
121 converter=forms.int_converter(),
124 self._rx_gain_slider = forms.slider(
125 parent=self.GetWin(),
126 sizer=_rx_gain_sizer,
128 callback=self.set_rx_gain,
132 style=wx.SL_HORIZONTAL,
136 self.GridAdd(_rx_gain_sizer, 0, 4, 1, 1)
137 _offset_sizer = wx.BoxSizer(wx.VERTICAL)
138 self._offset_text_box = forms.text_box(
139 parent=self.GetWin(),
142 callback=self.set_offset,
143 label="Freq. Offset",
144 converter=forms.float_converter(),
147 self._offset_slider = forms.slider(
148 parent=self.GetWin(),
151 callback=self.set_offset,
155 style=wx.SL_HORIZONTAL,
159 self.GridAdd(_offset_sizer, 0, 3, 1, 1)
160 self._freq_text_static_text = forms.static_text(
161 parent=self.GetWin(),
162 value=self.freq_text,
163 callback=self.set_freq_text,
165 converter=forms.float_converter(),
167 self.GridAdd(self._freq_text_static_text, 0, 2, 1, 1)
169 ##################################################
171 ##################################################
172 self.blks2_rational_resampler_xxx_0 = blks2.rational_resampler_fff(
175 taps=([1.0/8.0,]*40),
178 self.fm_demod = gr.quadrature_demod_cf(demod_k)
179 self.gr_freq_xlating_fir_filter_xxx_0 = gr.freq_xlating_fir_filter_ccc(channel_decim, (channel_taps), band_freq-freq+offset, sample_rate)
180 self.usrp_source = grc_usrp.simple_source_c(which=0, side="A", rx_ant="RXA")
181 self.usrp_source.set_decim_rate(decim)
182 self.usrp_source.set_frequency(band_freq, verbose=True)
183 self.usrp_source.set_gain(rx_gain)
184 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
185 self.displays.GetPage(0).GetWin(),
186 baseband_freq=band_freq,
191 sample_rate=sample_rate,
196 title="FLEX Spectrum",
199 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1)
200 self.wxgui_fftsink2_1 = fftsink2.fft_sink_c(
201 self.displays.GetPage(0).GetWin(),
207 sample_rate=channel_rate,
212 title="Channel Spectrum",
215 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_1.win, 1, 0, 1, 1)
216 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
217 self.displays.GetPage(1).GetWin(),
218 title="Channel Waveform",
219 sample_rate=channel_rate,
222 t_scale=20.0/channel_rate,
227 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0.win, 0, 0, 1, 1)
228 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
229 self.displays.GetPage(1).GetWin(),
239 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 1, 0, 1, 1)
241 ##################################################
243 ##################################################
244 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_1, 0))
245 self.connect((self.usrp_source, 0), (self.gr_freq_xlating_fir_filter_xxx_0, 0))
246 self.connect((self.usrp_source, 0), (self.wxgui_fftsink2_0, 0))
247 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_scopesink2_0, 0))
248 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.fm_demod, 0))
249 self.connect((self.blks2_rational_resampler_xxx_0, 0), (self.wxgui_scopesink2_0_0, 0))
250 self.connect((self.fm_demod, 0), (self.blks2_rational_resampler_xxx_0, 0))
252 def set_config_filename(self, config_filename):
253 self.config_filename = config_filename
254 self._saved_band_freq_config = ConfigParser.ConfigParser()
255 self._saved_band_freq_config.read(self.config_filename)
256 if not self._saved_band_freq_config.has_section("gr-pager"):
257 self._saved_band_freq_config.add_section("gr-pager")
258 self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
259 self._saved_band_freq_config.write(open(self.config_filename, 'w'))
260 self._saved_channel_config = ConfigParser.ConfigParser()
261 self._saved_channel_config.read(self.config_filename)
262 if not self._saved_channel_config.has_section("gr-pager"):
263 self._saved_channel_config.add_section("gr-pager")
264 self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
265 self._saved_channel_config.write(open(self.config_filename, 'w'))
266 self._saved_offset_config = ConfigParser.ConfigParser()
267 self._saved_offset_config.read(self.config_filename)
268 if not self._saved_offset_config.has_section("gr-pager"):
269 self._saved_offset_config.add_section("gr-pager")
270 self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
271 self._saved_offset_config.write(open(self.config_filename, 'w'))
272 self._saved_rx_gain_config = ConfigParser.ConfigParser()
273 self._saved_rx_gain_config.read(self.config_filename)
274 if not self._saved_rx_gain_config.has_section("gr-pager"):
275 self._saved_rx_gain_config.add_section("gr-pager")
276 self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
277 self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
279 def set_symbol_rate(self, symbol_rate):
280 self.symbol_rate = symbol_rate
281 self.set_passband(2*(self.deviation+self.symbol_rate))
282 self.set_ma_ntaps(self.channel_rate/self.symbol_rate)
284 def set_saved_channel(self, saved_channel):
285 self.saved_channel = saved_channel
286 self.set_channel(self.saved_channel)
288 def set_saved_band_freq(self, saved_band_freq):
289 self.saved_band_freq = saved_band_freq
290 self.set_band_freq(self.saved_band_freq)
292 def set_deviation(self, deviation):
293 self.deviation = deviation
294 self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
295 self.set_passband(2*(self.deviation+self.symbol_rate))
297 def set_decim(self, decim):
299 self.set_sample_rate(self.adc_rate/self.decim)
300 self.usrp_source.set_decim_rate(self.decim)
302 def set_adc_rate(self, adc_rate):
303 self.adc_rate = adc_rate
304 self.set_sample_rate(self.adc_rate/self.decim)
306 def set_sample_rate(self, sample_rate):
307 self.sample_rate = sample_rate
308 self.wxgui_fftsink2_0.set_sample_rate(self.sample_rate)
309 self.set_channel_decim(int(self.sample_rate/self.channel_rate))
310 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
312 def set_passband(self, passband):
313 self.passband = passband
314 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
316 def set_channel_rate(self, channel_rate):
317 self.channel_rate = channel_rate
318 self.wxgui_scopesink2_0.set_sample_rate(self.channel_rate)
319 self.wxgui_fftsink2_1.set_sample_rate(self.channel_rate)
320 self.set_channel_decim(int(self.sample_rate/self.channel_rate))
321 self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
322 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
323 self.set_ma_ntaps(self.channel_rate/self.symbol_rate)
325 def set_channel(self, channel):
326 self.channel = channel
327 self.set_freq(self.band_freq+(self.channel-61)*25e3)
328 self._saved_channel_config = ConfigParser.ConfigParser()
329 self._saved_channel_config.read(self.config_filename)
330 if not self._saved_channel_config.has_section("gr-pager"):
331 self._saved_channel_config.add_section("gr-pager")
332 self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
333 self._saved_channel_config.write(open(self.config_filename, 'w'))
334 self._channel_slider.set_value(self.channel)
335 self._channel_text_box.set_value(self.channel)
337 def set_band_freq(self, band_freq):
338 self.band_freq = band_freq
339 self.set_freq(self.band_freq+(self.channel-61)*25e3)
340 self.wxgui_fftsink2_0.set_baseband_freq(self.band_freq)
341 self.usrp_source.set_frequency(self.band_freq)
342 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
343 self._saved_band_freq_config = ConfigParser.ConfigParser()
344 self._saved_band_freq_config.read(self.config_filename)
345 if not self._saved_band_freq_config.has_section("gr-pager"):
346 self._saved_band_freq_config.add_section("gr-pager")
347 self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
348 self._saved_band_freq_config.write(open(self.config_filename, 'w'))
349 self._band_freq_text_box.set_value(self.band_freq)
351 def set_saved_rx_gain(self, saved_rx_gain):
352 self.saved_rx_gain = saved_rx_gain
353 self.set_rx_gain(self.saved_rx_gain)
355 def set_saved_offset(self, saved_offset):
356 self.saved_offset = saved_offset
357 self.set_offset(self.saved_offset)
359 def set_freq(self, freq):
361 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
362 self.wxgui_fftsink2_1.set_baseband_freq(self.freq)
363 self.set_freq_text(self.freq)
365 def set_channel_taps(self, channel_taps):
366 self.channel_taps = channel_taps
367 self.gr_freq_xlating_fir_filter_xxx_0.set_taps((self.channel_taps))
368 self.set_nchan_taps(len(self.channel_taps))
370 def set_rx_gain(self, rx_gain):
371 self.rx_gain = rx_gain
372 self.usrp_source.set_gain(self.rx_gain)
373 self._saved_rx_gain_config = ConfigParser.ConfigParser()
374 self._saved_rx_gain_config.read(self.config_filename)
375 if not self._saved_rx_gain_config.has_section("gr-pager"):
376 self._saved_rx_gain_config.add_section("gr-pager")
377 self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
378 self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
379 self._rx_gain_slider.set_value(self.rx_gain)
380 self._rx_gain_text_box.set_value(self.rx_gain)
382 def set_offset(self, offset):
384 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
385 self._saved_offset_config = ConfigParser.ConfigParser()
386 self._saved_offset_config.read(self.config_filename)
387 if not self._saved_offset_config.has_section("gr-pager"):
388 self._saved_offset_config.add_section("gr-pager")
389 self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
390 self._saved_offset_config.write(open(self.config_filename, 'w'))
391 self._offset_slider.set_value(self.offset)
392 self._offset_text_box.set_value(self.offset)
394 def set_nchan_taps(self, nchan_taps):
395 self.nchan_taps = nchan_taps
397 def set_ma_ntaps(self, ma_ntaps):
398 self.ma_ntaps = ma_ntaps
400 def set_freq_text(self, freq_text):
401 self.freq_text = freq_text
402 self._freq_text_static_text.set_value(self.freq_text)
404 def set_demod_k(self, demod_k):
405 self.demod_k = demod_k
407 def set_channel_decim(self, channel_decim):
408 self.channel_decim = channel_decim
410 if __name__ == '__main__':
411 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
412 (options, args) = parser.parse_args()