| 1 | #!/usr/bin/env python |
|---|
| 2 | |
|---|
| 3 | """ |
|---|
| 4 | Read samples from the USRP and write to file formatted as binary |
|---|
| 5 | single-precision complex values. |
|---|
| 6 | |
|---|
| 7 | """ |
|---|
| 8 | |
|---|
| 9 | from gnuradio import gr, eng_notation |
|---|
| 10 | from gnuradio import usrp |
|---|
| 11 | from gnuradio.eng_option import eng_option |
|---|
| 12 | from optparse import OptionParser |
|---|
| 13 | import sys |
|---|
| 14 | |
|---|
| 15 | class my_graph(gr.flow_graph): |
|---|
| 16 | |
|---|
| 17 | def __init__(self): |
|---|
| 18 | gr.flow_graph.__init__(self) |
|---|
| 19 | |
|---|
| 20 | usage="%prog: [options] output_filename" |
|---|
| 21 | parser = OptionParser(option_class=eng_option, usage=usage) |
|---|
| 22 | parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=(0, 0), |
|---|
| 23 | help="select USRP Rx side A or B (default=A)") |
|---|
| 24 | parser.add_option("-u", "--usrp", type="int", default=0, |
|---|
| 25 | help="set the usrp board to receive signal [default=%default]") |
|---|
| 26 | parser.add_option("-d", "--decim", type="int", default=16, |
|---|
| 27 | help="set fgpa decimation rate to DECIM [default=%default]") |
|---|
| 28 | parser.add_option("-f", "--freq", type="eng_float", default=None, |
|---|
| 29 | help="set frequency to FREQ", metavar="FREQ") |
|---|
| 30 | parser.add_option("-g", "--gain", type="eng_float", default=None, |
|---|
| 31 | help="set gain in dB (default is midpoint)") |
|---|
| 32 | parser.add_option("-N", "--nsamples", type="eng_float", default=None, |
|---|
| 33 | help="number of samples to collect [default=+inf]") |
|---|
| 34 | (options, args) = parser.parse_args () |
|---|
| 35 | if len(args) != 1: |
|---|
| 36 | parser.print_help() |
|---|
| 37 | raise SystemExit, 1 |
|---|
| 38 | filename = args[0] |
|---|
| 39 | |
|---|
| 40 | if options.freq is None: |
|---|
| 41 | parser.print_help() |
|---|
| 42 | sys.stderr.write('You must specify the frequency with -f FREQ\n'); |
|---|
| 43 | raise SystemExit, 1 |
|---|
| 44 | |
|---|
| 45 | # build the graph |
|---|
| 46 | self.u = usrp.source_c(which=options.usrp,decim_rate=options.decim) |
|---|
| 47 | self.dst = gr.file_sink(gr.sizeof_gr_complex, filename) |
|---|
| 48 | if options.nsamples is None: |
|---|
| 49 | self.connect(self.u, self.dst) |
|---|
| 50 | else: |
|---|
| 51 | self.head = gr.head(gr.sizeof_gr_complex, int(options.nsamples)) |
|---|
| 52 | self.connect(self.u, self.head, self.dst) |
|---|
| 53 | |
|---|
| 54 | if options.rx_subdev_spec is None: |
|---|
| 55 | options.rx_subdev_spec = usrp.pick_rx_subdevice(self.u) |
|---|
| 56 | m = usrp.determine_rx_mux_value(self.u, options.rx_subdev_spec) |
|---|
| 57 | print "mux = %#04x" % (m,) |
|---|
| 58 | self.u.set_mux(usrp.determine_rx_mux_value(self.u, options.rx_subdev_spec)) |
|---|
| 59 | #self.u.set_mux(0xf0) |
|---|
| 60 | #self.u.set_pga(options.usrp,10) |
|---|
| 61 | |
|---|
| 62 | # determine the daughterboard subdevice we're using |
|---|
| 63 | self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec) |
|---|
| 64 | print "subdev", options.rx_subdev_spec |
|---|
| 65 | print "Using RX d'board %s" % (self.subdev.side_and_name(),) |
|---|
| 66 | input_rate = self.u.adc_freq() / self.u.decim_rate() |
|---|
| 67 | print "USB sample rate %s" % (eng_notation.num_to_str(input_rate)) |
|---|
| 68 | |
|---|
| 69 | if options.gain is None: |
|---|
| 70 | # if no gain was specified, use the mid-point in dB |
|---|
| 71 | g = self.subdev.gain_range() |
|---|
| 72 | print g[0]," ",g[1], " ",g[2]," ",float(g[0]+g[1])/2 |
|---|
| 73 | options.gain = float(g[0]+g[1])/2 |
|---|
| 74 | self.subdev.set_gain(options.gain) |
|---|
| 75 | print "gain is:",options.gain |
|---|
| 76 | |
|---|
| 77 | r = self.u.tune(0, self.subdev, options.freq) |
|---|
| 78 | if not r: |
|---|
| 79 | sys.stderr.write('Failed to set frequency\n') |
|---|
| 80 | raise SystemExit, 1 |
|---|
| 81 | |
|---|
| 82 | |
|---|
| 83 | if __name__ == '__main__': |
|---|
| 84 | try: |
|---|
| 85 | my_graph().run() |
|---|
| 86 | except KeyboardInterrupt: |
|---|
| 87 | pass |
|---|