]> git.gag.com Git - debian/gnuradio/blob - gr-noaa/apps/usrp_rx_hrpt.py
Add HRPT word output to deframer
[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 12:45:30 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.005
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_file_sink_1 = gr.file_sink(gr.sizeof_short*1, "frames.dat")
102                 self.matched_filter = gr.moving_average_cc(hs, 1.0/hs, 4000)
103                 self.noaa_hrpt_deframer_0 = noaa.hrpt_deframer()
104                 self.noaa_hrpt_pll_cf_0 = noaa.hrpt_pll_cf(pll_alpha, pll_alpha**2/4.0, max_carrier_offset)
105                 self.noaa_hrpt_sync_fb_0 = noaa.hrpt_sync_fb(sync_alpha, sync_alpha**2/4.0, sps, max_sync_offset)
106                 self.rx_fftsink = fftsink2.fft_sink_c(
107                         self.displays.GetPage(0).GetWin(),
108                         baseband_freq=1698e6,
109                         y_per_div=5,
110                         y_divs=8,
111                         ref_level=-5,
112                         ref_scale=2.0,
113                         sample_rate=sample_rate,
114                         fft_size=1024,
115                         fft_rate=30,
116                         average=True,
117                         avg_alpha=0.1,
118                         title="RX Spectrum",
119                         peak_hold=False,
120                 )
121                 self.displays.GetPage(0).GridAdd(self.rx_fftsink.win, 0, 0, 1, 1)
122                 self.src = gr.file_source(gr.sizeof_gr_complex*1, "poes-d16.dat", False)
123                 self.throttle = gr.throttle(gr.sizeof_gr_complex*1, sample_rate)
124                 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
125                         self.displays.GetPage(0).GetWin(),
126                         title="RX Waveform",
127                         sample_rate=sample_rate,
128                         v_scale=0,
129                         t_scale=20.0/sample_rate,
130                         ac_couple=False,
131                         xy_mode=False,
132                         num_inputs=1,
133                 )
134                 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
135                 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
136                         self.displays.GetPage(1).GetWin(),
137                         title="Post-PLL",
138                         sample_rate=sample_rate,
139                         v_scale=0.5,
140                         t_scale=20.0/sample_rate,
141                         ac_couple=False,
142                         xy_mode=False,
143                         num_inputs=1,
144                 )
145                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
146
147                 ##################################################
148                 # Connections
149                 ##################################################
150                 self.connect((self.noaa_hrpt_deframer_0, 0), (self.gr_file_sink_1, 0))
151                 self.connect((self.noaa_hrpt_sync_fb_0, 0), (self.noaa_hrpt_deframer_0, 0))
152                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.noaa_hrpt_sync_fb_0, 0))
153                 self.connect((self.noaa_hrpt_pll_cf_0, 0), (self.wxgui_scopesink2_0_0, 0))
154                 self.connect((self.agr, 0), (self.wxgui_scopesink2_0, 0))
155                 self.connect((self.agr, 0), (self.rx_fftsink, 0))
156                 self.connect((self.throttle, 0), (self.agr, 0))
157                 self.connect((self.src, 0), (self.throttle, 0))
158                 self.connect((self.agr, 0), (self.matched_filter, 0))
159                 self.connect((self.matched_filter, 0), (self.noaa_hrpt_pll_cf_0, 0))
160
161         def set_decim(self, decim):
162                 self.decim = decim
163                 self.set_sample_rate(64e6/self.decim)
164
165         def set_sym_rate(self, sym_rate):
166                 self.sym_rate = sym_rate
167                 self.set_sps(self.sample_rate/self.sym_rate)
168
169         def set_sample_rate(self, sample_rate):
170                 self.sample_rate = sample_rate
171                 self.set_sps(self.sample_rate/self.sym_rate)
172                 self.set_max_carrier_offset(2*math.pi*100e3/self.sample_rate)
173                 self.wxgui_scopesink2_0_0.set_sample_rate(self.sample_rate)
174                 self.rx_fftsink.set_sample_rate(self.sample_rate)
175                 self.wxgui_scopesink2_0.set_sample_rate(self.sample_rate)
176
177         def set_sps(self, sps):
178                 self.sps = sps
179                 self.set_hs(int(self.sps/2.0))
180
181         def set_sync_alpha(self, sync_alpha):
182                 self.sync_alpha = sync_alpha
183                 self.noaa_hrpt_sync_fb_0.set_alpha(self.sync_alpha)
184                 self.noaa_hrpt_sync_fb_0.set_beta(self.sync_alpha**2/4.0)
185                 self._sync_alpha_slider.set_value(self.sync_alpha)
186                 self._sync_alpha_text_box.set_value(self.sync_alpha)
187
188         def set_pll_alpha(self, pll_alpha):
189                 self.pll_alpha = pll_alpha
190                 self._pll_alpha_slider.set_value(self.pll_alpha)
191                 self._pll_alpha_text_box.set_value(self.pll_alpha)
192                 self.noaa_hrpt_pll_cf_0.set_alpha(self.pll_alpha)
193                 self.noaa_hrpt_pll_cf_0.set_beta(self.pll_alpha**2/4.0)
194
195         def set_max_sync_offset(self, max_sync_offset):
196                 self.max_sync_offset = max_sync_offset
197                 self.noaa_hrpt_sync_fb_0.set_max_offset(self.max_sync_offset)
198
199         def set_max_carrier_offset(self, max_carrier_offset):
200                 self.max_carrier_offset = max_carrier_offset
201                 self.noaa_hrpt_pll_cf_0.set_max_offset(self.max_carrier_offset)
202
203         def set_hs(self, hs):
204                 self.hs = hs
205                 self.matched_filter.set_length_and_scale(self.hs, 1.0/self.hs)
206
207 if __name__ == '__main__':
208         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
209         (options, args) = parser.parse_args()
210         tb = usrp_rx_hrpt()
211         tb.Run(True)
212