]> git.gag.com Git - debian/gnuradio/blob - gr-noaa/grc/usrp_rx_hrpt.py
Updated HRPT blocks/scripts for testing. Seeing good minor frame sync's.
[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: Mon Sep  7 13:05:09 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_add_const_vxx_0 = gr.add_const_vff((48.0, ))
102                 self.gr_binary_slicer_fb_0 = gr.binary_slicer_fb()
103                 self.gr_char_to_float_0 = gr.char_to_float()
104                 self.gr_file_sink_0 = gr.file_sink(gr.sizeof_char*1, "bits.dat")
105                 self.gr_float_to_char_0 = gr.float_to_char()
106                 self.noaa_hrpt_pll_cf_0 = noaa.hrpt_pll_cf(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
107                 self.noaa_hrpt_sync_ff_0 = noaa.hrpt_sync_ff(.005, .005*.005/4.0, sps, max_sync_offset)
108                 self.rx_fftsink = fftsink2.fft_sink_c(
109                         self.displays.GetPage(0).GetWin(),
110                         baseband_freq=1698e6,
111                         y_per_div=5,
112                         y_divs=8,
113                         ref_level=20,
114                         ref_scale=2.0,
115                         sample_rate=sample_rate,
116                         fft_size=1024,
117                         fft_rate=30,
118                         average=True,
119                         avg_alpha=0.1,
120                         title="RX Spectrum",
121                         peak_hold=False,
122                 )
123                 self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1)
124                 self.src = gr.file_source(gr.sizeof_gr_complex*1, "poes-d16.dat", False)
125                 self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate)
126                 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
127                         self.displays.GetPage(0).GetWin(),
128                         title="RX Waveform",
129                         sample_rate=sample_rate,
130                         v_scale=0,
131                         t_scale=20.0/sample_rate,
132                         ac_couple=False,
133                         xy_mode=False,
134                         num_inputs=1,
135                 )
136                 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
137                 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
138                         self.displays.GetPage(1).GetWin(),
139                         title="Post-PLL",
140                         sample_rate=sample_rate,
141                         v_scale=0.5,
142                         t_scale=20.0/sample_rate,
143                         ac_couple=False,
144                         xy_mode=False,
145                         num_inputs=1,
146                 )
147                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
148                 self.wxgui_scopesink2_0_0_0_0 = scopesink2.scope_sink_f(
149                         self.displays.GetPage(1).GetWin(),
150                         title="Post-SYNC",
151                         sample_rate=sym_rate,
152                         v_scale=0.5,
153                         t_scale=20.0/sym_rate,
154                         ac_couple=False,
155                         xy_mode=False,
156                         num_inputs=1,
157                 )
158                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0_0_0.win, 1, 0, 1, 1)
159
160                 ##################################################
161                 # Connections
162                 ##################################################
163                 self.connect((self.src, 0), (self.throttle, 0))
164                 self.connect((self.throttle, 0), (self.agr, 0))
165                 self.connect((self.agr, 0), (self.rx_fftsink, 0))
166                 self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0))
167                 self.connect((self.agr, 0), (self.noaa_hrpt_pll_cf_0, 0))
168                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.wxgui_scopesink2_0_0, 0))
169                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.noaa_hrpt_sync_ff_0, 0))
170                 self.connect((self.noaa_hrpt_sync_ff_0, 0), (self.gr_binary_slicer_fb_0, 0))
171                 self.connect((self.noaa_hrpt_sync_ff_0, 0), (self.wxgui_scopesink2_0_0_0_0, 0))
172                 self.connect((self.gr_binary_slicer_fb_0, 0), (self.gr_char_to_float_0, 0))
173                 self.connect((self.gr_float_to_char_0, 0), (self.gr_file_sink_0, 0))
174                 self.connect((self.gr_add_const_vxx_0, 0), (self.gr_float_to_char_0, 0))
175                 self.connect((self.gr_char_to_float_0, 0), (self.gr_add_const_vxx_0, 0))
176
177         def set_decim(self, decim):
178                 self.decim = decim
179                 self.set_sample_rate(64e6/self.decim)
180
181         def set_sym_rate(self, sym_rate):
182                 self.sym_rate = sym_rate
183                 self.set_sps(self.sample_rate/self.sym_rate)
184                 self.wxgui_scopesink2_0_0_0_0.set_sample_rate(self.sym_rate)
185
186         def set_sample_rate(self, sample_rate):
187                 self.sample_rate = sample_rate
188                 self.set_sps(self.sample_rate/self.sym_rate)
189                 self.rx_fftsink.set_sample_rate(self.sample_rate)
190                 self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate)
191                 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
192                 self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_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._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_ff_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
221 if __name__ == '__main__':
222         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
223         (options, args) = parser.parse_args()
224         tb = usrp_rx_hrpt()
225         tb.Run(True)
226