From 230e062e51d43f389520207cf147838c666a1f21 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 28 Oct 2009 16:17:24 -0700 Subject: [PATCH] Added window option to wxgui fft and waterfall sink. Added rectangular window function to window.py. Average stays hidden in waterfall, fft, and numbersink wrappers (only avg_alpha shows/hides). Fixed options in waterfall wrapper to model after fft and numbersink average params. --- .../python/gnuradio/blks2impl/logpwrfft.py | 6 +- gnuradio-core/src/python/gnuradio/window.py | 1 + gr-wxgui/src/python/fftsink_gl.py | 3 + gr-wxgui/src/python/fftsink_nongl.py | 4 +- gr-wxgui/src/python/waterfallsink_gl.py | 2 + grc/blocks/wxgui_fftsink2.xml | 37 +++++++++++- grc/blocks/wxgui_numbersink2.xml | 2 +- grc/blocks/wxgui_waterfallsink2.xml | 57 +++++++++++++++---- 8 files changed, 95 insertions(+), 17 deletions(-) diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py b/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py index 7ef40be4..200c4cfb 100644 --- a/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py +++ b/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py @@ -28,7 +28,7 @@ class _logpwrfft_base(gr.hier_block2): Create a log10(abs(fft)) stream chain, with real or complex input. """ - def __init__(self, sample_rate, fft_size, ref_scale, frame_rate, avg_alpha, average): + def __init__(self, sample_rate, fft_size, ref_scale, frame_rate, avg_alpha, average, win=None): """ Create an log10(abs(fft)) stream chain. Provide access to the setting the filter and sample rate. @@ -38,6 +38,7 @@ class _logpwrfft_base(gr.hier_block2): @param frame_rate Output frame rate @param avg_alpha FFT averaging (over time) constant [0.0-1.0] @param average Whether to average [True, False] + @param win the window taps generation function """ gr.hier_block2.__init__(self, self._name, gr.io_signature(1, 1, self._item_size), # Input signature @@ -48,7 +49,8 @@ class _logpwrfft_base(gr.hier_block2): vec_rate=frame_rate, vec_len=fft_size) - fft_window = window.blackmanharris(fft_size) + if win is None: win = window.blackmanharris + fft_window = win(fft_size) fft = self._fft_block[0](fft_size, True, fft_window) window_power = sum(map(lambda x: x*x, fft_window)) diff --git a/gnuradio-core/src/python/gnuradio/window.py b/gnuradio-core/src/python/gnuradio/window.py index f8983137..7f6d62b7 100644 --- a/gnuradio-core/src/python/gnuradio/window.py +++ b/gnuradio-core/src/python/gnuradio/window.py @@ -177,3 +177,4 @@ blackmanharris = coswindow((0.35875,0.48829,0.14128,0.01168)) nuttall = coswindow((0.3635819,0.4891775,0.1365995,0.0106411)) # Wikipedia calls this Blackman-Nuttall nuttall_cfd = coswindow((0.355768,0.487396,0.144232,0.012604)) # Wikipedia calls this Nuttall, continuous first deriv flattop = coswindow((1.0,1.93,1.29,0.388,0.032)) # Flat top window, coeffs from Wikipedia +rectangular = lambda fft_size: [1]*fft_size diff --git a/gr-wxgui/src/python/fftsink_gl.py b/gr-wxgui/src/python/fftsink_gl.py index 9d683d69..9b2f9a48 100644 --- a/gr-wxgui/src/python/fftsink_gl.py +++ b/gr-wxgui/src/python/fftsink_gl.py @@ -52,6 +52,8 @@ class _fft_sink_base(gr.hier_block2, common.wxgui_hb): title='', size=fft_window.DEFAULT_WIN_SIZE, peak_hold=False, + win=None, + **kwargs #do not end with a comma ): #ensure avg alpha if avg_alpha is None: avg_alpha = 2.0/fft_rate @@ -70,6 +72,7 @@ class _fft_sink_base(gr.hier_block2, common.wxgui_hb): 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) diff --git a/gr-wxgui/src/python/fftsink_nongl.py b/gr-wxgui/src/python/fftsink_nongl.py index ca5e91fd..b3a48a71 100644 --- a/gr-wxgui/src/python/fftsink_nongl.py +++ b/gr-wxgui/src/python/fftsink_nongl.py @@ -93,7 +93,7 @@ class fft_sink_f(gr.hier_block2, fft_sink_base): def __init__(self, parent, baseband_freq=0, ref_scale=2.0, y_per_div=10, y_divs=8, ref_level=50, sample_rate=1, fft_size=512, fft_rate=default_fft_rate, average=False, avg_alpha=None, - title='', size=default_fftsink_size, peak_hold=False): + title='', size=default_fftsink_size, peak_hold=False, **kwargs): gr.hier_block2.__init__(self, "fft_sink_f", gr.io_signature(1, 1, gr.sizeof_float), @@ -136,7 +136,7 @@ class fft_sink_c(gr.hier_block2, fft_sink_base): def __init__(self, parent, baseband_freq=0, ref_scale=2.0, y_per_div=10, y_divs=8, ref_level=50, sample_rate=1, fft_size=512, fft_rate=default_fft_rate, average=False, avg_alpha=None, - title='', size=default_fftsink_size, peak_hold=False): + title='', size=default_fftsink_size, peak_hold=False, **kwargs): gr.hier_block2.__init__(self, "fft_sink_c", gr.io_signature(1, 1, gr.sizeof_gr_complex), diff --git a/gr-wxgui/src/python/waterfallsink_gl.py b/gr-wxgui/src/python/waterfallsink_gl.py index 37844399..c6b0df65 100644 --- a/gr-wxgui/src/python/waterfallsink_gl.py +++ b/gr-wxgui/src/python/waterfallsink_gl.py @@ -51,6 +51,7 @@ class _waterfall_sink_base(gr.hier_block2, common.wxgui_hb): ref_scale=2.0, dynamic_range=80, num_lines=256, + win=None, **kwargs #do not end with a comma ): #ensure avg alpha @@ -70,6 +71,7 @@ class _waterfall_sink_base(gr.hier_block2, common.wxgui_hb): 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) diff --git a/grc/blocks/wxgui_fftsink2.xml b/grc/blocks/wxgui_fftsink2.xml index 42bca5cc..8df8f90d 100644 --- a/grc/blocks/wxgui_fftsink2.xml +++ b/grc/blocks/wxgui_fftsink2.xml @@ -7,6 +7,7 @@ FFT Sink wxgui_fftsink2 + from gnuradio import window from gnuradio.wxgui import fftsink2 #set $parent = $notebook() and 'self.%s.GetPage(%s)'%$notebook() or 'self' fftsink2.$(type.fcn)( @@ -23,6 +24,9 @@ fftsink2.$(type.fcn)( avg_alpha=#if $avg_alpha() then $avg_alpha else 'None'#, title=$title, peak_hold=$peak_hold, +#if $win() + win=$win, +#end if #if $win_size() size=$win_size, #end if @@ -144,7 +148,7 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos())))) average False enum - #if $average() == 'True' then 'none' else 'part'# + part + + + + + + Window Size win_size diff --git a/grc/blocks/wxgui_numbersink2.xml b/grc/blocks/wxgui_numbersink2.xml index 5289db8a..ad93dec0 100644 --- a/grc/blocks/wxgui_numbersink2.xml +++ b/grc/blocks/wxgui_numbersink2.xml @@ -123,7 +123,7 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos())))) average False enum - #if $average() == 'True' then 'none' else 'part'# + part