discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] Re: ssb demod


From: mike revnell
Subject: [Discuss-gnuradio] Re: ssb demod
Date: Tue, 27 Dec 2005 21:53:53 -0700
User-agent: Mozilla Thunderbird 1.0 (X11/20041206)

Well, back to the drawing board. I started tracking down the problem and discovered I've been using another block all along which uses a conventional hilbert transformer and matched delay. A problem with using the same interface to different blocks.

The tap set in the tarball seems to implement a notch near zero.

This is the one I've been using when thinking I was using the other.

Also explains why nothing seemed to change when I took out the agc block.


# An attempt to use a hilbert transformer to do ssb demod.
#


from gnuradio import gr, gru
from gnuradio import audio
from gnuradio import usrp

class ssb_demod( gr.hier_block ):
   def __init__( self, fg, if_rate, af_rate ):

       self.if_rate  = if_rate
       self.af_rate  = af_rate
       self.if_decim = if_rate / af_rate
       self.sideband = 1

       self.hilb_taps =  gr.firdes.hilbert( 255 )
self.xlate_taps = gr.firdes.low_pass(
           1.0,
           self.if_rate,
           20e3,
           10e3,
           gr.firdes.WIN_HAMMING )
self.audio_taps = gr.firdes.low_pass(
           1.0,
           self.af_rate,
           3e3,
           600,
           gr.firdes.WIN_HAMMING )

       self.xlate = gr.freq_xlating_fir_filter_ccf(
           self.if_decim,
           self.xlate_taps,
           0,
           self.if_rate )

       self.filt  = gr.filter_delay_fc( self.hilb_taps )
self.split = gr.complex_to_float( )
       self.split2 = gr.complex_to_float( )

       self.lpf_i = gr.fir_filter_fff(
           1, self.audio_taps )

       self.lpf_q = gr.fir_filter_fff(
           1, self.audio_taps )

       self.sum_l = gr.add_ff( )
       self.sum_u = gr.sub_ff( )
       self.sel_u = gr.multiply_const_ff( 0 )
       self.sel_l = gr.multiply_const_ff( 1 )
       self.sum   = gr.add_ff( )

       self.sqr   = gr.multiply_ff( )
       self.int0  = gr.iir_filter_ffd( [.004, 0], [0, .999] )
       self.offs  = gr.add_const_ff( 1 )
       self.gain  = gr.multiply_const_ff( .25 )
       self.agc   = gr.divide_ff( )
fg.connect( self.xlate, self.split )
       fg.connect( ( self.split, 0 ),     self.lpf_i      )
       fg.connect( ( self.split, 1 ),     self.lpf_q      )
       fg.connect(   self.lpf_i,        ( self.filt,  0 ) )
       fg.connect(   self.lpf_q,        ( self.filt,  1 ) )
       fg.connect(   self.filt,           self.split2     )
       fg.connect( ( self.split2, 0 ),  ( self.sum_l, 0 ) )
       fg.connect( ( self.split2, 1 ),  ( self.sum_l, 1 ) )
       fg.connect( ( self.split2, 0 ),  ( self.sum_u, 0 ) )
       fg.connect( ( self.split2, 1 ),  ( self.sum_u, 1 ) )
       fg.connect(   self.sum_l,          self.sel_l,     )
       fg.connect(   self.sum_u,          self.sel_u,     )
       fg.connect(   self.sel_l,        ( self.sum,   0 ) )
       fg.connect(   self.sel_u,        ( self.sum,   1 ) )
       fg.connect(   self.sum,          ( self.sqr,   0 ) )
       fg.connect(   self.sum,          ( self.sqr,   1 ) )
       fg.connect(   self.sum,          ( self.agc,   0 ) )
       fg.connect(   self.sqr,            self.int0       )
       fg.connect(   self.int0,           self.gain       )
       fg.connect(   self.gain,           self.offs       )
       fg.connect(   self.offs,         ( self.agc,   1 ) )
gr.hier_block.__init__( self, fg, self.xlate, self.agc )

   def upper_sb( self ):
       if self.sideband != -1:
           self.sideband = -1
           self.sel_l.set_k( 0.0 )
           self.sel_u.set_k( 1.0 )
def lower_sb( self ):
       if self.sideband != 1:
           self.sideband = 1
           self.sel_l.set_k( 1.0 )
           self.sel_u.set_k( 0.0 )

   def tune( self, freq ):
       self.xlate.set_center_freq( freq )





cswiger wrote:

Hi Mike - I'm probing the ssba.py package - had to change
the freq_xlating_fir_filter from ccf to ccc since the taps
loaded from 'f' are complex.

Just trying some frequencies it appears to pass both sidebands?

Python 2.3.4 (#1, Oct 26 2004, 16:42:40)
[GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
from gnuradio import gr
import ssba
fg = gr.flow_graph()
ssb1 = ssba.ssb_demod(fg,256000,32000)
gr_fir_ccc: using SSE
gr_fir_fff: using SSE
src = gr.sig_source_c(256000,gr.GR_SIN_WAVE,-20000,1,0)
meter = gr.probe_avg_mag_sqrd_f(1,.001)
fg.connect(src,ssb1,meter)
fg.start()
meter.level()





reply via email to

[Prev in Thread] Current Thread [Next in Thread]