diff --git a/python/c4fm-demod.py b/python/c4fm-demod.py index 7e995a7..b951342 100755 --- a/python/c4fm-demod.py +++ b/python/c4fm-demod.py @@ -1,4 +1,7 @@ #!/usr/bin/env python +from gnuradio import gr, gru, blks +from gnuradio.eng_option import eng_option +from optparse import OptionParser """ simple frequency demodulator for captured P25 C4FM signals @@ -7,47 +10,46 @@ input: complex sample captured by USRP output: real baseband sample at 48 ksps """ -from gnuradio import gr, gru, blks -import math - -class my_graph(gr.flow_graph): - - def __init__(self): +class app_flow_graph(gr.flow_graph): + def __init__(self, options): gr.flow_graph.__init__(self) - ### set these manually for target sample - input_sample_rate = 500e3 # trunk control channel sample - # frequency is relative to input sample - #frequency = 87.5e3 # lower band of trunk control channel sample - frequency = 100e3 # higher band of trunk control channel sample - #input_sample_rate = 256e3 # *-256KSS.dat samples - #frequency = 0 # baseband-complex-256KSS.dat - #frequency = 30e3 # sample-complex-256KSS.dat bandwidth = 12.5e3 - ### - src = gr.file_source(gr.sizeof_gr_complex, "infile") symbol_rate = 4800 - output_samples_per_symbol = 10 - output_sample_rate = output_samples_per_symbol * symbol_rate - lcm = gru.lcm(input_sample_rate, output_sample_rate) - intrp = int(lcm // input_sample_rate) + + output_sample_rate = options.samples_per_symbol * symbol_rate + lcm = gru.lcm(options.sample_rate, output_sample_rate) + intrp = int(lcm // options.sample_rate) decim = int(lcm // output_sample_rate) + + src = gr.file_source(gr.sizeof_gr_complex, options.input_file) ddc_coeffs = \ gr.firdes.low_pass (1.0, - input_sample_rate, + options.sample_rate, bandwidth/2, bandwidth/2, gr.firdes.WIN_HANN) - ddc = gr.freq_xlating_fir_filter_ccf (1,ddc_coeffs,-frequency,input_sample_rate) + ddc = gr.freq_xlating_fir_filter_ccf (1,ddc_coeffs,-options.frequency,options.sample_rate) resampler = blks.rational_resampler_ccc(self, intrp, decim) qdemod = gr.quadrature_demod_cf(1.0) - f2c = gr.float_to_complex() - sink = gr.file_sink(gr.sizeof_float, "demod") + sink = gr.file_sink(gr.sizeof_float, options.output_file) self.connect(src,ddc,resampler,qdemod,sink) -if __name__ == '__main__': +def main(): + parser = OptionParser(option_class=eng_option) + parser.add_option("-i", "--input-file", type="string", default="in.dat", help="specify the input file") + parser.add_option("-o", "--output-file", type="string", default="demod.dat", help="specify the output file") + parser.add_option("-r", "--sample-rate", type="eng_float", default=500e3, help="sample rate of input file", metavar="Hz") + parser.add_option("-f", "--frequency", type="eng_float", default=0, help="frequency of signal to demodulate", metavar="Hz") + parser.add_option("-s", "--samples-per-symbol", type="int", default=10, help="samples per symbol in output file") + (options, args) = parser.parse_args() + + fg = app_flow_graph(options) try: - my_graph().run() + fg.run() except KeyboardInterrupt: pass + +if __name__ == "__main__": + main()