6c50a348a6d5071d9161390c6ce3f75aa2cdbd99
[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:09:57 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_deframer_0 = noaa.hrpt_deframer()
113                 self.noaa_hrpt_pll_cf_0 = noaa.hrpt_pll_cf(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
114                 self.noaa_hrpt_sync_fb_0 = noaa.hrpt_sync_fb(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset)
115                 self.rx_fftsink = fftsink2.fft_sink_c(
116                         self.displays.GetPage(0).GetWin(),
117                         baseband_freq=1698e6,
118                         y_per_div=5,
119                         y_divs=8,
120                         ref_level=-5,
121                         ref_scale=2.0,
122                         sample_rate=sample_rate,
123                         fft_size=1024,
124                         fft_rate=30,
125                         average=True,
126                         avg_alpha=0.1,
127                         title="RX Spectrum",
128                         peak_hold=False,
129                 )
130                 self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1)
131                 self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate)
132                 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
133                         self.displays.GetPage(0).GetWin(),
134                         title="RX Waveform",
135                         sample_rate=sample_rate,
136                         v_scale=0,
137                         t_scale=20.0/sample_rate,
138                         ac_couple=False,
139                         xy_mode=False,
140                         num_inputs=1,
141                 )
142                 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
143                 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
144                         self.displays.GetPage(1).GetWin(),
145                         title="Post-PLL",
146                         sample_rate=sample_rate,
147                         v_scale=0.5,
148                         t_scale=20.0/sample_rate,
149                         ac_couple=False,
150                         xy_mode=False,
151                         num_inputs=1,
152                 )
153                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
154
155                 ##################################################
156                 # Connections
157                 ##################################################
158                 self.connect((self.throttle, 0), (self.agr, 0))
159                 self.connect((self.noaa_hrpt_deframer_0, 0), (self.gr_file_sink_1, 0))
160                 self.connect((self.noaa_hrpt_sync_fb_0, 0), (self.noaa_hrpt_deframer_0, 0))
161                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.noaa_hrpt_sync_fb_0, 0))
162                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.wxgui_scopesink2_0_0, 0))
163                 self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0))
164                 self.connect((self.agr, 0), (self.rx_fftsink, 0))
165                 self.connect((self.agr, 0), (self.matched_filter, 0))
166                 self.connect((self.matched_filter, 0), (self.noaa_hrpt_pll_cf_0, 0))
167                 self.connect((self.gr_float_to_complex_0, 0), (self.throttle, 0))
168                 self.connect((self.gr_short_to_float_0, 0), (self.gr_deinterleave_0, 0))
169                 self.connect((self.gr_deinterleave_0, 1), (self.gr_float_to_complex_0, 1))
170                 self.connect((self.gr_deinterleave_0, 0), (self.gr_float_to_complex_0, 0))
171                 self.connect((self.gr_file_source_0, 0), (self.gr_short_to_float_0, 0))
172
173         def set_filename(self, filename):
174                 self.filename = filename
175
176         def set_decim(self, decim):
177                 self.decim = decim
178                 self.set_sample_rate(64e6/self.decim)
179
180         def set_sym_rate(self, sym_rate):
181                 self.sym_rate = sym_rate
182                 self.set_sps(self.sample_rate/self.sym_rate)
183
184         def set_sample_rate(self, sample_rate):
185                 self.sample_rate = sample_rate
186                 self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate)
187                 self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate)
188                 self.rx_fftsink.set_sample_rate(self.sample_rate)
189                 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
190                 self.set_sps(self.sample_rate/self.sym_rate)
191
192         def set_sps(self, sps):
193                 self.sps = sps
194                 self.set_hs(int(self.sps/2.0))
195
196         def set_sync_alpha(self, sync_alpha):
197                 self.sync_alpha = sync_alpha
198                 self.noaa_hrpt_sync_fb_0.set_alpha(self.sync_alpha)
199                 self.noaa_hrpt_sync_fb_0.set_beta(self.sync_alpha**2/4.0)
200                 self._sync_alpha_slider.set_value(self.sync_alpha)
201                 self._sync_alpha_text_box.set_value(self.sync_alpha)
202
203         def set_pll_alpha(self, pll_alpha):
204                 self.pll_alpha = pll_alpha
205                 self._pll_alpha_slider.set_value(self.pll_alpha)
206                 self._pll_alpha_text_box.set_value(self.pll_alpha)
207                 self.noaa_hrpt_pll_cf_0.set_alpha(self.pll_alpha)
208                 self.noaa_hrpt_pll_cf_0.set_beta(self.pll_alpha**2/4.0)
209
210         def set_max_sync_offset(self, max_sync_offset):
211                 self.max_sync_offset = max_sync_offset
212                 self.noaa_hrpt_sync_fb_0.set_max_offset(self.max_sync_offset)
213
214         def set_max_carrier_offset(self, max_carrier_offset):
215                 self.max_carrier_offset = max_carrier_offset
216                 self.noaa_hrpt_pll_cf_0.set_max_offset(self.max_carrier_offset)
217
218         def set_hs(self, hs):
219                 self.hs = hs
220                 self.matched_filter.set_length_and_scale(self.hs, 1.0/self.hs)
221
222 if __name__ == '__main__':
223         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
224         parser.add_option("-f", "--filename", dest="filename", type="string", default="",
225                 help="Set Filename [default=%default]")
226         parser.add_option("-d", "--decim", dest="decim", type="intx", default=16,
227                 help="Set Decimation [default=%default]")
228         (options, args) = parser.parse_args()
229         tb = usrp_rx_hrpt(filename=options.filename, decim=options.decim)
230         tb.Run(True)
231