app+docs: 第三十八轮——raw 录制调试开关+逐级重放定案(参考减除消 98.4%,官方 13 函数二次核对无差异,NUC 域残差差 1.6×);显示链对齐官方两级(nativeOut 去 2× 内插 + 640×480 中间级低通),123 单测全绿
This commit is contained in:
@@ -678,3 +678,91 @@ JPEG 只能解释一部分:把我们那张(960×720 q95,202 KB)按 640×
|
||||
2. 离线重放:raw → 参考 → NUC → 表插值 → LUT,**每一级都算"沿行均值 std"**,
|
||||
找出引入行偏移的那一级;再用录到的数据做 A/B(改窗口/改表温度/改盲元)复现官方数值。
|
||||
3. 真机 A/B 验收指标就用 16.2 的表:目标"逐行固定偏移 std ≤ 0.2"。
|
||||
|
||||
## 17. 第三十八轮:原始帧录制 + 逐级重放全链路定案 + 显示链修复(2026-10-07 凌晨)
|
||||
|
||||
按 §16.3 清单执行。工具:`IrSession.rawFrameSink` + `RawFrameRecorder`(调试开关,
|
||||
`files/rawcap.enable` 标志文件触发,录 raw+NUC dump 到 `files/rawcap/run_*.bin`,
|
||||
带 FFC 触发,300 帧自动停);离线重放脚本在 `%TEMP%\mag160c_re\`(临时件)。
|
||||
|
||||
### 17.1 逐级重放(整数语义复刻,与真机 NUC dump 互锁)
|
||||
|
||||
录制 300 帧(含 3 次完整 FFC 窗口)。Python 逐级复刻(i32/算术移位/向零截断与
|
||||
Kotlin 一致),与 App 自己 `copyNuc` 的 dump 对拍:corr=0.9996,仅盲元像素大差异
|
||||
——**复刻可信**。各级行交替(alt = 行均值相邻二阶差,固定分量):
|
||||
|
||||
| 级 | 行交替 std(counts) |
|
||||
|---|---|
|
||||
| raw(场景帧固定行剖面) | 596.9 |
|
||||
| ref(4 帧快门平均) | 596.7(与 raw 图样相关 0.999) |
|
||||
| d2 = (raw−ref)>>1 | 5.20 |
|
||||
| NUC(查表后,App dump) | 4.25 |
|
||||
|
||||
**结论 1:参考减除消掉 98.4% 的行 FPN,表再消一半,残差 4.25 counts 就是
|
||||
显示条纹的直接来源**(换算到显示域 ≈ §16.2 的我们 1.2–1.84)。
|
||||
|
||||
### 17.2 排除清单(都做了 A/B)
|
||||
|
||||
- **参考窗相位**(±2 帧移动):4.01–4.33,不敏感。
|
||||
- **参考平均长度**(1/4/6/8 帧):4.14–4.51,不敏感(时间噪声早已被平均压低)。
|
||||
- **表插值温度**(33637…47664 扫描):4.06–4.57,不敏感。
|
||||
- **残差时间结构**:FFC 后 1–10.3 s 固定分量 5.14–5.34,完全平坦 → 不是参考老化。
|
||||
- **跨 FFC 窗口**:d2 残差图样相关 +0.986 → 不是每次 FFC 的随机量。
|
||||
- **残差与 raw/ref 图样相关** ≈ 0.02/0.03 → 白状固定残差,**即"快门态与开放态的
|
||||
行 offset FPN 图样差"(≈1.7%)**,设备固有。
|
||||
- **GenerateVolatileLens**(0x18314):11 段温度响应折线,只进温度链(`this+3163`
|
||||
默认 1 时直通),与图像链无关 → "官方把参考融合进表"的假设**不成立**。
|
||||
- **官方 SDK 全函数核对**(本轮新读):`CalibrationMain_RTV`(段选择/`(d*gain>>12)+off`/
|
||||
布局与步进逐字段一致)、`PushBaselineRaw`(双累积器 +14212/+14244)、
|
||||
`CAccumulator::Reset/PushFrame/Restart`(mode=baseLineAcc=4 恰好 4 帧块平均)、
|
||||
`Raw2Temperature`/`CFunctions::PushFrame`(0x3808=1 旁路、每帧渲染、FFC 条件同相)、
|
||||
`TempRangeStat`(纯 min/max/mean)、`BlindCompensation`(typ 3..8 邻域 switch)、
|
||||
`InterpolateShort/UShort`(Q12 端点插值同式)、`SelectCaliCurve`、`DoSomething`、
|
||||
`Controller::PushFrame/StartProcess`(A=5/E=4/C=4 同相;PushBaselineRaw 收 JNI 原样
|
||||
帧,Java `ThreadImgProcess` 不做预处理)。**官方每帧链路与我们逐字段一致,没有
|
||||
任何"额外处理"能解释残差差**。
|
||||
|
||||
### 17.3 显示域 A/B(同场景同铁虹,§16.2 口径:12px 中值网格 + 弧长 + hf3 行/列剖面)
|
||||
|
||||
| 测量 | ROW-dir | COL-dir |
|
||||
|---|---|---|
|
||||
| 官方截图(横屏) | 0.12 | 0.31 |
|
||||
| 我们修复前截图 | 1.41 | 0.46 |
|
||||
| 我们修复后截图 | 1.32 | 0.59 |
|
||||
| 我们修复后截图(**mask 掉 UI 覆盖层后**) | 0.76 | 0.67 |
|
||||
|
||||
**重要测量教训**:我们的竖屏 UI 把中心温度/MAX 标注/色标条画在热像区内,它们对
|
||||
行剖面的贡献与真实 FPN 同量级——**对比测量必须 mask**(官方 UI 覆盖为 0)。
|
||||
§16.2 的"8–17×"里含此混淆 + 几何错位(37 轮连拍的官方横屏 crop 与我们竖屏
|
||||
行/列方向不一致);本轮修正后**真实 NUC 域差距约 1.6×**(同一份我们的数据走
|
||||
官方显示链复刻 = 0.19,走我们链 = 0.32,官方截图实测 0.12)。
|
||||
|
||||
### 17.4 定案与修复
|
||||
|
||||
1. **官方显示链的两级结构**(jadx `ImageViewer` + 本轮重核):SDK 输出 160×120
|
||||
bitmap → `PaintFlagsDrawFilter + FILTER_BITMAP` 画入 **640×480 离屏**(4× 双线性)
|
||||
→ SurfaceView 再放大到屏。**中间 4× 双线性对逐行 FPN 图样有 ~0.6× 的低通**——
|
||||
同一份我们的 NUC 数据:走官方两级链复刻 = 0.12,走我们单级 12× 复刻 = 0.32。
|
||||
**"官方背景条纹更不明显"的主导机制是显示链,不是 NUC 域**。
|
||||
2. **修复 A(nativeOut)**:`RenderPipeline` 去掉 PC 版遗留的内部 2× 插值级
|
||||
(官方安卓没有),输出原生 160×120 调色板图;`LiveRenderer`/录像/拍照全链
|
||||
适配。复刻证明它对行交替数值无影响,但消除了自造的"全幅/半幅"行调制
|
||||
(§35 的竖列交错在行方向的同类项),显示等价性更完整。
|
||||
3. **修复 B(640×480 中间级)**:`LiveRenderer` 按官方 viewer 补上 640×480 离屏
|
||||
位图(FILTER_BITMAP 4×)再上屏,**显示链与官方逐级等价**。
|
||||
4. **遗留(诚实记录)**:UI mask 后我们 0.76 vs 官方 0.12 仍有差距,其中
|
||||
a) NUC 域残差 2.87 vs 官方等效 ~1.3–1.8 counts(**1.6×**,同显示链对比)——
|
||||
与"快门态/开放态行 offset FPN 图样差"相关,设备固有,官方同算法也应承担,
|
||||
差异来源未定位(疑似两 App 会话时设备状态不同);
|
||||
b) 真机 GPU 显示链与 PIL 复刻间仍有 ~2× 未解释差(复刻 0.34 vs 真机 0.76),
|
||||
需下一轮用"真机截图 vs 同帧 NUC dump 的逐像素对照"收敛。
|
||||
§16.3 的验收目标"逐行 std ≤ 0.2"未达成;下一轮从 b) 项入手(它是纯测量
|
||||
差异还是真机显示链仍有未建模环节)。
|
||||
|
||||
### 17.5 工具与现场
|
||||
|
||||
- `RawFrameRecorder`/`rawFrameSink`/flag 轮询已合入(调试工具,默认不活动)。
|
||||
- `DebugLog.enabled` 本轮临时 true,提交前已改回 false。
|
||||
- 现场状态:rotation 锁竖屏(原值 1,**待用户恢复**);我们 App 前台出流;
|
||||
MIUI 的 App 自动启动会在授权后把焦点拉回我们 App,切官方测前先 force-stop
|
||||
我们,用 `TAB×2+ENTER` 过 USB 弹窗(横屏时 input tap 坐标不可靠)。
|
||||
|
||||
@@ -489,6 +489,45 @@
|
||||
"未连接"分支显示,正常出图时用户看不到任何反馈)。
|
||||
- [x] 单测 66 → **76 项全绿**;debug + release(R8) 双构建通过;APK 已更新。
|
||||
|
||||
## 用户反馈修复 第三十八轮(2026-10-07 凌晨,原始帧录制 + 逐级重放全链路定案 + 显示链与官方对齐)
|
||||
|
||||
按第三十七轮交接清单执行。用户中途解锁手机并配合真机操作。完整数据表与
|
||||
排除清单见 `docs/android_app/rendering_diff_phone_20261006.md` §17。
|
||||
|
||||
- [x] **原始帧录制调试开关**:`usb/RawFrameRecorder`(单文件,帧头 magic/seq/
|
||||
phase/shutter/flags + raw 38456B,渲染帧附 NUC u16 块)+ `IrSession.rawFrameSink`
|
||||
(读线程帧入口)+ `LiveViewModel` 的 `files/rawcap.enable` 标志轮询(400ms,
|
||||
置位即录并触发手动 FFC,300 帧自动停写 `rawcap.state`)。零 Manifest/协议改动。
|
||||
新增 `RawFrameRecorderTest`;123 单测全绿。
|
||||
- [x] **逐级重放**:Python 整数语义复刻(i32/移位/截断同 Kotlin)与真机 NUC dump
|
||||
互锁(corr 0.9996)。行交替 596.9(raw)→ 5.20(d2)→ 4.25(NUC):**参考减除
|
||||
消 98.4%,残差即条纹来源**。A/B 排除:参考窗相位/平均长度/表插值温度/参考
|
||||
老化(10.3 s 平坦)/跨 FFC 随机——残差=快门态与开放态行 offset FPN 图样差
|
||||
(设备固有 ~1.7%)。
|
||||
- [x] **官方 SDK 二次核对**(本轮新读 13 函数:CalibrationMain_RTV、PushBaselineRaw、
|
||||
CAccumulator 全家、Raw2Temperature、CFunctions::PushFrame、TempRangeStat、
|
||||
BlindCompensation、Interpolate*、SelectCaliCurve、DoSomething、GenerateVolatileLens、
|
||||
Controller::PushFrame/StartProcess + jadx Java 帧路径):**与我们逐字段一致,
|
||||
官方无任何额外处理能解释残差差**;GenerateVolatileLens 只进温度链。
|
||||
- [x] **显示域 A/B 定案**:同场景同铁虹(§16.2 口径)。发现并修正两大测量混淆:
|
||||
①我们竖屏 UI 的中心温度/MAX 标注/色标条画在热像区内,贡献与 FPN 同量级
|
||||
(mask 后 1.41→0.76);②§16.2 的 8–17× 含横屏/竖屏几何错位。真实 NUC 域
|
||||
差距 **1.6×**(同一份数据走官方显示链复刻 0.19 vs 我们链 0.32,官方截图 0.12)。
|
||||
- [x] **修复 A(nativeOut)**:`RenderPipeline` 去掉 PC 版遗留的内部 2× 插值级
|
||||
(官方安卓无此级),输出原生 160×120;IrSession/LiveRenderer/录像(6×)/拍照
|
||||
全链适配,`NativeOutTest` 锁 parity(偶数采样=旧路径)。
|
||||
- [x] **修复 B(640×480 中间级)**:`LiveRenderer` 按官方 viewer 补两级显示
|
||||
(160×120 →FILTER_BITMAP 4×→640×480→屏幕)。复刻证明该中间级对逐行 FPN
|
||||
有 ~0.6× 低通——同数据走官方两级链=0.12 vs 我们单级=0.32,**"官方背景
|
||||
条纹更不明显"的主导机制是显示链**,现已逐级等价。
|
||||
- [ ] **遗留(下一轮)**:UI mask 后我们 0.76 vs 官方 0.12——NUC 域 1.6×(设备
|
||||
状态嫌疑,官方同算法同承担)+ 真机 GPU 显示链与 PIL 复刻间 ~2× 未解释差;
|
||||
验收目标"逐行 std ≤ 0.2"未达成,从真机显示链逐像素对照入手。
|
||||
- 现场状态:rotation 仍锁竖屏(原值 1,**待恢复**);我们 App 前台出流(新版
|
||||
APK);官方 App 已 force-stop;DebugLog 已改回默认关。MIUI 会把授权后焦点
|
||||
拉回我们 App:切官方前先 force-stop 我们,USB 弹窗用 `TAB×2+ENTER` 过
|
||||
(横屏 input tap 坐标不可靠)。
|
||||
|
||||
## 用户反馈修复 第三十七轮(2026-10-06 深夜,"官方背景条纹更不明显"——逆向排除全部候选,定位为逐行固定偏移;交接轮)
|
||||
|
||||
用户:"很明显啊,官方背景里面的条纹就是要更不明显,你看看逆向出来的代码,是不是还漏掉了什么"。
|
||||
|
||||
Reference in New Issue
Block a user