Houston, we have a trunk.
[debian/gnuradio] / gnuradio-examples / python / apps / hf_radio / ssbdemod.py
1 # This tries to push the hilbert transform for ssb demod back into the
2 # freq. xlating filter.
3 #
4 # The usual gnuradio copyright notice is hereby included by reference.
5 #
6 # The starting point for this was weaver_isb_am1_usrp3.py.
7 #
8 # The tap coefficients for freq_xlating_fir_filter_ccf were generated
9 # externally and are read from a file because I didn't want to learn how
10 # to make fir filters with arbitrary phase response using python numeric
11 # facilities.
12 #
13 # They were generated using Scilab which I am already familiar with.
14 # M. Revnell Jan 06
15
16 from gnuradio import gr, gru
17 from gnuradio import audio
18 from gnuradio import usrp
19
20 class ssb_demod( gr.hier_block ):
21     def __init__( self, fg, if_rate, af_rate ):
22
23         self.if_rate  = if_rate
24         self.af_rate  = af_rate
25         self.if_decim = if_rate / af_rate
26         self.sideband = 1
27
28         self.xlate_taps = ([complex(v) for v in file('ssb_taps').readlines()])
29         
30         self.audio_taps = gr.firdes.low_pass(
31             1.0,
32             self.af_rate,
33             3e3,
34             600,
35             gr.firdes.WIN_HAMMING )
36
37         self.xlate = gr.freq_xlating_fir_filter_ccc(
38             self.if_decim,
39             self.xlate_taps,
40             0,
41             self.if_rate )
42
43         self.split = gr.complex_to_float()
44
45         self.lpf = gr.fir_filter_fff(
46             1, self.audio_taps )
47
48         self.sum   = gr.add_ff( )
49         self.am_sel = gr.multiply_const_ff( 0 )
50         self.sb_sel = gr.multiply_const_ff( 1 )
51         self.mixer  = gr.add_ff()
52         self.am_det = gr.complex_to_mag()
53                 
54         fg.connect(   self.xlate,       self.split      )
55         fg.connect( ( self.split,0 ), ( self.sum,0    ) )
56         fg.connect( ( self.split,1 ), ( self.sum,1    ) )
57         fg.connect(    self.sum,        self.sb_sel     )
58         fg.connect(    self.xlate,      self.am_det     )
59         fg.connect(    self.sb_sel,   ( self.mixer, 0 ) )
60         fg.connect(    self.am_det,     self.am_sel     )
61         fg.connect(    self.am_sel,   ( self.mixer, 1 ) )
62         fg.connect(    self.mixer,      self.lpf        )
63         
64         gr.hier_block.__init__( self, fg, self.xlate, self.lpf )
65
66     def upper_sb( self ):
67         self.xlate.set_taps([v.conjugate() for v in self.xlate_taps])    
68         self.sb_sel.set_k( 1.0 )
69         self.am_sel.set_k( 0.0 )
70
71     def lower_sb( self ):
72         self.xlate.set_taps(self.xlate_taps)
73         self.sb_sel.set_k( 1.0 )
74         self.am_sel.set_k( 0.0 )
75         
76     def set_am( self ):
77         taps = gr.firdes.low_pass( 1.0,
78                                    self.if_rate,
79                                    5e3,
80                                    2e3,
81                                    gr.firdes.WIN_HAMMING )
82         self.xlate.set_taps( taps )
83         self.sb_sel.set_k( 0.0 )
84         self.am_sel.set_k( 1.0 )
85
86     def set_bw( self, bw ):
87         self.audio_taps = gr.firdes.low_pass(
88             1.0,
89             self.af_rate,
90             bw,
91             600,
92             gr.firdes.WIN_HAMMING )
93         self.lpf.set_taps( self.audio_taps )
94
95     def tune( self, freq ):
96         self.xlate.set_center_freq( freq )
97