2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP FLEX Pager Receiver (Single Channel)
5 # Generated: Thu Oct 29 11:03:16 2009
6 ##################################################
8 from gnuradio import blks2
9 from gnuradio import eng_notation
10 from gnuradio import gr
11 from gnuradio import pager
12 from gnuradio import window
13 from gnuradio.eng_option import eng_option
14 from gnuradio.gr import firdes
15 from gnuradio.wxgui import fftsink2
16 from gnuradio.wxgui import forms
17 from gnuradio.wxgui import scopesink2
18 from grc_gnuradio import usrp as grc_usrp
19 from grc_gnuradio import wxgui as grc_wxgui
20 from optparse import OptionParser
25 class usrp_rx_flex(grc_wxgui.top_block_gui):
28 grc_wxgui.top_block_gui.__init__(self, title="USRP FLEX Pager Receiver (Single Channel)")
30 ##################################################
32 ##################################################
33 self.config_filename = config_filename = os.environ["HOME"]+"/.gnuradio/config.conf"
34 self.symbol_rate = symbol_rate = 3200
35 self._saved_channel_config = ConfigParser.ConfigParser()
36 self._saved_channel_config.read(config_filename)
37 try: saved_channel = self._saved_channel_config.getint("gr-pager", "channel")
38 except: saved_channel = 25
39 self.saved_channel = saved_channel
40 self._saved_band_freq_config = ConfigParser.ConfigParser()
41 self._saved_band_freq_config.read(config_filename)
42 try: saved_band_freq = self._saved_band_freq_config.getfloat("gr-pager", "band_center")
43 except: saved_band_freq = 930.5125e6
44 self.saved_band_freq = saved_band_freq
45 self.deviation = deviation = 4800
46 self.decim = decim = 20
47 self.adc_rate = adc_rate = 64e6
48 self.sample_rate = sample_rate = adc_rate/decim
49 self.passband = passband = 2*(deviation+symbol_rate)
50 self.channel_rate = channel_rate = 8*3200
51 self.channel = channel = saved_channel
52 self.band_freq = band_freq = saved_band_freq
53 self._saved_rx_gain_config = ConfigParser.ConfigParser()
54 self._saved_rx_gain_config.read(config_filename)
55 try: saved_rx_gain = self._saved_rx_gain_config.getint("gr-pager", "rx_gain")
56 except: saved_rx_gain = 40
57 self.saved_rx_gain = saved_rx_gain
58 self._saved_offset_config = ConfigParser.ConfigParser()
59 self._saved_offset_config.read(config_filename)
60 try: saved_offset = self._saved_offset_config.getfloat("gr-pager", "freq_offset")
61 except: saved_offset = 0
62 self.saved_offset = saved_offset
63 self.freq = freq = band_freq+(channel-61)*25e3
64 self.channel_taps = channel_taps = firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0)
65 self.rx_gain = rx_gain = saved_rx_gain
66 self.offset = offset = saved_offset
67 self.nchan_taps = nchan_taps = len(channel_taps)
68 self.ma_ntaps = ma_ntaps = int(channel_rate/symbol_rate)
69 self.freq_text = freq_text = freq
70 self.demod_k = demod_k = 3*channel_rate/(2*math.pi*deviation)
71 self.channel_decim = channel_decim = int(sample_rate/channel_rate)
72 self.bb_interp = bb_interp = 5
73 self.bb_decim = bb_decim = 8
74 self.baseband_rate = baseband_rate = 16000
76 ##################################################
78 ##################################################
79 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
80 self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX Spectrum")
81 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Baseband")
82 self.GridAdd(self.displays, 1, 0, 1, 5)
84 ##################################################
86 ##################################################
87 _channel_sizer = wx.BoxSizer(wx.VERTICAL)
88 self._channel_text_box = forms.text_box(
92 callback=self.set_channel,
94 converter=forms.int_converter(),
97 self._channel_slider = forms.slider(
101 callback=self.set_channel,
105 style=wx.SL_HORIZONTAL,
109 self.GridAdd(_channel_sizer, 0, 1, 1, 1)
110 self._band_freq_text_box = forms.text_box(
111 parent=self.GetWin(),
112 value=self.band_freq,
113 callback=self.set_band_freq,
115 converter=forms.float_converter(),
117 self.GridAdd(self._band_freq_text_box, 0, 0, 1, 1)
118 _rx_gain_sizer = wx.BoxSizer(wx.VERTICAL)
119 self._rx_gain_text_box = forms.text_box(
120 parent=self.GetWin(),
121 sizer=_rx_gain_sizer,
123 callback=self.set_rx_gain,
125 converter=forms.int_converter(),
128 self._rx_gain_slider = forms.slider(
129 parent=self.GetWin(),
130 sizer=_rx_gain_sizer,
132 callback=self.set_rx_gain,
136 style=wx.SL_HORIZONTAL,
140 self.GridAdd(_rx_gain_sizer, 0, 4, 1, 1)
141 _offset_sizer = wx.BoxSizer(wx.VERTICAL)
142 self._offset_text_box = forms.text_box(
143 parent=self.GetWin(),
146 callback=self.set_offset,
147 label="Freq. Offset",
148 converter=forms.float_converter(),
151 self._offset_slider = forms.slider(
152 parent=self.GetWin(),
155 callback=self.set_offset,
159 style=wx.SL_HORIZONTAL,
163 self.GridAdd(_offset_sizer, 0, 3, 1, 1)
164 self._freq_text_static_text = forms.static_text(
165 parent=self.GetWin(),
166 value=self.freq_text,
167 callback=self.set_freq_text,
169 converter=forms.float_converter(),
171 self.GridAdd(self._freq_text_static_text, 0, 2, 1, 1)
173 ##################################################
175 ##################################################
176 self.fm_demod = gr.quadrature_demod_cf(demod_k)
177 self.gr_freq_xlating_fir_filter_xxx_0 = gr.freq_xlating_fir_filter_ccc(channel_decim, (channel_taps), band_freq-freq+offset, sample_rate)
178 self.gr_null_sink_0 = gr.null_sink(gr.sizeof_int*1)
179 self.gr_null_sink_0_0 = gr.null_sink(gr.sizeof_int*1)
180 self.gr_null_sink_0_1 = gr.null_sink(gr.sizeof_int*1)
181 self.gr_null_sink_0_2 = gr.null_sink(gr.sizeof_int*1)
182 self.pager_flex_deinterleave_0 = pager.flex_deinterleave()
183 self.pager_flex_deinterleave_0_0 = pager.flex_deinterleave()
184 self.pager_flex_deinterleave_0_1 = pager.flex_deinterleave()
185 self.pager_flex_deinterleave_0_1_0 = pager.flex_deinterleave()
186 self.pager_flex_sync_0 = pager.flex_sync()
187 self.pager_slicer_fb_0 = pager.slicer_fb(1e-6)
188 self.resampler = blks2.rational_resampler_fff(
189 interpolation=bb_interp,
191 taps=([1.0/ma_ntaps,]*ma_ntaps*bb_interp),
194 self.usrp_source = grc_usrp.simple_source_c(which=0, side="A", rx_ant="RXA")
195 self.usrp_source.set_decim_rate(decim)
196 self.usrp_source.set_frequency(band_freq, verbose=True)
197 self.usrp_source.set_gain(rx_gain)
198 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
199 self.displays.GetPage(0).GetWin(),
200 baseband_freq=band_freq,
205 sample_rate=sample_rate,
210 title="FLEX Spectrum",
213 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1)
214 self.wxgui_fftsink2_1 = fftsink2.fft_sink_c(
215 self.displays.GetPage(0).GetWin(),
221 sample_rate=channel_rate,
226 title="Channel Spectrum",
229 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_1.win, 1, 0, 1, 1)
230 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
231 self.displays.GetPage(1).GetWin(),
241 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
243 ##################################################
245 ##################################################
246 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_1, 0))
247 self.connect((self.usrp_source, 0), (self.gr_freq_xlating_fir_filter_xxx_0, 0))
248 self.connect((self.usrp_source, 0), (self.wxgui_fftsink2_0, 0))
249 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.fm_demod, 0))
250 self.connect((self.resampler, 0), (self.wxgui_scopesink2_0_0, 0))
251 self.connect((self.fm_demod, 0), (self.resampler, 0))
252 self.connect((self.pager_slicer_fb_0, 0), (self.pager_flex_sync_0, 0))
253 self.connect((self.resampler, 0), (self.pager_slicer_fb_0, 0))
254 self.connect((self.pager_flex_sync_0, 1), (self.pager_flex_deinterleave_0_1_0, 0))
255 self.connect((self.pager_flex_sync_0, 2), (self.pager_flex_deinterleave_0_1, 0))
256 self.connect((self.pager_flex_sync_0, 0), (self.pager_flex_deinterleave_0, 0))
257 self.connect((self.pager_flex_sync_0, 3), (self.pager_flex_deinterleave_0_0, 0))
258 self.connect((self.pager_flex_deinterleave_0, 0), (self.gr_null_sink_0, 0))
259 self.connect((self.pager_flex_deinterleave_0_1_0, 0), (self.gr_null_sink_0_0, 0))
260 self.connect((self.pager_flex_deinterleave_0_1, 0), (self.gr_null_sink_0_1, 0))
261 self.connect((self.pager_flex_deinterleave_0_0, 0), (self.gr_null_sink_0_2, 0))
263 def set_config_filename(self, config_filename):
264 self.config_filename = config_filename
265 self._saved_band_freq_config = ConfigParser.ConfigParser()
266 self._saved_band_freq_config.read(self.config_filename)
267 if not self._saved_band_freq_config.has_section("gr-pager"):
268 self._saved_band_freq_config.add_section("gr-pager")
269 self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
270 self._saved_band_freq_config.write(open(self.config_filename, 'w'))
271 self._saved_channel_config = ConfigParser.ConfigParser()
272 self._saved_channel_config.read(self.config_filename)
273 if not self._saved_channel_config.has_section("gr-pager"):
274 self._saved_channel_config.add_section("gr-pager")
275 self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
276 self._saved_channel_config.write(open(self.config_filename, 'w'))
277 self._saved_offset_config = ConfigParser.ConfigParser()
278 self._saved_offset_config.read(self.config_filename)
279 if not self._saved_offset_config.has_section("gr-pager"):
280 self._saved_offset_config.add_section("gr-pager")
281 self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
282 self._saved_offset_config.write(open(self.config_filename, 'w'))
283 self._saved_rx_gain_config = ConfigParser.ConfigParser()
284 self._saved_rx_gain_config.read(self.config_filename)
285 if not self._saved_rx_gain_config.has_section("gr-pager"):
286 self._saved_rx_gain_config.add_section("gr-pager")
287 self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
288 self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
290 def set_symbol_rate(self, symbol_rate):
291 self.symbol_rate = symbol_rate
292 self.set_passband(2*(self.deviation+self.symbol_rate))
293 self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate))
295 def set_saved_channel(self, saved_channel):
296 self.saved_channel = saved_channel
297 self.set_channel(self.saved_channel)
299 def set_saved_band_freq(self, saved_band_freq):
300 self.saved_band_freq = saved_band_freq
301 self.set_band_freq(self.saved_band_freq)
303 def set_deviation(self, deviation):
304 self.deviation = deviation
305 self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
306 self.set_passband(2*(self.deviation+self.symbol_rate))
308 def set_decim(self, decim):
310 self.set_sample_rate(self.adc_rate/self.decim)
311 self.usrp_source.set_decim_rate(self.decim)
313 def set_adc_rate(self, adc_rate):
314 self.adc_rate = adc_rate
315 self.set_sample_rate(self.adc_rate/self.decim)
317 def set_sample_rate(self, sample_rate):
318 self.sample_rate = sample_rate
319 self.wxgui_fftsink2_0.set_sample_rate(self.sample_rate)
320 self.set_channel_decim(int(self.sample_rate/self.channel_rate))
321 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
323 def set_passband(self, passband):
324 self.passband = passband
325 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
327 def set_channel_rate(self, channel_rate):
328 self.channel_rate = channel_rate
329 self.wxgui_fftsink2_1.set_sample_rate(self.channel_rate)
330 self.set_channel_decim(int(self.sample_rate/self.channel_rate))
331 self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
332 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
333 self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate))
335 def set_channel(self, channel):
336 self.channel = channel
337 self.set_freq(self.band_freq+(self.channel-61)*25e3)
338 self._saved_channel_config = ConfigParser.ConfigParser()
339 self._saved_channel_config.read(self.config_filename)
340 if not self._saved_channel_config.has_section("gr-pager"):
341 self._saved_channel_config.add_section("gr-pager")
342 self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
343 self._saved_channel_config.write(open(self.config_filename, 'w'))
344 self._channel_slider.set_value(self.channel)
345 self._channel_text_box.set_value(self.channel)
347 def set_band_freq(self, band_freq):
348 self.band_freq = band_freq
349 self.set_freq(self.band_freq+(self.channel-61)*25e3)
350 self.wxgui_fftsink2_0.set_baseband_freq(self.band_freq)
351 self.usrp_source.set_frequency(self.band_freq)
352 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
353 self._saved_band_freq_config = ConfigParser.ConfigParser()
354 self._saved_band_freq_config.read(self.config_filename)
355 if not self._saved_band_freq_config.has_section("gr-pager"):
356 self._saved_band_freq_config.add_section("gr-pager")
357 self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
358 self._saved_band_freq_config.write(open(self.config_filename, 'w'))
359 self._band_freq_text_box.set_value(self.band_freq)
361 def set_saved_rx_gain(self, saved_rx_gain):
362 self.saved_rx_gain = saved_rx_gain
363 self.set_rx_gain(self.saved_rx_gain)
365 def set_saved_offset(self, saved_offset):
366 self.saved_offset = saved_offset
367 self.set_offset(self.saved_offset)
369 def set_freq(self, freq):
371 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
372 self.wxgui_fftsink2_1.set_baseband_freq(self.freq)
373 self.set_freq_text(self.freq)
375 def set_channel_taps(self, channel_taps):
376 self.channel_taps = channel_taps
377 self.gr_freq_xlating_fir_filter_xxx_0.set_taps((self.channel_taps))
378 self.set_nchan_taps(len(self.channel_taps))
380 def set_rx_gain(self, rx_gain):
381 self.rx_gain = rx_gain
382 self.usrp_source.set_gain(self.rx_gain)
383 self._saved_rx_gain_config = ConfigParser.ConfigParser()
384 self._saved_rx_gain_config.read(self.config_filename)
385 if not self._saved_rx_gain_config.has_section("gr-pager"):
386 self._saved_rx_gain_config.add_section("gr-pager")
387 self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
388 self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
389 self._rx_gain_slider.set_value(self.rx_gain)
390 self._rx_gain_text_box.set_value(self.rx_gain)
392 def set_offset(self, offset):
394 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
395 self._saved_offset_config = ConfigParser.ConfigParser()
396 self._saved_offset_config.read(self.config_filename)
397 if not self._saved_offset_config.has_section("gr-pager"):
398 self._saved_offset_config.add_section("gr-pager")
399 self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
400 self._saved_offset_config.write(open(self.config_filename, 'w'))
401 self._offset_slider.set_value(self.offset)
402 self._offset_text_box.set_value(self.offset)
404 def set_nchan_taps(self, nchan_taps):
405 self.nchan_taps = nchan_taps
407 def set_ma_ntaps(self, ma_ntaps):
408 self.ma_ntaps = ma_ntaps
410 def set_freq_text(self, freq_text):
411 self.freq_text = freq_text
412 self._freq_text_static_text.set_value(self.freq_text)
414 def set_demod_k(self, demod_k):
415 self.demod_k = demod_k
417 def set_channel_decim(self, channel_decim):
418 self.channel_decim = channel_decim
420 def set_bb_interp(self, bb_interp):
421 self.bb_interp = bb_interp
423 def set_bb_decim(self, bb_decim):
424 self.bb_decim = bb_decim
426 def set_baseband_rate(self, baseband_rate):
427 self.baseband_rate = baseband_rate
429 if __name__ == '__main__':
430 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
431 (options, args) = parser.parse_args()