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