discuss-gnuradio
[Top][All Lists]
Advanced

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

Re: [Discuss-gnuradio] Weaver SSB (was: gr.firdes_hilbert () usage)


From: cswiger
Subject: Re: [Discuss-gnuradio] Weaver SSB (was: gr.firdes_hilbert () usage)
Date: Fri, 26 Nov 2004 16:38:22 -0500 (EST)

Ok gang - this might be horribly inefficient but hey, it seems to work.
Working from figure 8 in:
<www.semiconductors.philips.com/acrobat_download/applicationnotes/AN1981.pdf>
Their LO frequencies were confusing at first (7.2?) - but their quadrature
generators are divide-by-four. (1.8Khz)

-----------------------------------------

#!/usr/bin/env python
#
#                    Weaver SSB demodulation
#
#
#                 rf_loi                   af_loi
#                   |                        |
#            |-----(X)---[lpf1i]--[lpf2i]---(X)---|
#            |   rf_mixi                  af_mixi |
#            |                                    |
# signal ----|                                   (+)----- ssb_demod
#            |                                    |
#            |   rf_mixq                  af_mixq |
#            |-----(X)---[lpf1q]--[lpf2q]---(X)---|
#                   |                        |
#                 rf_loq                   af_loq
#

from gnuradio import gr
import sys

def build_graph ():

    rf_LO = 501.8e3
    af_LO = 1.8e3

    signal = 501.5e3  # passband is 500-503.6 Khz USB

    rf_sample_rate = 8e6
    af_sample_rate = 32e3

    fir_decimation = (long)(rf_sample_rate / af_sample_rate)

    fg = gr.flow_graph ()

    src = gr.sig_source_f (rf_sample_rate,gr.GR_SIN_WAVE,signal,1.0,0)

    rf_loi = gr.sig_source_f (rf_sample_rate,gr.GR_COS_WAVE,rf_LO,1.0,0)
    rf_loq = gr.sig_source_f (rf_sample_rate,gr.GR_SIN_WAVE,rf_LO,1.0,0)
    af_loi = gr.sig_source_f (af_sample_rate,gr.GR_COS_WAVE,af_LO,1.0,0)
    af_loq = gr.sig_source_f (af_sample_rate,gr.GR_SIN_WAVE,af_LO,1.0,0)

    rf_mixi = gr.multiply_ff ()
    rf_mixq = gr.multiply_ff ()

    lpf1_taps = gr.firdes.low_pass ( \
           1.0, rf_sample_rate, 160e3, 100e3, gr.firdes.WIN_HAMMING)
    lpf1i = gr.fir_filter_fff (fir_decimation, lpf1_taps)
    lpf1q = gr.fir_filter_fff (fir_decimation, lpf1_taps)
    lpf2_taps = gr.firdes.low_pass ( \
           1.0, af_sample_rate, 1.8e3, 100, gr.firdes.WIN_HAMMING)
    lpf2i = gr.fir_filter_fff (1, lpf2_taps)
    lpf2q = gr.fir_filter_fff (1, lpf2_taps)

    af_mixi = gr.multiply_ff ()
    af_mixq = gr.multiply_ff ()

    sum = gr.add_ff ()

    out = gr.file_sink (gr.sizeof_float, "ssb_demod")

    fg.connect (src, (rf_mixi, 0))
    fg.connect (rf_loi, (rf_mixi, 1))
    fg.connect (rf_mixi, lpf1i)
    fg.connect (lpf1i, lpf2i)
    fg.connect (lpf2i, (af_mixi, 0))
    fg.connect (af_loi, (af_mixi, 1))
    fg.connect (af_mixi, (sum, 0))

    fg.connect (src, (rf_mixq, 0))
    fg.connect (rf_loq, (rf_mixq, 1))
    fg.connect (rf_mixq, lpf1q)
    fg.connect (lpf1q, lpf2q)
    fg.connect (lpf2q, (af_mixq, 0))
    fg.connect (af_loq, (af_mixq, 1))
    fg.connect (af_mixq, (sum, 1))

    fg.connect (sum, out)

    return fg

def main ():

    fg = build_graph ()


    # fg.run ()

    fg.start ()
    raw_input ('Press Enter to quit: ')
    fg.stop ()

if __name__ == '__main__':
    main ()






reply via email to

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