#!/usr/bin/python from gnuradio import gr, gru, eng_notation, optfir from gnuradio import audio from gnuradio import usrp from gnuradio import blks2 from gnuradio.eng_option import eng_option from optparse import OptionParser from usrpm import usrp_dbid import sys import math from time import sleep import datetime class wfm_rx_block (gr.top_block): def __init__(self): gr.top_block.__init__(self) if len(args) != 0: parser.print_help() sys.exit(1) if abs(options.f1) < 1e6: options.f1 *= 1e6 if abs(options.f2) < 1e6: options.f2 *= 1e6 f = (options.f1, options.f2) db_gain = (options.g1, options.g2) base_MHz = 50.0 f_offtune = (-options.op*base_MHz*8.0, -options.op*base_MHz*3.0) print "Frequency offset: %d ppm" % options.op self.vol = .01 self.state = "FREQ" # build graph self.u = usrp.source_c(0, nchan=2) # usrp is data source adc_rate = self.u.adc_rate() # 64 MS/s usrp_decim = 200 self.u.set_decim_rate(usrp_decim) usrp_rate = adc_rate / usrp_decim # 320 kS/s chanfilt_decim = 10 demod_rate = usrp_rate / chanfilt_decim # 32 kHz # we're using both daughterboard slots self.subdev0 = self.u.db[0][0] self.subdev1 = self.u.db[1][0] print "Using TX d'board %s" % (self.subdev0.side_and_name(),) print "Using TX d'board %s" % (self.subdev1.side_and_name(),) #set MUX # "Q=0" config ### self.u.set_mux(gru.hexint(0xf0f0f2f0)) # "Using Q" config self.u.set_mux(gru.hexint(0x00002201)) # deinterleave two channels from FPGA di = gr.deinterleave(gr.sizeof_gr_complex) # wire up the head of the chain self.connect(self.u, di) # taps for channel filter chan_filt_coeffs = optfir.low_pass (1, # gain usrp_rate, # sampling rate 14e3, # passband cutoff 24e3, # stopband cutoff 0.1, # passband ripple 60) # stopband attenuation print "LPF coef len=", len(chan_filt_coeffs) ### Set frequency for channel 0 (400MHz) ok, baseband_freq = self.subdev0.set_freq(f[0]-10.e6) dxc_freq, inverted = usrp.calc_dxc_freq(f[0], baseband_freq, self.u.converter_rate()) self.u.set_rx_freq(self.subdev0._which, dxc_freq) residual_freq = dxc_freq - self.u.rx_freq(self.subdev0._which) print "FLEX 400" print "Target Freq =", f[0] print "Baseband Freq = ", baseband_freq print "Converter Freq = ", self.u.converter_rate() print "DDC Freq = ", dxc_freq print "Residual Freq =", residual_freq print "inverted = ", inverted print "OK? ", ok ### Set frequency for channel 1 (150MHz) r = self.u.tune(self.subdev1._which, self.subdev1, f[1]) if r: print "=== Basic RX side ===" print " Target Freq =", f[1] print " r.baseband_freq =", eng_notation.num_to_str(r.baseband_freq) print " r.dxc_freq =", eng_notation.num_to_str(r.dxc_freq) print " r.residual_freq =", eng_notation.num_to_str(r.residual_freq) print " r.inverted =", r.inverted print " OK" else: print " Failed!" # set Gain for both channels print self.u.db[0][0].set_gain(db_gain[0]) print self.subdev1.set_gain(db_gain[1]) # set graph for channel 0 (400MHz) ### chan_filt = gr.fir_filter_ccf (chanfilt_decim, chan_filt_coeffs) chan_filt = gr.freq_xlating_fir_filter_ccf (chanfilt_decim, chan_filt_coeffs, f_offtune[0], usrp_rate) dst = gr.file_sink(gr.sizeof_gr_complex, "./%s_data400.dat" % options.file) self.connect((di, 0), chan_filt, dst) # set graph for channel 1 (150MHz) ### chan_filt = gr.fir_filter_ccf (chanfilt_decim, chan_filt_coeffs) chan_filt = gr.freq_xlating_fir_filter_ccf (chanfilt_decim, chan_filt_coeffs, f_offtune[1], usrp_rate) dst = gr.file_sink(gr.sizeof_gr_complex, "./%s_data150.dat" % options.file) self.connect((di, 1), chan_filt, dst) if __name__ == '__main__': parser=OptionParser(option_class=eng_option) parser.add_option("", "--f1", type="eng_float", default=400.000e6, help="set 1st station frequency to FREQ", metavar="FREQ") parser.add_option("", "--f2", type="eng_float", default=150.000e6, help="set 2nd station freq to FREQ", metavar="FREQ") parser.add_option("", "--g1", type="eng_float", default=45, help="set 1st gain in dB (default is 55dB)") parser.add_option("", "--g2", type="eng_float", default=17, help="set 2nd gain in dB (default is 20dB)") parser.add_option("", "--op", type="eng_float", default=80, help="offset frequency in ppm (default is +80ppm)") parser.add_option("", "--file", type="string", default="", help="output filename") parser.add_option("", "--Y", type="int", default=2007, help="starttime(year)") parser.add_option("", "--M", type="int", default=6, help="starttime(month)") parser.add_option("", "--D", type="int", default=25, help="starttime(day)") parser.add_option("", "--h", type="int", default=12, help="starttime(hour)") parser.add_option("", "--m", type="int", default=0, help="starttime(minute)") parser.add_option("", "--s", type="int", default=0, help="starttime(second)") parser.add_option("", "--d", type="int", default=10, help="duration(seconds)") (options, args) = parser.parse_args() fg = wfm_rx_block() start = datetime.datetime(options.Y, options.M, options.D, options.h, options.m, options.s) duration = datetime.timedelta(seconds = options.d) end = start + duration print end now = datetime.datetime.utcnow() timed = start - now while (timed.seconds > 1) & (timed.days != -1): now = datetime.datetime.utcnow() timed = start - now print timed.seconds, sleep(1) fg.start () # fork thread(s) and return now = datetime.datetime.utcnow() timed = end - now while (timed.seconds > 1) & (timed.days != -1): now = datetime.datetime.utcnow() timed = end - now ### print timed.seconds sleep(1) ### raw_input ('Press Enter to quit: ') sleep(1) fg.stop () # stop thread(s) and exit the program