ModifiedSincFilter#
- class chemotools.smooth.ModifiedSincFilter(window_size: int = 21, n: int = 6, alpha: float = 4.0, use_corrections: bool = True, mode: Literal['mirror', 'constant', 'nearest', 'wrap', 'interp'] = 'interp', axis: int = 1)[source]
Bases:
_BaseFIRFilterModified Sinc smoothing (MS) for denoising while preserving peak positions based on the paper “Why and How Savitzky–Golay Filters Should Be Replaced.”
The Modified Sinc smoother is a linear-phase FIR filter: the signal is convolved with a fixed, symmetric kernel. The kernel is built from:
a sinc core with argument ((n + 4) / 2) * pi * x (Eq. 3, p. 187),
- a special Gaussian-like window w(x) whose value and slope vanish at
the window ends (Eq. 4, p. 187), and
- small optional correction terms that flatten the passband so low
frequencies are almost unattenuated (Eqs. 7–8 and Table 1, pp. 187–188).
- Parameters:
window_size (int, default=21) – Odd number of taps (2*m + 1). Larger values give stronger smoothing.
n (int, default=6) – Even integer >= 2. Controls how many inner zeros the sinc has within the window. The paper discusses n = 2, 4, 6, 8, 10 (Fig. 2).
alpha (float, default=4.0) – Positive window width parameter. Larger alpha reduces side lobes more aggressively (steeper roll-off).
use_corrections (bool, default=True) – If True and n in {6, 8, 10} and the window is large enough, add the small passband-flattening terms from Eqs. 7–8 (coefficients from Table 1).
mode ({"mirror", "constant", "nearest", "wrap", "interp"}, default="interp") – Boundary strategy, passed to the base FIR class. “interp” performs linear extrapolation (recommended in the paper).
axis (int, default=1) – Axis along which to smooth for 2D inputs (rows x features). Use 1 to smooth within each row.
- fit(X, y=None)[source]
Inherited from the base class. Validates input and builds the kernel.
- transform(X, y=None)[source]
Inherited from the base class. Pads, convolves, and returns the smoothed data.
References
[1] Schmid, M.; Rath, D.; Diebold, U. “Why and How Savitzky–Golay Filters Should Be Replaced.” ACS measurement science Au 2022, 2 (2), 185-196.
Examples
>>> from chemotools.datasets import load_fermentation_train >>> from chemotools.smooth import ModifiedSincFilter >>> # Load sample data >>> X, _ = load_fermentation_train() >>> # Initialize ModifiedSincFilter >>> msf = ModifiedSincFilter() ModifiedSincFilter() >>> # Fit and transform the data >>> X_smoothed = msf.fit_transform(X)
- fit(X: ndarray, y: ndarray | None = None) ModifiedSincFilter[source]
Fit the Modified Sinc Filter to the data.
- Parameters:
X (np.ndarray of shape (n_samples, n_features)) – The input data to fit the transformer.
y (Ignored) – Not used, present for API consistency by convention.
- Returns:
self – The fitted transformer.
- Return type:
ModifiedSincFilter
- transform(X: ndarray, y: ndarray | None = None) ndarray[source]
Transform the input data by applying the Modified Sinc Filter.
- Parameters:
X (np.ndarray of shape (n_samples, n_features)) – The input data to transform.
y (None) – Ignored to align with API.
- Returns:
X_transformed – The transformed data.
- Return type:
np.ndarray of shape (n_samples, n_features)