X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=gr-wxgui%2Fsrc%2Fpython%2Ffftsink_gl.py;h=6cfaeff606b67f83ebc611a62fb82157f2c31f65;hb=a0c01f9f9ca5743189ce5c84ee3f2b1cea819335;hp=db402618e6b048928960c16b10437d5cf25102bb;hpb=36649d4e472172fe840444ac0268c7b6b4da94b4;p=debian%2Fgnuradio diff --git a/gr-wxgui/src/python/fftsink_gl.py b/gr-wxgui/src/python/fftsink_gl.py index db402618..6cfaeff6 100644 --- a/gr-wxgui/src/python/fftsink_gl.py +++ b/gr-wxgui/src/python/fftsink_gl.py @@ -1,5 +1,5 @@ # -# Copyright 2008 Free Software Foundation, Inc. +# Copyright 2008,2009,2010 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -19,6 +19,8 @@ # Boston, MA 02110-1301, USA. # +from __future__ import division + ################################################## # Imports ################################################## @@ -27,12 +29,13 @@ import common from gnuradio import gr, blks2 from pubsub import pubsub from constants import * +import math ################################################## # FFT sink block (wrapper for old wxgui) ################################################## -class _fft_sink_base(gr.hier_block2, common.prop_setter): - """! +class _fft_sink_base(gr.hier_block2, common.wxgui_hb): + """ An fft block with real/complex inputs and a gui window. """ @@ -46,15 +49,28 @@ class _fft_sink_base(gr.hier_block2, common.prop_setter): ref_level=50, sample_rate=1, fft_size=512, - fft_rate=gr.prefs().get_long('wxgui', 'fft_rate', fft_window.DEFAULT_FRAME_RATE), + fft_rate=fft_window.DEFAULT_FRAME_RATE, average=False, avg_alpha=None, title='', size=fft_window.DEFAULT_WIN_SIZE, peak_hold=False, + win=None, + use_persistence=False, + persist_alpha=None, + **kwargs #do not end with a comma ): #ensure avg alpha if avg_alpha is None: avg_alpha = 2.0/fft_rate + #ensure analog alpha + if persist_alpha is None: + actual_fft_rate=float(sample_rate/fft_size)/float(max(1,int(float((sample_rate/fft_size)/fft_rate)))) + #print "requested_fft_rate ",fft_rate + #print "actual_fft_rate ",actual_fft_rate + analog_cutoff_freq=0.5 # Hertz + #calculate alpha from wanted cutoff freq + persist_alpha = 1.0 - math.exp(-2.0*math.pi*analog_cutoff_freq/actual_fft_rate) + #init gr.hier_block2.__init__( self, @@ -63,7 +79,6 @@ class _fft_sink_base(gr.hier_block2, common.prop_setter): gr.io_signature(0, 0, 0), ) #blocks - copy = gr.kludge_copy(self._item_size) fft = self._fft_chain( sample_rate=sample_rate, fft_size=fft_size, @@ -71,11 +86,12 @@ class _fft_sink_base(gr.hier_block2, common.prop_setter): ref_scale=ref_scale, avg_alpha=avg_alpha, average=average, + win=win, ) msgq = gr.msg_queue(2) sink = gr.message_sink(gr.sizeof_float*fft_size, msgq, True) - #connect - self.connect(self, copy, fft, sink) + + #controller self.controller = pubsub() self.controller.subscribe(AVERAGE_KEY, fft.set_average) @@ -85,9 +101,7 @@ class _fft_sink_base(gr.hier_block2, common.prop_setter): self.controller.subscribe(SAMPLE_RATE_KEY, fft.set_sample_rate) self.controller.publish(SAMPLE_RATE_KEY, fft.sample_rate) #start input watcher - def setter(p, k, x): # lambdas can't have assignments :( - p[k] = x - common.input_watcher(msgq, lambda x: setter(self.controller, MSG_KEY, x)) + common.input_watcher(msgq, self.controller, MSG_KEY) #create window self.win = fft_window.fft_window( parent=parent, @@ -105,13 +119,14 @@ class _fft_sink_base(gr.hier_block2, common.prop_setter): avg_alpha_key=AVG_ALPHA_KEY, peak_hold=peak_hold, msg_key=MSG_KEY, + use_persistence=use_persistence, + persist_alpha=persist_alpha, ) - #register callbacks from window for external use - for attr in filter(lambda a: a.startswith('set_'), dir(self.win)): - setattr(self, attr, getattr(self.win, attr)) - self._register_set_prop(self.controller, SAMPLE_RATE_KEY) - self._register_set_prop(self.controller, AVERAGE_KEY) - self._register_set_prop(self.controller, AVG_ALPHA_KEY) + common.register_access_methods(self, self.win) + setattr(self.win, 'set_baseband_freq', getattr(self, 'set_baseband_freq')) #BACKWARDS + setattr(self.win, 'set_peak_hold', getattr(self, 'set_peak_hold')) #BACKWARDS + #connect + self.wxgui_connect(self, fft, sink) class fft_sink_f(_fft_sink_base): _fft_chain = blks2.logpwrfft_f @@ -137,11 +152,14 @@ class test_app_block (stdgui2.std_top_block): fft_size = 256 # build our flow graph - input_rate = 20.48e3 + input_rate = 2048.0e3 + + #Generate some noise + noise =gr.noise_source_c(gr.GR_UNIFORM, 1.0/10) # Generate a complex sinusoid #src1 = gr.sig_source_c (input_rate, gr.GR_SIN_WAVE, 2e3, 1) - src1 = gr.sig_source_c (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1) + src1 = gr.sig_source_c (input_rate, gr.GR_CONST_WAVE, 57.50e3, 1) # We add these throttle blocks so that this demo doesn't # suck down all the CPU available. Normally you wouldn't use these. @@ -152,17 +170,25 @@ class test_app_block (stdgui2.std_top_block): ref_level=0, y_per_div=20, y_divs=10) vbox.Add (sink1.win, 1, wx.EXPAND) - self.connect(src1, thr1, sink1) + combine1=gr.add_cc() + self.connect(src1, (combine1,0)) + self.connect(noise,(combine1,1)) + self.connect(combine1,thr1, sink1) #src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 2e3, 1) - src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1) + src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 57.50e3, 1) thr2 = gr.throttle(gr.sizeof_float, input_rate) sink2 = fft_sink_f (panel, title="Real Data", fft_size=fft_size*2, sample_rate=input_rate, baseband_freq=100e3, ref_level=0, y_per_div=20, y_divs=10) vbox.Add (sink2.win, 1, wx.EXPAND) - self.connect(src2, thr2, sink2) + combine2=gr.add_ff() + c2f2=gr.complex_to_float() + + self.connect(src2, (combine2,0)) + self.connect(noise,c2f2,(combine2,1)) + self.connect(combine2, thr2,sink2) def main (): app = stdgui2.stdapp (test_app_block, "FFT Sink Test App")