diff options
author | Paul Garver <garverp@gatech.edu> | 2014-12-02 10:30:21 -0500 |
---|---|---|
committer | Paul Garver <garverp@gatech.edu> | 2014-12-02 10:30:21 -0500 |
commit | 4ec1ab5487a7555c534d7c9768b853995f0ea8f8 (patch) | |
tree | d13f62acf7ed2ccc2ba4d7288044cb82f82e02a7 | |
parent | b2e6c0f247784ba4119cd6aa32998e7fcfa43f77 (diff) |
gr-qtgui: Adding gr_spectrogram_plot script. Reads sample rate and data type from header and launches appropriate plotter
-rw-r--r-- | gr-qtgui/apps/CMakeLists.txt | 1 | ||||
-rwxr-xr-x | gr-qtgui/apps/gr_spectrogram_plot | 190 |
2 files changed, 191 insertions, 0 deletions
diff --git a/gr-qtgui/apps/CMakeLists.txt b/gr-qtgui/apps/CMakeLists.txt index 05accc64d2..3c64cb6e0a 100644 --- a/gr-qtgui/apps/CMakeLists.txt +++ b/gr-qtgui/apps/CMakeLists.txt @@ -55,6 +55,7 @@ GR_PYTHON_INSTALL( gr_spectrogram_plot_i gr_spectrogram_plot_s gr_spectrogram_plot_b + gr_spectrogram_plot gr_constellation_plot DESTINATION ${GR_RUNTIME_DIR} COMPONENT "qtgui_python" diff --git a/gr-qtgui/apps/gr_spectrogram_plot b/gr-qtgui/apps/gr_spectrogram_plot new file mode 100755 index 0000000000..73ccd2f6b9 --- /dev/null +++ b/gr-qtgui/apps/gr_spectrogram_plot @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# +# Copyright 2012,2013 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr +from gnuradio import blocks +from gnuradio import filter +import pmt +from gnuradio.blocks import parse_file_metadata +import scipy +import sys +import os + +try: + import gnuradio.qtgui.plot_spectrogram_base as plot_base +except ImportError: + import plot_spectrogram_base as plot_base + +try: + from gnuradio import qtgui + from PyQt4 import QtGui, QtCore + import sip +except ImportError: + print "Error: Program requires PyQt4 and gr-qtgui." + sys.exit(1) + +class spectrogram_plot_c(plot_base.plot_base): + def __init__(self, filelist, fc, samp_rate, psdsize, start, + nsamples, max_nsamples, avg=1.0): + plot_base.plot_base.__init__(self, filelist, fc, samp_rate, + psdsize, start, nsamples, + max_nsamples, avg) + self.read_samples = plot_base.read_samples_c + self.dsize = gr.sizeof_gr_complex + self.src_type = blocks.vector_source_c + self.gui_snk = qtgui.waterfall_sink_c(self._psd_size, + filter.firdes.WIN_BLACKMAN_hARRIS,self._center_freq, + self._samp_rate,"GNU Radio Spectrogram Plot (CPX Float)", + self._nsigs) + self.setup() + +class spectrogram_plot_f(plot_base.plot_base): + def __init__(self, filelist, fc, samp_rate, psdsize, start, + nsamples, max_nsamples, avg=1.0): + plot_base.plot_base.__init__(self, filelist, fc, samp_rate, + psdsize, start, nsamples, + max_nsamples, avg) + self.read_samples = plot_base.read_samples_f + self.dsize = gr.sizeof_float + self.src_type = blocks.vector_source_f + self.gui_snk = qtgui.waterfall_sink_f(self._psd_size, + filter.firdes.WIN_BLACKMAN_hARRIS,self._center_freq, + self._samp_rate, + "GNU Radio Spectrogram Plot (float)", + self._nsigs) + self.setup() + +class spectrogram_plot_b(plot_base.plot_base): + def __init__(self, filelist, fc, samp_rate, psdsize, start, + nsamples, max_nsamples, avg=1.0): + plot_base.plot_base.__init__(self, filelist, fc, samp_rate, + psdsize, start, nsamples, + max_nsamples, avg) + self.read_samples = plot_base.read_samples_b + self.dsize = gr.sizeof_float + self.src_type = plot_base.source_chars_to_float + self.gui_snk = qtgui.waterfall_sink_f(self._psd_size, + filter.firdes.WIN_BLACKMAN_hARRIS,self._center_freq, + self._samp_rate, "GNU Radio Spectrogram Plot (bin)", + self._nsigs) + self.setup() + +class spectrogram_plot_i(plot_base.plot_base): + def __init__(self, filelist, fc, samp_rate, psdsize, start, + nsamples, max_nsamples, avg=1.0): + plot_base.plot_base.__init__(self, filelist, fc, samp_rate, + psdsize, start, nsamples, + max_nsamples, avg) + self.dsize = gr.sizeof_float + self.src_type = plot_base.source_ints_to_float + self.gui_snk = qtgui.waterfall_sink_f(self._psd_size, + filter.firdes.WIN_BLACKMAN_hARRIS, + self._center_freq, self._samp_rate, + "GNU Radio Spectrogram Plot (int)", + self._nsigs) + self.setup() + +def read_header(filelist): + filename = filelist[0] + '.hdr' + try: + handle = open(filename,"rb") + except IOError: + return + hdr_start = handle.tell() + header_str = handle.read(parse_file_metadata.HEADER_LENGTH) + if( len(header_str) == 0 ): + return + # String to PMT Conversion + try: + header = pmt.deserialize_str(header_str) + except RuntimeError: + sys.stderr.write("Can't deserialize header: invalid/corrupt data\n") + sys.exit(1) + info = parse_file_metadata.parse_header(header,False) + return info + +def main(): + description = 'Plots the spectrogram (waterfall) of a file with detached header.' + description += ' Assumes header is <input_filename>.hdr' + (options, args) = plot_base.setup_options(description) + filelist = list(args) + # Attempt to read the header information + info = read_header(filelist) + # If no header, quit + if not info: + sys.stderr.write('Header not found\n') + sys.exit(1) + + max_nsamples = plot_base.find_max_nsamples(filelist) + srate = info["rx_rate"] + + # Dispatch the proper function + # Complex Types + if(info["cplx"] == True): + if( info["type"] == "float" ): + tb = spectrogram_plot_c(filelist, + options.center_frequency,srate, + options.psd_size, + options.start, options.nsamples, max_nsamples, + options.average); + else: + sys.stderr.write("Complex File Type " + info["type"]+ " not supported.\n") + # Real Types + else: + if( info["type"] == "bytes" ): + tb = spectrogram_plot_b(filelist, + options.center_frequency,srate, + options.psd_size, + options.start, options.nsamples, max_nsamples, + options.average); + elif( info["type"] == "int" ): + tb = spectrogram_plot_i(filelist, + options.center_frequency,srate, + options.psd_size, + options.start, options.nsamples, max_nsamples, + options.average); + elif( info["type"] == "float" ): + tb = spectrogram_plot_f(filelist, + options.center_frequency,srate, + options.psd_size, + options.start, options.nsamples, max_nsamples, + options.average); + elif( info["type"] == "short" ): + tb = spectrogram_plot_s(filelist, + options.center_frequency,srate, + options.psd_size, + options.start, options.nsamples, max_nsamples, + options.average); + else: + sys.stderr.write("Real File Type " + info["type"] + " not supported\n") + main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Spectrogram Plot') + main_box.show() + + tb.run() + tb.qapp.exec_() + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass + |