Source code for ezmsg.sigproc.gaussiansmoothing
from typing import Callable
import warnings
import numpy as np
from .filter import (
FilterBaseSettings,
BACoeffs,
FilterByDesignTransformer,
BaseFilterByDesignTransformerUnit,
)
[docs]
class GaussianSmoothingSettings(FilterBaseSettings):
sigma: float | None = 1.0
"""
sigma : float
Standard deviation of the Gaussian kernel.
"""
width: int | None = 4
"""
width : int
Number of standard deviations covered by the kernel window if kernel_size is not provided.
"""
kernel_size: int | None = None
"""
kernel_size : int | None
Length of the kernel in samples. If provided, overrides automatic calculation.
"""
[docs]
def gaussian_smoothing_filter_design(
sigma: float = 1.0,
width: int = 4,
kernel_size: int | None = None,
) -> BACoeffs | None:
# Parameter checks
if sigma <= 0:
raise ValueError(f"sigma must be positive. Received: {sigma}")
if width <= 0:
raise ValueError(f"width must be positive. Received: {width}")
if kernel_size is not None:
if kernel_size < 1:
raise ValueError(f"kernel_size must be >= 1. Received: {kernel_size}")
else:
kernel_size = int(2 * width * sigma + 1)
# Warn if kernel_size is smaller than recommended but don't fail
expected_kernel_size = int(2 * width * sigma + 1)
if kernel_size < expected_kernel_size:
## TODO: Either add a warning or determine appropriate kernel size and raise an error
warnings.warn(
f"Provided kernel_size {kernel_size} is smaller than recommended "
f"size {expected_kernel_size} for sigma={sigma} and width={width}. "
"The kernel may be truncated."
)
from scipy.signal.windows import gaussian
b = gaussian(kernel_size, std=sigma)
b /= np.sum(b) # Ensure normalization
a = np.array([1.0])
return b, a
[docs]
class GaussianSmoothingFilter(
BaseFilterByDesignTransformerUnit[
GaussianSmoothingSettings, GaussianSmoothingFilterTransformer
]
):
SETTINGS = GaussianSmoothingSettings