Added resampler and pushed matched filter into it.
[debian/gnuradio] / gr-pager / apps / usrp_rx_flex.py
1 #!/usr/bin/env python
2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP FLEX Pager Receiver (Single Channel)
5 # Generated: Thu Oct 29 08:04:51 2009
6 ##################################################
7
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
20 import ConfigParser
21 import os, math
22 import wx
23
24 class usrp_rx_flex(grc_wxgui.top_block_gui):
25
26         def __init__(self):
27                 grc_wxgui.top_block_gui.__init__(self, title="USRP FLEX Pager Receiver (Single Channel)")
28
29                 ##################################################
30                 # Variables
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)
71
72                 ##################################################
73                 # Notebooks
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)
79
80                 ##################################################
81                 # Controls
82                 ##################################################
83                 _channel_sizer = wx.BoxSizer(wx.VERTICAL)
84                 self._channel_text_box = forms.text_box(
85                         parent=self.GetWin(),
86                         sizer=_channel_sizer,
87                         value=self.channel,
88                         callback=self.set_channel,
89                         label="Channel",
90                         converter=forms.int_converter(),
91                         proportion=0,
92                 )
93                 self._channel_slider = forms.slider(
94                         parent=self.GetWin(),
95                         sizer=_channel_sizer,
96                         value=self.channel,
97                         callback=self.set_channel,
98                         minimum=1,
99                         maximum=120,
100                         num_steps=119,
101                         style=wx.SL_HORIZONTAL,
102                         cast=int,
103                         proportion=1,
104                 )
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,
110                         label="Band Freq.",
111                         converter=forms.float_converter(),
112                 )
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,
118                         value=self.rx_gain,
119                         callback=self.set_rx_gain,
120                         label="Analog Gain",
121                         converter=forms.int_converter(),
122                         proportion=0,
123                 )
124                 self._rx_gain_slider = forms.slider(
125                         parent=self.GetWin(),
126                         sizer=_rx_gain_sizer,
127                         value=self.rx_gain,
128                         callback=self.set_rx_gain,
129                         minimum=0,
130                         maximum=100,
131                         num_steps=100,
132                         style=wx.SL_HORIZONTAL,
133                         cast=int,
134                         proportion=1,
135                 )
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(),
140                         sizer=_offset_sizer,
141                         value=self.offset,
142                         callback=self.set_offset,
143                         label="Freq. Offset",
144                         converter=forms.float_converter(),
145                         proportion=0,
146                 )
147                 self._offset_slider = forms.slider(
148                         parent=self.GetWin(),
149                         sizer=_offset_sizer,
150                         value=self.offset,
151                         callback=self.set_offset,
152                         minimum=-12.5e3,
153                         maximum=12.5e3,
154                         num_steps=100,
155                         style=wx.SL_HORIZONTAL,
156                         cast=float,
157                         proportion=1,
158                 )
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,
164                         label="Ch. Freq",
165                         converter=forms.float_converter(),
166                 )
167                 self.GridAdd(self._freq_text_static_text, 0, 2, 1, 1)
168
169                 ##################################################
170                 # Blocks
171                 ##################################################
172                 self.blks2_rational_resampler_xxx_0 = blks2.rational_resampler_fff(
173                         interpolation=5,
174                         decimation=8,
175                         taps=([1.0/8.0,]*40),
176                         fractional_bw=None,
177                 )
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,
187                         y_per_div=10,
188                         y_divs=10,
189                         ref_level=0,
190                         ref_scale=65536,
191                         sample_rate=sample_rate,
192                         fft_size=1024,
193                         fft_rate=30,
194                         average=False,
195                         avg_alpha=None,
196                         title="FLEX Spectrum",
197                         peak_hold=False,
198                 )
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(),
202                         baseband_freq=freq,
203                         y_per_div=10,
204                         y_divs=10,
205                         ref_level=0,
206                         ref_scale=65536,
207                         sample_rate=channel_rate,
208                         fft_size=1024,
209                         fft_rate=30,
210                         average=False,
211                         avg_alpha=None,
212                         title="Channel Spectrum",
213                         peak_hold=False,
214                 )
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,
220                         v_scale=8e3,
221                         v_offset=0,
222                         t_scale=20.0/channel_rate,
223                         ac_couple=False,
224                         xy_mode=False,
225                         num_inputs=1,
226                 )
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(),
230                         title="Baseband",
231                         sample_rate=16e3,
232                         v_scale=1,
233                         v_offset=0,
234                         t_scale=40.0/16e3,
235                         ac_couple=False,
236                         xy_mode=False,
237                         num_inputs=1,
238                 )
239                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 1, 0, 1, 1)
240
241                 ##################################################
242                 # Connections
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))
251
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'))
278
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)
283
284         def set_saved_channel(self, saved_channel):
285                 self.saved_channel = saved_channel
286                 self.set_channel(self.saved_channel)
287
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)
291
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))
296
297         def set_decim(self, decim):
298                 self.decim = decim
299                 self.set_sample_rate(self.adc_rate/self.decim)
300                 self.usrp_source.set_decim_rate(self.decim)
301
302         def set_adc_rate(self, adc_rate):
303                 self.adc_rate = adc_rate
304                 self.set_sample_rate(self.adc_rate/self.decim)
305
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))
311
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))
315
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)
324
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)
336
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)
350
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)
354
355         def set_saved_offset(self, saved_offset):
356                 self.saved_offset = saved_offset
357                 self.set_offset(self.saved_offset)
358
359         def set_freq(self, freq):
360                 self.freq = 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)
364
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))
369
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)
381
382         def set_offset(self, offset):
383                 self.offset = 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)
393
394         def set_nchan_taps(self, nchan_taps):
395                 self.nchan_taps = nchan_taps
396
397         def set_ma_ntaps(self, ma_ntaps):
398                 self.ma_ntaps = ma_ntaps
399
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)
403
404         def set_demod_k(self, demod_k):
405                 self.demod_k = demod_k
406
407         def set_channel_decim(self, channel_decim):
408                 self.channel_decim = channel_decim
409
410 if __name__ == '__main__':
411         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
412         (options, args) = parser.parse_args()
413         tb = usrp_rx_flex()
414         tb.Run(True)
415