弱波增强:去掉前置滤波并新增「阶数 N」滑块;修复选区放大越界绘制与浮动面板 ✕ 交互
- 弱波增强不再做任何前置滤波(删除内部的 5 点滑动平均 BoostShapeAt): 极值点直接在输入采样上识别。需要平滑时用户可以先用「均值滤波」构建一条 滤波后的信号,再对它做弱波增强。 - 新增「阶数 N」参数(1~10,滑块输入),语义与均值滤波的阶数 N 一致 —— 把同一处理重复应用 N 次,每阶以上一阶为输入: 一阶时改定量严格等于「等级」对应的目标值;多阶会让相邻弱波互相抬高彼此的 基准,从而把较宽的弱波区逐步恢复(实测三连弱波的中间峰 550→575→598.4)。 某一阶若不再产生改动会提前结束迭代。 `ComputeWeakWaveBoost(values, level, order, out)`; `Lane::weakBoostOrder`(默认 1)随 LaneCarry / SplitLane / 引用重映射同步, 并进入 SceneContentHash;曲线缓存键变为「信号 + 等级 + 阶数」。 - 浮动面板同步新增一行「阶数 N」滑块(新拖拽模式 BOOST_ORDER、 EdgePanelLayout::sliderOrder);「构建为新信号」命名带上阶数 (形如 `<原信号> (弱波增强 60%×2阶)`)。 - 修复:选区放大时鼠标被捕获到绘图区之外(工具栏 / 信号面板 / 时间轴)会把 选区块画到绘图区之外,而拖拽期间只失效绘图区 → 留下无法擦除的墨迹。 现在拖拽时把选区夹在绘图区内,PaintRubberBand 再对 m_plotRect 求交一次。 - 修复:浮动面板的 ✕ 位于标题栏矩形内部,按下后会继续落到「标题栏 → 拖动面板」 分支,表现为「按住 ✕ 却把面板拖走了」;现在按下 ✕ 直接消费该次点击(抬起时 仍按原语义确认关闭),并把 ✕ 的光标改为手型,与其它关闭按钮一致。 - 修复:✕ / 滑块 / 底部按钮的悬停高亮依赖鼠标坐标,但从同一网格的波形移到面板上 时悬停状态毫无变化 → OnMouseMove 返回 false → 宿主不重绘 → 高亮不出现。 现在「进入 / 离开 / 在面板内移动」都会请求重绘。 - 离屏验证(窗口隐藏,不占用鼠标/键盘/屏幕):345 项检查全部通过,含 阶数扫描(N=1 只改外侧弱峰、N=2 传导到中间弱峰、高 N 逼近健康幅值且不越界、 健康峰在任何阶数下逐位不变)、两个滑块的按压/拖拽/钳制、选区越界零墨迹 (绘图区外像素差 0)、面板 ✕ 悬停高亮与按下不拖动、光标拖拽始终在视界内, 以及真实 20K 电机纹波录波(信号范围保持不变、20%+ 采样被调整)。
This commit is contained in:
1 parent
67f659ad23
commit
8c8508e5f8
5 files changed
+457
-240
No files matched your search
@@ -513,6 +513,15 @@ namespace jdi
|
||||
/** 弱波增强等级(0–1),0% = 目标取左右极值中较小/较大的那一个,100% = 取另一个。 */
|
||||
double weakBoostLevel = 0.5;
|
||||
|
||||
/**
|
||||
* @brief 弱波增强的阶数 N(1–10)。
|
||||
*
|
||||
* 与「均值滤波」的阶数 N 一样表示“把同一处理重复应用 N 次”(每一阶以上一阶为输入):
|
||||
* 一阶时改定量就已严格等于「等级」对应的目标值;多阶会把相邻弱波互相抬高
|
||||
* 彼此的基准,从而把较宽的弱波区逐步恢复。
|
||||
*/
|
||||
int weakBoostOrder = 1;
|
||||
|
||||
/** 参与弱波增强预览的信号条目(只包含被勾选的信号)。 */
|
||||
std::vector<WeakBoostItem> weakBoostItems;
|
||||
|
||||
@@ -585,8 +594,11 @@ namespace jdi
|
||||
/**
|
||||
* @brief 「弱波增强」:把比周边更弱的纹波波峰/波谷恢复(自适应弱波增强)。
|
||||
*
|
||||
* 思路(全部 O(n)):
|
||||
* 1. **识别趋势与极值**:对轻度平滑后的信号扫描单调段,方向发生翻转处即为
|
||||
* 本算法**不做任何前置滤波**:需要平滑时用户可以先用「均值滤波」构建一条
|
||||
* 滤波后的信号,再对它做弱波增强。极值点直接在输入采样上识别。
|
||||
*
|
||||
* 单阶处理(全 O(n)):
|
||||
* 1. **识别趋势与极值**:扫描单调段,方向发生翻转处的上一个采样点即为
|
||||
* 波峰(先升后降)或波谷(先降后升);波峰与波谷交替出现。
|
||||
* 2. **判定“弱”**:对第 k 个波峰,取同类的左右相邻波峰(k−2、k+2)。
|
||||
* 若本波峰低于两者的均值,说明它是被削弱的那个;波谷反之(高于两者均值)。
|
||||
@@ -598,14 +610,14 @@ namespace jdi
|
||||
* 4. **平滑偏移**:极值点本身取其目标值,两侧的数据点按相邻两个极值点的偏移量
|
||||
* 平滑过渡(平滑步进,两端导数为 0),使波形整体趋势不变、只在弱波附近被推回。
|
||||
*
|
||||
* 与“全局缩放/局部放大”不同,这里**只改动被判为弱波的极值及其两侧**,
|
||||
* 正常周期的极值不满足条件、偏移量恒为 0,因此输出与输入逐位相同。
|
||||
*
|
||||
* @param [IN] values 原始采样值。
|
||||
* @param [IN] level 弱波增强等级(0–1,超出范围会被夹取)。
|
||||
* @param [IN] order 阶数 N(重复应用次数,至少为 1;与均值滤波的阶数同一语义)。
|
||||
* @param [OUT] out 输出数组(长度与 values 相同;原值为 NaN 处保持 NaN)。
|
||||
*/
|
||||
void ComputeWeakWaveBoost(const std::vector<double>& values, double level,
|
||||
void ComputeWeakWaveBoost(const std::vector<double>& values, double level, int order,
|
||||
std::vector<float>& out);
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user