Added window option to wxgui fft and waterfall sink.
authorJosh Blum <josh@joshknows.com>
Wed, 28 Oct 2009 23:17:24 +0000 (16:17 -0700)
committerJosh Blum <josh@joshknows.com>
Wed, 28 Oct 2009 23:17:24 +0000 (16:17 -0700)
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.

gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py
gnuradio-core/src/python/gnuradio/window.py
gr-wxgui/src/python/fftsink_gl.py
gr-wxgui/src/python/fftsink_nongl.py
gr-wxgui/src/python/waterfallsink_gl.py
grc/blocks/wxgui_fftsink2.xml
grc/blocks/wxgui_numbersink2.xml
grc/blocks/wxgui_waterfallsink2.xml

index 7ef40be40a92bb4f55a872e05802e95fd2b3f0c2..200c4cfbe86a6b8c8c38c2bd366329df650b7c8a 100644 (file)
@@ -28,7 +28,7 @@ class _logpwrfft_base(gr.hier_block2):
     Create a log10(abs(fft)) stream chain, with real or complex input.
     """
 
     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.
         """
         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 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
         """
         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)
 
                                               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))
 
         fft = self._fft_block[0](fft_size, True, fft_window)
         window_power = sum(map(lambda x: x*x, fft_window))
 
index f89831375bac56a3a1210619431c4a6177a784fe..7f6d62b7c0c6be7efca17667ed8c110cd90fa6cb 100644 (file)
@@ -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
 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
index 9d683d69795c3cf7f7fe320a5fb5dd262a215347..9b2f9a487e453404b304ef90034e8dfe55d024ad 100644 (file)
@@ -52,6 +52,8 @@ class _fft_sink_base(gr.hier_block2, common.wxgui_hb):
                title='',
                size=fft_window.DEFAULT_WIN_SIZE,
                peak_hold=False,
                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
        ):
                #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,
                        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)
                )
                msgq = gr.msg_queue(2)
                sink = gr.message_sink(gr.sizeof_float*fft_size, msgq, True)
index ca5e91fdbea3d708a7927281505c8a133ad105bf..b3a48a716dfe15c60ce74db19a408a2fe4859534 100644 (file)
@@ -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,
     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),
 
         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,
     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),
 
         gr.hier_block2.__init__(self, "fft_sink_c",
                                 gr.io_signature(1, 1, gr.sizeof_gr_complex),
index 37844399ed6337e1a9fdf992c3dc0b63b2b98b1c..c6b0df65c6b5c481b7333f2e02a985199013ef0e 100644 (file)
@@ -51,6 +51,7 @@ class _waterfall_sink_base(gr.hier_block2, common.wxgui_hb):
                ref_scale=2.0,
                dynamic_range=80,
                num_lines=256,
                ref_scale=2.0,
                dynamic_range=80,
                num_lines=256,
+               win=None,
                **kwargs #do not end with a comma
        ):
                #ensure avg alpha
                **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,
                        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)
                )
                msgq = gr.msg_queue(2)
                sink = gr.message_sink(gr.sizeof_float*fft_size, msgq, True)
index 42bca5ccf3174d82f0152e2d7ded2d802416a4db..8df8f90d0192de8a5e21d8cdadcb6070c85ddd53 100644 (file)
@@ -7,6 +7,7 @@
 <block>
        <name>FFT Sink</name>
        <key>wxgui_fftsink2</key>
 <block>
        <name>FFT Sink</name>
        <key>wxgui_fftsink2</key>
+       <import>from gnuradio import window</import>
        <import>from gnuradio.wxgui import fftsink2</import>
        <make>#set $parent = $notebook() and 'self.%s.GetPage(%s)'%$notebook() or 'self'
 fftsink2.$(type.fcn)(
        <import>from gnuradio.wxgui import fftsink2</import>
        <make>#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,
        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
 #if $win_size()
        size=$win_size,
 #end if
@@ -144,7 +148,7 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
                <key>average</key>
                <value>False</value>
                <type>enum</type>
                <key>average</key>
                <value>False</value>
                <type>enum</type>
-               <hide>#if $average() == 'True' then 'none' else 'part'#</hide>
+               <hide>part</hide>
                <option>
                        <name>On</name>
                        <key>True</key>
                <option>
                        <name>On</name>
                        <key>True</key>
@@ -161,6 +165,37 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
                <type>real</type>
                <hide>#if $average() == 'True' then 'none' else 'all'#</hide>
        </param>
                <type>real</type>
                <hide>#if $average() == 'True' then 'none' else 'all'#</hide>
        </param>
+       <param>
+               <name>Window</name>
+               <key>win</key>
+               <value>None</value>
+               <type>raw</type>
+               <hide>#if $win() is None then 'part' else 'none'#</hide>
+               <option>
+                       <name>Automatic</name>
+                       <key>None</key>
+               </option>
+               <option>
+                       <name>Blackman-Harris</name>
+                       <key>window.blackmanharris</key>
+               </option>
+               <option>
+                       <name>Hamming</name>
+                       <key>window.hamming</key>
+               </option>
+               <option>
+                       <name>Hanning</name>
+                       <key>window.hanning</key>
+               </option>
+               <option>
+                       <name>Rectangular</name>
+                       <key>window.rectangular</key>
+               </option>
+               <option>
+                       <name>Flattop</name>
+                       <key>window.flattop</key>
+               </option>
+       </param>
        <param>
                <name>Window Size</name>
                <key>win_size</key>
        <param>
                <name>Window Size</name>
                <key>win_size</key>
index 5289db8af9f1351338a886e30aa077054fdde9f2..ad93dec08db14d59504bfe998fb59eb29d2a0ecd 100644 (file)
@@ -123,7 +123,7 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
                <key>average</key>
                <value>False</value>
                <type>enum</type>
                <key>average</key>
                <value>False</value>
                <type>enum</type>
-               <hide>#if $average() == 'True' then 'none' else 'part'#</hide>
+               <hide>part</hide>
                <option>
                        <name>On</name>
                        <key>True</key>
                <option>
                        <name>On</name>
                        <key>True</key>
index cee598990e230da499006ff0658eadbec114f4a2..3de67597f7bb24097e9b5adebf762bb38d06f7a1 100644 (file)
@@ -7,6 +7,7 @@
 <block>
        <name>Waterfall Sink</name>
        <key>wxgui_waterfallsink2</key>
 <block>
        <name>Waterfall Sink</name>
        <key>wxgui_waterfallsink2</key>
+       <import>from gnuradio import window</import>
        <import>from gnuradio.wxgui import waterfallsink2</import>
        <make>#set $parent = $notebook() and 'self.%s.GetPage(%s)'%$notebook() or 'self'
 waterfallsink2.$(type.fcn)(
        <import>from gnuradio.wxgui import waterfallsink2</import>
        <make>#set $parent = $notebook() and 'self.%s.GetPage(%s)'%$notebook() or 'self'
 waterfallsink2.$(type.fcn)(
@@ -18,9 +19,12 @@ waterfallsink2.$(type.fcn)(
        sample_rate=$samp_rate,
        fft_size=$fft_size,
        fft_rate=$fft_rate,
        sample_rate=$samp_rate,
        fft_size=$fft_size,
        fft_rate=$fft_rate,
-       average=$options.average,
+       average=$average,
        avg_alpha=#if $avg_alpha() then $avg_alpha else 'None'#,
        title=$title,
        avg_alpha=#if $avg_alpha() then $avg_alpha else 'None'#,
        title=$title,
+#if $win()
+       win=$win,
+#end if
 #if $win_size()
        size=$win_size,
 #end if
 #if $win_size()
        size=$win_size,
 #end if
@@ -96,26 +100,57 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
                <value>15</value>
                <type>int</type>
        </param>
                <value>15</value>
                <type>int</type>
        </param>
+       <param>
+               <name>Average</name>
+               <key>average</key>
+               <value>False</value>
+               <type>enum</type>
+               <hide>part</hide>
+               <option>
+                       <name>On</name>
+                       <key>True</key>
+               </option>
+               <option>
+                       <name>Off</name>
+                       <key>False</key>
+               </option>
+       </param>
        <param>
                <name>Average Alpha</name>
                <key>avg_alpha</key>
                <value>0</value>
                <type>real</type>
        <param>
                <name>Average Alpha</name>
                <key>avg_alpha</key>
                <value>0</value>
                <type>real</type>
+               <hide>#if $average() == 'True' then 'none' else 'all'#</hide>
        </param>
        <param>
        </param>
        <param>
-               <name>Options</name>
-               <key>options</key>
-               <value>none</value>
-               <type>enum</type>
+               <name>Window</name>
+               <key>win</key>
+               <value>None</value>
+               <type>raw</type>
+               <hide>#if $win() is None then 'part' else 'none'#</hide>
+               <option>
+                       <name>Automatic</name>
+                       <key>None</key>
+               </option>
+               <option>
+                       <name>Blackman-Harris</name>
+                       <key>window.blackmanharris</key>
+               </option>
+               <option>
+                       <name>Hamming</name>
+                       <key>window.hamming</key>
+               </option>
+               <option>
+                       <name>Hanning</name>
+                       <key>window.hanning</key>
+               </option>
                <option>
                <option>
-                       <name>None</name>
-                       <key>none</key>
-                       <opt>average:False</opt>
+                       <name>Rectangular</name>
+                       <key>window.rectangular</key>
                </option>
                <option>
                </option>
                <option>
-                       <name>Average</name>
-                       <key>average</key>
-                       <opt>average:True</opt>
+                       <name>Flattop</name>
+                       <key>window.flattop</key>
                </option>
        </param>
        <param>
                </option>
        </param>
        <param>