From cf1c2caec34f67d98aba4e9e27772539f0cf3136 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 16 Jun 2025 11:58:25 +0200 Subject: [PATCH] refactor(qav3): readd triang extrema smoothing methods MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- quickadapter/user_data/strategies/QuickAdapterV3.py | 11 +++++++++++ quickadapter/user_data/strategies/Utils.py | 9 +++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 4a0a812..0cdadd5 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -909,6 +909,17 @@ class QuickAdapterV3(IStrategy): win_type="kaiser", center=True, ).mean(beta=extrema_smoothing_beta), + "triang": zero_phase( + series=series, + window=window, + win_type="triang", + std=std, + beta=extrema_smoothing_beta, + ) + if extrema_smoothing_zero_phase + else series.rolling( + window=odd_window, win_type="triang", center=True + ).mean(), "smm": series.rolling(window=odd_window, center=True).median(), "sma": series.rolling(window=odd_window, center=True).mean(), "ewma": series.ewm(span=window).mean(), diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index d470445..4e04ab6 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -47,12 +47,17 @@ def derive_gaussian_std_from_window(window: int) -> float: @lru_cache(maxsize=8) def _calculate_coeffs( - window: int, win_type: Literal["gaussian", "kaiser"], std: float, beta: float + window: int, + win_type: Literal["gaussian", "kaiser", "triang"], + std: float, + beta: float, ) -> np.ndarray: if win_type == "gaussian": coeffs = sp.signal.windows.gaussian(M=window, std=std, sym=True) elif win_type == "kaiser": coeffs = sp.signal.windows.kaiser(M=window, beta=beta, sym=True) + elif win_type == "triang": + coeffs = sp.signal.windows.triang(M=window, sym=True) else: raise ValueError(f"Unknown window type: {win_type}") return coeffs / np.sum(coeffs) @@ -61,7 +66,7 @@ def _calculate_coeffs( def zero_phase( series: pd.Series, window: int, - win_type: Literal["gaussian", "kaiser"], + win_type: Literal["gaussian", "kaiser", "triang"], std: float, beta: float, ) -> pd.Series: -- 2.43.0