b29af5654efc00751798fca598c59e3b24a85f5a
[debian/gnuradio] / gr-noaa / apps / usrp_rx_hrpt.py
1 #!/usr/bin/env python
2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP HRPT Receiver
5 # Generated: Sun Sep 20 19:30:17 2009
6 ##################################################
7
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 fftsink2
14 from gnuradio.wxgui import forms
15 from gnuradio.wxgui import scopesink2
16 from grc_gnuradio import wxgui as grc_wxgui
17 from optparse import OptionParser
18 import math
19 import wx
20
21 class usrp_rx_hrpt(grc_wxgui.top_block_gui):
22
23         def __init__(self, filename="", decim=16):
24                 grc_wxgui.top_block_gui.__init__(self, title="USRP HRPT Receiver")
25
26                 ##################################################
27                 # Parameters
28                 ##################################################
29                 self.filename = filename
30                 self.decim = decim
31
32                 ##################################################
33                 # Variables
34                 ##################################################
35                 self.sym_rate = sym_rate = 600*1109
36                 self.sample_rate = sample_rate = 64e6/decim
37                 self.sps = sps = sample_rate/sym_rate
38                 self.sync_alpha = sync_alpha = 0.1
39                 self.pll_alpha = pll_alpha = 0.005
40                 self.max_sync_offset = max_sync_offset = 0.01
41                 self.max_carrier_offset = max_carrier_offset = 2*math.pi*100e3/sample_rate
42                 self.hs = hs = int(sps/2.0)
43
44                 ##################################################
45                 # Notebooks
46                 ##################################################
47                 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
48                 self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX")
49                 self.displays.AddPage(grc_wxgui.Panel(self.displays), "PLL/SYNC")
50                 self.GridAdd(self.displays, 1, 0, 1, 2)
51
52                 ##################################################
53                 # Controls
54                 ##################################################
55                 _sync_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
56                 self._sync_alpha_text_box = forms.text_box(
57                         parent=self.GetWin(),
58                         sizer=_sync_alpha_sizer,
59                         value=self.sync_alpha,
60                         callback=self.set_sync_alpha,
61                         label="SYNC Alpha",
62                         converter=forms.float_converter(),
63                         proportion=0,
64                 )
65                 self._sync_alpha_slider = forms.slider(
66                         parent=self.GetWin(),
67                         sizer=_sync_alpha_sizer,
68                         value=self.sync_alpha,
69                         callback=self.set_sync_alpha,
70                         minimum=0.0,
71                         maximum=0.5,
72                         num_steps=500,
73                         style=wx.SL_HORIZONTAL,
74                         cast=float,
75                         proportion=1,
76                 )
77                 self.GridAdd(_sync_alpha_sizer, 0, 1, 1, 1)
78                 _pll_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
79                 self._pll_alpha_text_box = forms.text_box(
80                         parent=self.GetWin(),
81                         sizer=_pll_alpha_sizer,
82                         value=self.pll_alpha,
83                         callback=self.set_pll_alpha,
84                         label="PLL Alpha",
85                         converter=forms.float_converter(),
86                         proportion=0,
87                 )
88                 self._pll_alpha_slider = forms.slider(
89                         parent=self.GetWin(),
90                         sizer=_pll_alpha_sizer,
91                         value=self.pll_alpha,
92                         callback=self.set_pll_alpha,
93                         minimum=0.0,
94                         maximum=0.5,
95                         num_steps=500,
96                         style=wx.SL_HORIZONTAL,
97                         cast=float,
98                         proportion=1,
99                 )
100                 self.GridAdd(_pll_alpha_sizer, 0, 0, 1, 1)
101
102                 ##################################################
103                 # Blocks
104                 ##################################################
105                 self.agr = gr.agc_cc(1e-6, 1.0, 1.0, 1.0)
106                 self.gr_deinterleave_0 = gr.deinterleave(gr.sizeof_float*1)
107                 self.gr_file_sink_1 = gr.file_sink(gr.sizeof_short*1, "frames.dat")
108                 self.gr_file_source_0 = gr.file_source(gr.sizeof_short*1, filename, False)
109                 self.gr_float_to_complex_0 = gr.float_to_complex(1)
110                 self.gr_short_to_float_0 = gr.short_to_float()
111                 self.matched_filter = gr.moving_average_cc(hs, 1.0/hs, 4000)
112                 self.noaa_hrpt_decoder_0 = noaa.hrpt_decoder()
113                 self.noaa_hrpt_deframer_0 = noaa.hrpt_deframer()
114                 self.noaa_hrpt_pll_cf_0 = noaa.hrpt_pll_cf(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
115                 self.noaa_hrpt_sync_fb_0 = noaa.hrpt_sync_fb(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset)
116                 self.rx_fftsink = fftsink2.fft_sink_c(
117                         self.displays.GetPage(0).GetWin(),
118                         baseband_freq=1698e6,
119                         y_per_div=5,
120                         y_divs=8,
121                         ref_level=-5,
122                         ref_scale=2.0,
123                         sample_rate=sample_rate,
124                         fft_size=1024,
125                         fft_rate=30,
126                         average=True,
127                         avg_alpha=0.1,
128                         title="RX Spectrum",
129                         peak_hold=False,
130                 )
131                 self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1)
132                 self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate)
133                 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
134                         self.displays.GetPage(0).GetWin(),
135                         title="RX Waveform",
136                         sample_rate=sample_rate,
137                         v_scale=0,
138                         t_scale=20.0/sample_rate,
139                         ac_couple=False,
140                         xy_mode=False,
141                         num_inputs=1,
142                 )
143                 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
144                 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
145                         self.displays.GetPage(1).GetWin(),
146                         title="Post-PLL",
147                         sample_rate=sample_rate,
148                         v_scale=0.5,
149                         t_scale=20.0/sample_rate,
150                         ac_couple=False,
151                         xy_mode=False,
152                         num_inputs=1,
153                 )
154                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
155
156                 ##################################################
157                 # Connections
158                 ##################################################
159                 self.connect((self.throttle, 0), (self.agr, 0))
160                 self.connect((self.noaa_hrpt_deframer_0, 0), (self.gr_file_sink_1, 0))
161                 self.connect((self.noaa_hrpt_sync_fb_0, 0), (self.noaa_hrpt_deframer_0, 0))
162                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.noaa_hrpt_sync_fb_0, 0))
163                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.wxgui_scopesink2_0_0, 0))
164                 self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0))
165                 self.connect((self.agr, 0), (self.rx_fftsink, 0))
166                 self.connect((self.agr, 0), (self.matched_filter, 0))
167                 self.connect((self.matched_filter, 0), (self.noaa_hrpt_pll_cf_0, 0))
168                 self.connect((self.gr_float_to_complex_0, 0), (self.throttle, 0))
169                 self.connect((self.gr_short_to_float_0, 0), (self.gr_deinterleave_0, 0))
170                 self.connect((self.gr_deinterleave_0, 1), (self.gr_float_to_complex_0, 1))
171                 self.connect((self.gr_deinterleave_0, 0), (self.gr_float_to_complex_0, 0))
172                 self.connect((self.gr_file_source_0, 0), (self.gr_short_to_float_0, 0))
173                 self.connect((self.noaa_hrpt_deframer_0, 0), (self.noaa_hrpt_decoder_0, 0))
174
175         def set_filename(self, filename):
176                 self.filename = filename
177
178         def set_decim(self, decim):
179                 self.decim = decim
180                 self.set_sample_rate(64e6/self.decim)
181
182         def set_sym_rate(self, sym_rate):
183                 self.sym_rate = sym_rate
184                 self.set_sps(self.sample_rate/self.sym_rate)
185
186         def set_sample_rate(self, sample_rate):
187                 self.sample_rate = sample_rate
188                 self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate)
189                 self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate)
190                 self.rx_fftsink.set_sample_rate(self.sample_rate)
191                 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
192                 self.set_sps(self.sample_rate/self.sym_rate)
193
194         def set_sps(self, sps):
195                 self.sps = sps
196                 self.set_hs(int(self.sps/2.0))
197
198         def set_sync_alpha(self, sync_alpha):
199                 self.sync_alpha = sync_alpha
200                 self.noaa_hrpt_sync_fb_0.set_alpha(self.sync_alpha)
201                 self.noaa_hrpt_sync_fb_0.set_beta(self.sync_alpha**2/4.0)
202                 self._sync_alpha_slider.set_value(self.sync_alpha)
203                 self._sync_alpha_text_box.set_value(self.sync_alpha)
204
205         def set_pll_alpha(self, pll_alpha):
206                 self.pll_alpha = pll_alpha
207                 self._pll_alpha_slider.set_value(self.pll_alpha)
208                 self._pll_alpha_text_box.set_value(self.pll_alpha)
209                 self.noaa_hrpt_pll_cf_0.set_alpha(self.pll_alpha)
210                 self.noaa_hrpt_pll_cf_0.set_beta(self.pll_alpha**2/4.0)
211
212         def set_max_sync_offset(self, max_sync_offset):
213                 self.max_sync_offset = max_sync_offset
214                 self.noaa_hrpt_sync_fb_0.set_max_offset(self.max_sync_offset)
215
216         def set_max_carrier_offset(self, max_carrier_offset):
217                 self.max_carrier_offset = max_carrier_offset
218                 self.noaa_hrpt_pll_cf_0.set_max_offset(self.max_carrier_offset)
219
220         def set_hs(self, hs):
221                 self.hs = hs
222                 self.matched_filter.set_length_and_scale(self.hs, 1.0/self.hs)
223
224 if __name__ == '__main__':
225         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
226         parser.add_option("-f", "--filename", dest="filename", type="string", default="",
227                 help="Set Filename [default=%default]")
228         parser.add_option("-d", "--decim", dest="decim", type="intx", default=16,
229                 help="Set Decimation [default=%default]")
230         (options, args) = parser.parse_args()
231         tb = usrp_rx_hrpt(filename=options.filename, decim=options.decim)
232         tb.Run(True)
233