1 # This tries to push the hilbert transform for ssb demod back into the
2 # freq. xlating filter.
4 # The usual gnuradio copyright notice is hereby included by reference.
6 # The starting point for this was weaver_isb_am1_usrp3.py.
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
13 # They were generated using Scilab which I am already familiar with.
16 from gnuradio import gr, gru
17 from gnuradio import audio
18 from gnuradio import usrp
20 class ssb_demod( gr.hier_block ):
21 def __init__( self, fg, if_rate, af_rate ):
23 self.if_rate = if_rate
24 self.af_rate = af_rate
25 self.if_decim = if_rate / af_rate
28 self.xlate_taps = ([complex(v) for v in file('ssb_taps').readlines()])
30 self.audio_taps = gr.firdes.low_pass(
35 gr.firdes.WIN_HAMMING )
37 self.xlate = gr.freq_xlating_fir_filter_ccc(
43 self.split = gr.complex_to_float()
45 self.lpf = gr.fir_filter_fff(
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()
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 )
64 gr.hier_block.__init__( self, fg, self.xlate, self.lpf )
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 )
72 self.xlate.set_taps(self.xlate_taps)
73 self.sb_sel.set_k( 1.0 )
74 self.am_sel.set_k( 0.0 )
77 taps = gr.firdes.low_pass( 1.0,
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 )
86 def set_bw( self, bw ):
87 self.audio_taps = gr.firdes.low_pass(
92 gr.firdes.WIN_HAMMING )
93 self.lpf.set_taps( self.audio_taps )
95 def tune( self, freq ):
96 self.xlate.set_center_freq( freq )