X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=gr-radio-astronomy%2Fsrc%2Fpython%2Fra_fftsink.py;h=4733027c101599751b185c48c5dae192289884b6;hb=ea29b08aeb54227e6628f655ccfdb96fe4d8c378;hp=b6a084115c81cc969327ec596a6c7e30a47f713c;hpb=09a1e803a9e6587c78d20cdf16891e5295874668;p=debian%2Fgnuradio diff --git a/gr-radio-astronomy/src/python/ra_fftsink.py b/gr-radio-astronomy/src/python/ra_fftsink.py index b6a08411..4733027c 100755 --- a/gr-radio-astronomy/src/python/ra_fftsink.py +++ b/gr-radio-astronomy/src/python/ra_fftsink.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2003,2004,2005 Free Software Foundation, Inc. +# Copyright 2003,2004,2005,2007 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,10 +21,10 @@ # from gnuradio import gr, gru, window -from gnuradio.wxgui import stdgui +from gnuradio.wxgui import stdgui2 import wx import gnuradio.wxgui.plot as plot -import Numeric +import numpy import threading import math import random @@ -32,14 +32,11 @@ import random default_ra_fftsink_size = (640,140) -def default_cfunc(db,l): - return(db) - class ra_fft_sink_base(object): def __init__(self, input_is_real=False, baseband_freq=0, y_per_div=10, sc_y_per_div=0.5, ref_level=50, sc_ref_level=20, sample_rate=1, fft_size=512, fft_rate=15, - average=False, avg_alpha=None, title='', peak_hold=False, cfunc=default_cfunc, xydfunc=None, interfunc=None): + average=False, avg_alpha=None, title='', peak_hold=False, ofunc=None, xydfunc=None): # initialize common attributes self.baseband_freq = baseband_freq @@ -54,9 +51,9 @@ class ra_fft_sink_base(object): self.fft_rate = fft_rate self.binwidth = float(sample_rate/fft_size) self.average = average - self.cfunc = cfunc + self.ofunc = ofunc self.xydfunc = xydfunc - self.interfunc = interfunc + self.ofunc = ofunc if avg_alpha is None: self.avg_alpha = 2.0 / fft_rate else: @@ -97,20 +94,24 @@ class ra_fft_sink_base(object): self.baseband_freq = baseband_freq -class ra_fft_sink_f(gr.hier_block, ra_fft_sink_base): - def __init__(self, fg, parent, baseband_freq=0, +class ra_fft_sink_f(gr.hier_block2, ra_fft_sink_base): + def __init__(self, parent, baseband_freq=0, y_per_div=10, sc_y_per_div=0.5, sc_ref_level=40, ref_level=50, sample_rate=1, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='', - size=default_ra_fftsink_size, peak_hold=False, cfunc=default_cfunc, xydfunc=None, interfunc=None): - + size=default_ra_fftsink_size, peak_hold=False, ofunc=None, + xydfunc=None): + gr.hier_block2.__init__(self, "ra_fft_sink_f", + gr.io_signature(1, 1, gr.sizeof_float), + gr.io_signature(0, 0, 0)) + ra_fft_sink_base.__init__(self, input_is_real=True, baseband_freq=baseband_freq, y_per_div=y_per_div, sc_y_per_div=sc_y_per_div, sc_ref_level=sc_ref_level, ref_level=ref_level, sample_rate=sample_rate, fft_size=fft_size, fft_rate=fft_rate, average=average, avg_alpha=avg_alpha, title=title, - peak_hold=peak_hold, cfunc=cfunc, - xydfunc=xydfunc, interfunc=interfunc) + peak_hold=peak_hold, ofunc=ofunc, + xydfunc=xydfunc) self.binwidth = float(sample_rate/2.0)/float(fft_size) s2p = gr.serial_to_parallel(gr.sizeof_float, fft_size) @@ -123,18 +124,22 @@ class ra_fft_sink_f(gr.hier_block, ra_fft_sink_base): log = gr.nlog10_ff(20, fft_size, -20*math.log10(fft_size)) sink = gr.message_sink(gr.sizeof_float * fft_size, self.msgq, True) - fg.connect (s2p, one_in_n, fft, c2mag, self.avg, log, sink) - gr.hier_block.__init__(self, fg, s2p, sink) + self.connect (self, s2p, one_in_n, fft, c2mag, self.avg, log, sink) self.win = fft_window(self, parent, size=size) self.set_average(self.average) -class ra_fft_sink_c(gr.hier_block, ra_fft_sink_base): - def __init__(self, fg, parent, baseband_freq=0, +class ra_fft_sink_c(gr.hier_block2, ra_fft_sink_base): + def __init__(self, parent, baseband_freq=0, y_per_div=10, sc_y_per_div=0.5, sc_ref_level=40, ref_level=50, sample_rate=1, fft_size=512, fft_rate=15, average=False, avg_alpha=None, title='', - size=default_ra_fftsink_size, peak_hold=False, cfunc=default_cfunc, xydfunc=None, interfunc=None): + size=default_ra_fftsink_size, peak_hold=False, ofunc=None, xydfunc=None): + + gr.hier_block2.__init__(self, "ra_fft_sink_c", + gr.io_signature(1, 1, gr.sizeof_gr_complex), + gr.io_signature(0, 0, 0)) + ra_fft_sink_base.__init__(self, input_is_real=False, baseband_freq=baseband_freq, y_per_div=y_per_div, sc_y_per_div=sc_y_per_div, @@ -143,8 +148,8 @@ class ra_fft_sink_c(gr.hier_block, ra_fft_sink_base): fft_rate=fft_rate, average=average, avg_alpha=avg_alpha, title=title, - peak_hold=peak_hold, cfunc=cfunc, - xydfunc=xydfunc, interfunc=interfunc) + peak_hold=peak_hold, ofunc=ofunc, + xydfunc=xydfunc) s2p = gr.serial_to_parallel(gr.sizeof_gr_complex, fft_size) one_in_n = gr.keep_one_in_n(gr.sizeof_gr_complex * fft_size, @@ -156,8 +161,7 @@ class ra_fft_sink_c(gr.hier_block, ra_fft_sink_base): log = gr.nlog10_ff(20, fft_size, -20*math.log10(fft_size)) sink = gr.message_sink(gr.sizeof_float * fft_size, self.msgq, True) - fg.connect(s2p, one_in_n, fft, c2mag, self.avg, log, sink) - gr.hier_block.__init__(self, fg, s2p, sink) + self.connect(self, s2p, one_in_n, fft, c2mag, self.avg, log, sink) self.win = fft_window(self, parent, size=size) self.set_average(self.average) @@ -203,7 +207,7 @@ class input_watcher (threading.Thread): start = itemsize * (nitems - 1) s = s[start:start+itemsize] - complex_data = Numeric.fromstring (s, Numeric.Float32) + complex_data = numpy.fromstring (s, numpy.float32) de = DataEvent (complex_data) wx.PostEvent (self.event_receiver, de) del de @@ -229,8 +233,8 @@ class fft_window (plot.PlotCanvas): EVT_DATA_EVENT (self, self.set_data) wx.EVT_CLOSE (self, self.on_close_window) self.Bind(wx.EVT_RIGHT_UP, self.on_right_click) - self.Bind(wx.EVT_MOTION, self.on_motion) self.Bind(wx.EVT_LEFT_UP, self.on_left_click) + self.Bind(wx.EVT_MOTION, self.on_motion) self.input_watcher = input_watcher(ra_fftsink.msgq, ra_fftsink.fft_size, self) @@ -248,14 +252,15 @@ class fft_window (plot.PlotCanvas): calc_min = min(dB) calc_max = max(dB) - - dB = self.ra_fftsink.cfunc(dB, L) + if (self.ra_fftsink.ofunc != None): + self.ra_fftsink.ofunc(evt.data,L) + if self.peak_hold: if self.peak_vals is None: self.peak_vals = dB else: - self.peak_vals = Numeric.maximum(dB, self.peak_vals) + self.peak_vals = numpy.maximum(dB, self.peak_vals) dB = self.peak_vals x = max(abs(self.ra_fftsink.sample_rate), abs(self.ra_fftsink.baseband_freq)) @@ -273,20 +278,20 @@ class fft_window (plot.PlotCanvas): units = "Hz" if self.ra_fftsink.input_is_real: # only plot 1/2 the points - x_vals = ((Numeric.arrayrange (L/2) + x_vals = ((numpy.arange (L/2) * (self.ra_fftsink.sample_rate * sf / L)) + self.ra_fftsink.baseband_freq * sf) - points = Numeric.zeros((len(x_vals), 2), Numeric.Float64) + points = numpy.zeros((len(x_vals), 2), numpy.float64) points[:,0] = x_vals points[:,1] = dB[0:L/2] else: # the "negative freqs" are in the second half of the array - x_vals = ((Numeric.arrayrange (-L/2, L/2) + x_vals = ((numpy.arange(-L/2, L/2) * (self.ra_fftsink.sample_rate * sf / L)) + self.ra_fftsink.baseband_freq * sf) - points = Numeric.zeros((len(x_vals), 2), Numeric.Float64) + points = numpy.zeros((len(x_vals), 2), numpy.float64) points[:,0] = x_vals - points[:,1] = Numeric.concatenate ((dB[L/2:], dB[0:L/2])) + points[:,1] = numpy.concatenate ((dB[L/2:], dB[0:L/2])) lines = plot.PolyLine (points, colour='BLUE') graphics = plot.PlotGraphics ([lines], @@ -295,7 +300,7 @@ class fft_window (plot.PlotCanvas): self.Draw (graphics, xAxis=None, yAxis=self.y_range) d = calc_max - calc_min - d *= 0.1 + d = d * 0.1 if self.ra_fftsink.autoscale == True: self.y_range = self._axisInterval ('min', calc_min-d, calc_max+d) else: @@ -364,12 +369,12 @@ class fft_window (plot.PlotCanvas): def on_motion(self, event): if not self.ra_fftsink.xydfunc == None: xy = self.GetXY(event) - self.ra_fftsink.xydfunc (xy) - - def on_left_click(self, event): - if not self.ra_fftsink.interfunc == None: + self.ra_fftsink.xydfunc (0,xy) + + def on_left_click(self,event): + if not self.ra_fftsink.xydfunc == None: xy = self.GetXY(event) - self.ra_fftsink.interfunc (xy[0]) + self.ra_fftsink.xydfunc (1,xy) def build_popup_menu(self): self.id_incr_ref_level = wx.NewId() @@ -451,37 +456,13 @@ def next_down(v, seq): return v -# ---------------------------------------------------------------- -# Deprecated interfaces -# ---------------------------------------------------------------- - -# returns (block, win). -# block requires a single input stream of float -# win is a subclass of wxWindow - -def make_ra_fft_sink_f(fg, parent, title, fft_size, input_rate, ymin = 0, ymax=50): - - block = ra_fft_sink_f(fg, parent, title=title, fft_size=fft_size, sample_rate=input_rate, - y_per_div=(ymax - ymin)/8, ref_level=ymax) - return (block, block.win) - -# returns (block, win). -# block requires a single input stream of gr_complex -# win is a subclass of wxWindow - -def make_ra_fft_sink_c(fg, parent, title, fft_size, input_rate, ymin=0, ymax=50): - block = ra_fft_sink_c(fg, parent, title=title, fft_size=fft_size, sample_rate=input_rate, - y_per_div=(ymax - ymin)/8, ref_level=ymax) - return (block, block.win) - - # ---------------------------------------------------------------- # Standalone test app # ---------------------------------------------------------------- -class test_app_flow_graph (stdgui.gui_flow_graph): +class test_app_flow_graph (stdgui2.std_top_block): def __init__(self, frame, panel, vbox, argv): - stdgui.gui_flow_graph.__init__ (self, frame, panel, vbox, argv) + stdgui2.std_top_block.__init__ (self, frame, panel, vbox, argv) fft_size = 256 @@ -496,7 +477,7 @@ class test_app_flow_graph (stdgui.gui_flow_graph): # suck down all the CPU available. Normally you wouldn't use these. thr1 = gr.throttle(gr.sizeof_gr_complex, input_rate) - sink1 = ra_fft_sink_c (self, panel, title="Complex Data", fft_size=fft_size, + sink1 = ra_fft_sink_c (panel, title="Complex Data", fft_size=fft_size, sample_rate=input_rate, baseband_freq=100e3, ref_level=60, y_per_div=10) vbox.Add (sink1.win, 1, wx.EXPAND) @@ -505,14 +486,14 @@ class test_app_flow_graph (stdgui.gui_flow_graph): src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 5.75e3, 1000) #src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1000) thr2 = gr.throttle(gr.sizeof_float, input_rate) - sink2 = ra_fft_sink_f (self, panel, title="Real Data", fft_size=fft_size*2, + sink2 = ra_fft_sink_f (panel, title="Real Data", fft_size=fft_size*2, sample_rate=input_rate, baseband_freq=100e3, ref_level=60, y_per_div=10) vbox.Add (sink2.win, 1, wx.EXPAND) self.connect (src2, thr2, sink2) def main (): - app = stdgui.stdapp (test_app_flow_graph, + app = stdgui2.stdapp (test_app_flow_graph, "FFT Sink Test App") app.MainLoop ()