From 7dea5b2eca8bb2e72c1c95d8b034ac872b9d1367 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Fri, 24 Apr 2026 17:34:21 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20SG=20Filter=20on/off=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80=20=EC=B6=94=EA=B0=80=20(Settings=20=ED=8C=A8=EB=84=90?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PiezoEchoAnalyzer.useSgFilter: true/false로 SG 필터 on/off - OFF 시 raw ADC 그대로 low-echo detection에 사용 - Settings 패널에 Switch 토글 추가 (기본 ON) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../managers/PiezoEchoAnalyzer.kt | 5 +++-- .../views/monitoring/PiezoMonitoringView.kt | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/example/medilightv2android/managers/PiezoEchoAnalyzer.kt b/app/src/main/java/com/example/medilightv2android/managers/PiezoEchoAnalyzer.kt index 70b4d0f..c006927 100644 --- a/app/src/main/java/com/example/medilightv2android/managers/PiezoEchoAnalyzer.kt +++ b/app/src/main/java/com/example/medilightv2android/managers/PiezoEchoAnalyzer.kt @@ -213,9 +213,10 @@ class PiezoEchoAnalyzer private constructor() { // ── Denoising Pipeline ── - /** SG 디노이징 (6ch 알고리즘: TVD 제거, SG만 사용) */ + var useSgFilter: Boolean = true + fun denoise(signal: DoubleArray): DoubleArray { - return sgSmooth(signal) + return if (useSgFilter) sgSmooth(signal) else signal.copyOf() } /** 1D Total Variation Denoising — Chambolle (2004) dual projected gradient */ diff --git a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt index 75ee193..2fc41f2 100644 --- a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt +++ b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt @@ -681,6 +681,26 @@ fun PiezoMonitoringView(appState: AppState) { HorizontalDivider() + // SG Filter toggle + var sgEnabled by remember { mutableStateOf(analyzer.useSgFilter) } + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text("SG Filter", fontSize = 14.sp, fontWeight = FontWeight.SemiBold) + Spacer(modifier = Modifier.weight(1f)) + Switch( + checked = sgEnabled, + onCheckedChange = { + sgEnabled = it + analyzer.useSgFilter = it + }, + colors = SwitchDefaults.colors(checkedTrackColor = MlPrimary) + ) + } + + HorizontalDivider() + Row { Text("Max Volume", fontSize = 14.sp, fontWeight = FontWeight.SemiBold) Spacer(modifier = Modifier.weight(1f))