docs: 温度链数据源全部定位(v50=fpaTempFix、0xA4/A8=BasePara2.ATZeroErrorPoint/ATErrorSlope、斜率表现算、曲线A=我们的T2E表)——落地无未知项

This commit is contained in:
ZXCLI
2026-10-06 02:54:17 +08:00
parent e80d62050b
commit 8560b83816
@@ -272,6 +272,70 @@ band_map(c):
然后按上面的伪代码在 Kotlin 落地(波段映射 + 环境补偿 + 距离项 + revise),
用 15 帧官方同帧数据做逐像素回归(目标 ≤20 mC),最后替换 App 的所有温度读数点。
## 4e. 第五轮:数据来源全部定位(`MAG_SetFixPara` / BasePara2 / 斜率表)
本轮的三个关键发现,把上表右列基本填满:
1. **斜率表不用导**:`FUN_1800512c0`/`FUN_180050fc0` 之外的**初始化代码**里,
`DAT_180099A20[i] = ((Δ >> 1) + 0x1000000) / Δ`,`Δ = A[i+1] - A[i]` ——
与我们在 Kotlin 里现算的公式**完全一致**(645/645 项 ±1 内吻合)。
→ 曲线 A(= `OfficialTables.T2E`,**646 项逐项相等**)已够用。
2. **`dev+0xA4` / `dev+0xA8` = 设备上报的 BasePara2 字段**:
- `dev+0xA4` = 22216 mC = **`BasePara2.ATZeroErrorPoint`**(环境温度误差零点,22.2 ℃)
- `dev+0xA8` = −0.0279 = **`BasePara2.ATErrorSlope`**(环境温度误差斜率)
→ 这一段(我先前叫"距离/大气项")本质是**环境温度误差修正**:
`arg = (当帧均值温度 − ATZeroErrorPoint) × ATErrorSlope`,本机 = −212 mC。
官方手机 App 里对应 `sdk/BasePara2.java` 的同名字段;我们的 `IrSession` 已经发了 66c
拿到 BasePara2,只是**当前仅打印不解析**——补上解析即可。
3. **"温度修正参数"结构 = `dev+0xD0` 起 44 字节**(`MAG_GetFixPara` 直接 memcpy 0x2c):
`MAG_SetFixPara(chan, para, enable)` 写 `dev+0xD0` 并调 `FUN_180014fe0` 重算:
其中 `param_2[9]`(= `dev+0xF4`)由 `(发射率等参数 + 环境温度查表) → 指数/多项式` 算出
(本机 0.99991);`param_2[2]` 是环境温度(整度,clamp −25…35,查表用);
`param_2[4]` 作除数(距离/湿度类);`enable` 写 `dev+0xCC`(本机 2)。
→ `dev+0xF4/F8/CC/6C/D8` 都能由"修正参数 + 每帧均值温度"得到(默认参数见 §2 实测值)。
**仍然待定的一项**:`dev+0x54 / 0x58 / 0x5C / 0x60`(两组传感器温度对)的来源。
已知:`0x58 = 0x54 − 500`、`0x60 = 0x5C − 500`(500 = 记录的 `rec+0x34 − rec+0x38`),
且 `0x54` 在一段采集里保持不变、`0x5C` 缓慢上升(差值 0/30/89 mC)——
很像"上次 FFC 时的 FPA 温度"与"当前 FPA 温度"。实验方法(下轮):
读 SDK 设备对象里的**帧解析缓冲**(`*(void**)(dev+0x2d20)` 指向 28B 头 + payload + 28B 尾),
把 `0x5C/0x54` 与帧头/帧尾各字段逐帧做相关性 → 直接确定它们来自帧的哪个字节。
(帧尾 `+8` = FPA 温度已经由我们的 NUC 逐位吻合实验证明 = `dev+0x54`。)
## 4f. 第六轮:最后一项也定位了 —— `dev+0x5C = dev+0x54 + fpaTempFix`
多次采样发现 `dev+0x5C − dev+0x54 ∈ {0, 30}` 且 `dev+0x54` 恒定(= 帧尾 FPA 温度,
已由 NUC 逐位吻合实验证明),`dev+0x58 = dev+0x54 − 500`、`dev+0x60 = dev+0x5C − 500`。
代入环境补偿公式:
```
v45 = dev54 + rec38 − rec34 = dev54 − 500
v47 = clamp(v45 − dev58, −5000, 1000) = clamp(0) = 0
v50 = dev58 + 2*(dev5C − dev54) − dev60 + v47
= (dev54 − 500) + 2*fix − (dev54 + fix − 500) + 0
= fix
```
→ **`v50 = fpaTempFix`**(`BasePara2.fpaTempFix`,设备上报的 FPA 温度修正,本机 30 mC),
与实测的 v50 = 30/60/89 完全一致(0x5C−0x54 的跳变就是 fpaTempFix 的变化)。
### 结论:温度链的**全部输入**都已定位,App 侧数据源如下
| 输入 | 来源(App 可直接拿) |
|---|---|
| 曲线 A(646 项) | `OfficialTables.T2E`(**与官方模块逐项相等,已验证**) |
| 斜率表 S | 现算 `(0x1000000 + Δ/2)/Δ`(官方也是运行时算的,645/645 吻合) |
| 波段记录(阈值/gain/offset/shift/±500 温度对/eps/19790/44930) | **DDT 尾部**(§4d 偏移表) |
| `dev+0x54` | 帧尾 `+8` 的 FPA 温度(= 管线已有 `shutter`) |
| `dev+0xA4` / `dev+0xA8` | **BasePara2.ATZeroErrorPoint / ATErrorSlope**(66c 已收到,需解析) |
| `v50` | **BasePara2.fpaTempFix** |
| `dev+0x44CB8`、`dev+0xD8` | 当帧均值温度(= `band_map(s_mean)` + 环境项,可自算);`0xD8` = 它/1000 |
| `dev+0xD0..0xFB`(修正参数) | 发射率 0.98、环境温度(默认=场景均值)、距离/湿度默认值;`dev+0xF4` 由 `FUN_180014fe0` 计算(本机 0.99991,**≈1 时对温度影响 <1 mC,可先取 1.0**) |
| `dev+0xCC/0x6C/0x64` | 开关(本机 2 / 1 / 1) |
→ **落地 Kotlin 已无未知项**:按 §4d 伪代码实现 + 解析 DDT 尾部 + 解析 BasePara2
(`ATErrorSlope`/`ATZeroErrorPoint`/`fpaTempFix`),用 15 帧官方同帧数据回归(目标 ≤20 mC)。
## 5. 我们 App 侧要改什么(等模型钉死后再动手)
1. `TempMath` 增加"官方放射学分支"实现:波段映射(参数取自 DDT 尾部)+ §3 修正;