[Scipy-tickets] [SciPy] #1315: FIR filter created by firwin() does not have linear phase
SciPy Trac
scipy-tickets@scipy....
Mon Oct 18 20:00:37 CDT 2010
#1315: FIR filter created by firwin() does not have linear phase
---------------------------------------+------------------------------------
Reporter: warren.weckesser | Owner: somebody
Type: defect | Status: new
Priority: normal | Milestone: 0.9.0
Component: scipy.signal | Version: 0.8.0
Keywords: firwin, FIR, linear phase |
---------------------------------------+------------------------------------
For even numbers of taps for which half the number of taps is odd, firwin
gives coefficients for a FIR filter that does not have linear phase. The
following script:
{{{
import numpy as np
from scipy.signal import firwin, freqz
from pylab import plot, show, figure, clf, title
# The following demonstrates that an even number of taps results
# in a coefficients that are not symmetric.
for n in range(8,12):
taps = firwin(n, 0.5)
print "number of taps: ", taps.size
m = n/2
print "Symmetric: ", np.allclose(taps[:n/2],taps[n:m:-1])
print "taps:"
print taps
print
# Compute the phase response for n=10
n = 10
taps = firwin(n, 0.5)
w, h = freqz(taps, worN=8000)
phase = np.unwrap(np.arctan2(h.imag, h.real))
dphase = np.diff(phase)/np.diff(w)
figure(1)
clf()
plot(w[:-1]/np.pi, dphase)
title("Derivative of the phase\n(should be constant)")
show()
}}}
generates the following output:
{{{
number of taps: 8
Symmetric: False
taps:
[ -1.55107885e-18 -2.26639855e-02 1.04697822e-17 2.73977083e-01
4.97373806e-01 2.73977083e-01 1.04697822e-17 -2.26639855e-02]
number of taps: 9
Symmetric: True
taps:
[ -1.55107885e-18 -2.26639855e-02 1.04697822e-17 2.73977083e-01
4.97373806e-01 2.73977083e-01 1.04697822e-17 -2.26639855e-02
-1.55107885e-18]
number of taps: 10
Symmetric: False
taps:
[ 5.08605417e-03 -3.26714830e-18 -4.21562032e-02 1.32776235e-17
2.89952076e-01 4.99322201e-01 2.89952076e-01 1.32776235e-17
-4.21562032e-02 -3.26714830e-18]
number of taps: 11
Symmetric: True
taps:
[ 5.06031712e-03 -3.25061549e-18 -4.19428794e-02 1.32104345e-17
2.88484826e-01 4.96795472e-01 2.88484826e-01 1.32104345e-17
-4.19428794e-02 -3.25061549e-18 5.06031712e-03]
}}}
A fix will be included in the patch being discussed in Ticket #902; see
that ticket for more details.
The current ticket ensures that we have a record of the bug in Trac.
Technically, firwin() doesn't *say* the filter will have linear phase, but
the result is surprising enough that I consider it a bug.
--
Ticket URL: <http://projects.scipy.org/scipy/ticket/1315>
SciPy <http://www.scipy.org>
SciPy is open-source software for mathematics, science, and engineering.
More information about the Scipy-tickets
mailing list