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))
#
-# Copyright 2004,2005 Free Software Foundation, Inc.
+# Copyright 2004,2005,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
j -= 1
return window
-def blackmanharris(fft_size):
- a0 = 0.35875
- a1 = 0.48829
- a2 = 0.14128
- a3 = 0.01168
- window = [0 for i in range(fft_size)]
- for index in xrange(fft_size):
- window[index] = a0
- window[index] -= a1*math.cos(2.0*math.pi*(index+0.5)/(fft_size - 1))
- window[index] += a2*math.cos(4.0*math.pi*(index+0.5)/(fft_size - 1))
- window[index] -= a3*math.cos(6.0*math.pi*(index+0.5)/(fft_size - 1))
- return window
-
-def nuttall(fft_size):
- a0 = 0.3635819
- a1 = 0.4891775
- a2 = 0.1365995
- a3 = 0.0106411
- window = [0 for i in range(fft_size)]
- for index in xrange(fft_size):
- window[index] = a0
- window[index] -= a1*math.cos(2.0*math.pi*(index+0.5)/(fft_size - 1))
- window[index] += a2*math.cos(4.0*math.pi*(index+0.5)/(fft_size - 1))
- window[index] -= a3*math.cos(6.0*math.pi*(index+0.5)/(fft_size - 1))
- return window
-
def kaiser(fft_size,beta):
ibeta = 1.0/izero(beta)
inm1 = 1.0/(fft_size)
window[index] = izero(beta*math.sqrt(1.0 - (index * inm1)*(index * inm1))) * ibeta
return window
-
+# Closure to generate functions to create cos windows
+
+def coswindow(coeffs):
+ def closure(fft_size):
+ window = [0] * fft_size
+ #print list(enumerate(coeffs))
+ for w_index in range(fft_size):
+ for (c_index, coeff) in enumerate(coeffs):
+ window[w_index] += (-1)**c_index * coeff * math.cos(2.0*c_index*math.pi*(w_index+0.5)/(fft_size-1))
+ return window
+ return closure
+
+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
#
-# Copyright 2008 Free Software Foundation, Inc.
+# Copyright 2008,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
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)
#!/usr/bin/env python
#
-# Copyright 2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+# Copyright 2003,2004,2005,2006,2007,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
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),
#
-# Copyright 2008 Free Software Foundation, Inc.
+# Copyright 2008,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
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>