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