#!/usr/bin/env python # # Weaver SSB demodulation # # # af_loi # | # --[lpf2i]---(X)---| # | af_mixi | # | | # signal --[freq xlating]--[split] (+)----- ssb_demod # [fir filter ] | | + USB # | af_mixq | - LSB # --[lpf2q]---(X)---| # | # af_loq # # # Based on code from: # # http://webpages.charter.net/cswiger/weaver.html # from gnuradio import gr from gnuradio import audio import sys def build_graph (input_filename, tune_freq, bfo_freq, side_band): rf_LO = tune_freq + bfo_freq af_LO = bfo_freq if side_band == 'L' or side_band == 'l': rf_LO = tune_freq - bfo_freq else: rf_LO = tune_freq + bfo_freq af_LO = bfo_freq rf_sample_rate = 256e3 af_sample_rate = 32e3 fir_decimation = (long)( rf_sample_rate / af_sample_rate ) fg = gr.flow_graph () src = gr.file_source (gr.sizeof_gr_complex, input_filename) xlate_taps = gr.firdes.low_pass ( 1.0, rf_sample_rate, 20e3, 10e3, gr.firdes.WIN_HAMMING ) xlate = gr.freq_xlating_fir_filter_ccf ( fir_decimation, xlate_taps, rf_LO, rf_sample_rate ) split = gr.complex_to_float () af_loi = gr.sig_source_f (af_sample_rate,gr.GR_COS_WAVE,af_LO,1,0) af_loq = gr.sig_source_f (af_sample_rate,gr.GR_SIN_WAVE,af_LO,1,0) lpf2_taps = gr.firdes.low_pass ( 1.0, af_sample_rate, 1.8e3, 600, 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 () if side_band == 'L' or side_band == 'l': sum = gr.sub_ff () else: sum = gr.add_ff () scale = gr.multiply_const_ff(.02) out = audio.sink (long(af_sample_rate)) fg.connect (src, xlate) fg.connect (xlate, split) fg.connect ((split, 0), lpf2i) fg.connect (lpf2i, (af_mixi, 0)) fg.connect (af_loi, (af_mixi, 1)) fg.connect (af_mixi, (sum, 0)) fg.connect ((split, 1), lpf2q) fg.connect (lpf2q, (af_mixq, 0)) fg.connect (af_loq, (af_mixq, 1)) fg.connect (af_mixq, (sum, 1)) fg.connect (sum, scale) fg.connect (scale, out) return fg def main (args): if len(args) != 4: sys.stderr.write ('usage: ssb_rcv_file filename freq(Hz) bfo(Hz) sideband{U,L}\n') sys.exit (-1) fg = build_graph (args[0], float(args[1]), float(args[2]), args[3][0]) fg.start () raw_input ('Press Enter to quit: ') fg.stop () if __name__ == '__main__': main (sys.argv[1:])