[Top][All Lists]
[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()
- [Discuss-gnuradio] Re: ssb demod,
mike revnell <=