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.
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.
@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
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))
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
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
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)
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),
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),
ref_scale=2.0,
dynamic_range=80,
num_lines=256,
+ win=None,
**kwargs #do not end with a comma
):
#ensure avg alpha
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)
<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)(
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
<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>
<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>
<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>
<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)(
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,
+#if $win()
+ win=$win,
+#end if
#if $win_size()
size=$win_size,
#end if
<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>
+ <hide>#if $average() == 'True' then 'none' else 'all'#</hide>
</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>
- <name>None</name>
- <key>none</key>
- <opt>average:False</opt>
+ <name>Rectangular</name>
+ <key>window.rectangular</key>
</option>
<option>
- <name>Average</name>
- <key>average</key>
- <opt>average:True</opt>
+ <name>Flattop</name>
+ <key>window.flattop</key>
</option>
</param>
<param>