bundles / scipy latest / scipy / signal / _signaltools / sosfiltfilt
function
scipy.signal._signaltools:sosfiltfilt
Signature
def sosfiltfilt ( sos , x , axis = -1 , padtype = odd , padlen = None ) Summary
A forward-backward digital filter using cascaded second-order sections.
Extended Summary
See filtfilt for more complete information about this method.
Parameters
sos: array_likeArray of second-order filter coefficients, must have shape
(n_sections, 6). Each row corresponds to a second-order section, with the first three columns providing the numerator coefficients and the last three providing the denominator coefficients.x: array_likeThe array of data to be filtered.
axis: int, optionalThe axis of
xto which the filter is applied. Default is -1.padtype: str or None, optionalMust be 'odd', 'even', 'constant', or None. This determines the type of extension to use for the padded signal to which the filter is applied. If
padtypeis None, no padding is used. The default is 'odd'.padlen: int or None, optionalThe number of elements by which to extend
xat both ends ofaxisbefore applying the filter. This value must be less thanx.shape[axis] - 1.padlen=0implies no padding. The default value is3 * (2 * len(sos) + 1 - min((sos[:, 2] == 0).sum(), (sos[:, 5] == 0).sum()))
The extra subtraction at the end attempts to compensate for poles and zeros at the origin (e.g. for odd-order filters) to yield equivalent estimates of
padlento those of filtfilt for second-order section filters built with scipy.signal functions.
Returns
y: ndarrayThe filtered output with the same shape as
x.
Notes
Array API Standard Support
sosfiltfilt has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable SCIPY_ARRAY_API=1 and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.
==================== ==================== ==================== Library CPU GPU ==================== ==================== ==================== NumPy ✅ n/a CuPy n/a ✅ PyTorch ⛔ ⛔ JAX ⛔ ⛔ Dask ⛔ n/a ==================== ==================== ====================
See
dev-arrayapifor more information.
Examples
import numpy as np from scipy.signal import sosfiltfilt, butter import matplotlib.pyplot as plt rng = np.random.default_rng()✓
n = 201 t = np.linspace(0, 1, n) x = 1 + (t < 0.5) - 0.25*t**2 + 0.05*rng.standard_normal(n)✓
sos = butter(4, 0.125, output='sos') y = sosfiltfilt(sos, x)✓
from scipy.signal import sosfilt, sosfilt_zi sos8 = butter(8, 0.125, output='sos') zi = x[:4].mean() * sosfilt_zi(sos8) y2, zo = sosfilt(sos8, x, zi=zi)✓
plt.plot(t, x, alpha=0.5, label='x(t)') plt.plot(t, y, label='y(t)') plt.plot(t, y2, label='y2(t)') plt.legend(framealpha=1, shadow=True)✗
plt.grid(alpha=0.25)
✓plt.xlabel('t')
✗plt.show()
✓
See also
Aliases
-
scipy.signal.sosfiltfilt