完整审计:0x18000ca30 调用链实现对照表 + 全链路复验

- 审计 0xca30 全链:核心渲染(统计/窗口/LUT/gray/2x/FFC/ref/表重建)全部等价实现
- 补帧首标志清零(0x4203c/40/44/04)
- 对照表写入 reverse_20260813_full.md §8.1
- 复验(pairs_ctrl/pairs_final2 新数据):
  - NUC+blind 0/19200、窗口一致、gray+2x 0/76800(离线)
  - LUT 形态同构([500]=41 vs 40, [900]=242 vs 242)
  - 实机同场景 gray 直方图相关性 0.966
  - 零像素两边均为 0
- 未移植主体(官方当前全关,等价):0x230 帧差、0x41fe8 隔行平滑、
  0x30 gray 覆盖路径、多比例升采样
This commit is contained in:
ZXCLI
2026-08-14 16:41:50 +08:00
parent fe91a82762
commit 51c8ba9174
174 changed files with 480 additions and 192 deletions
+137 -191
View File
@@ -1,236 +1,182 @@
# MAG160C 官方管线完整逆向结果(Ghidra 全量,2026-08-13
> 本文档记录 CoreSDKLib.dll 官方渲染管线的完整反编译结论、逐像素验证结果,
> 以及 demo3 旧版"鬼影"问题的根因分析。所有结论均有 Ghidra 反编译代码和
> 官方活体抓帧数据的双重证据,不是推测。
>
> 工具链:Ghidra 12.1.2headless 批处理反编译)+ IDA Free 8.4(交互确认)。
> 反编译产物:`analysis/ida/export/ghidra_dump/`keyfuncs / callers / exports)。
# MAG160C 瀹樻柟绠$嚎瀹屾暣閫嗗悜缁撴灉锛圙hidra 鍏ㄩ噺锛?026-08-13锛?
> 鏈枃妗h褰?CoreSDKLib.dll 瀹樻柟娓叉煋绠$嚎鐨勫畬鏁村弽缂栬瘧缁撹銆侀€愬儚绱犻獙璇佺粨鏋滐紝
> 浠ュ強 demo3 鏃х増"楝煎奖"闂鐨勬牴鍥犲垎鏋愩€傛墍鏈夌粨璁哄潎鏈?Ghidra 鍙嶇紪璇戜唬鐮佸拰
> 瀹樻柟娲讳綋鎶撳抚鏁版嵁鐨勫弻閲嶈瘉鎹紝涓嶆槸鎺ㄦ祴銆?>
> 宸ュ叿閾撅細Ghidra 12.1.2锛坔eadless 鎵瑰鐞嗗弽缂栬瘧锛? IDA Free 8.4锛堜氦浜掔‘璁わ級銆?> 鍙嶇紪璇戜骇鐗╋細`analysis/ida/export/ghidra_dump/`锛坘eyfuncs / callers / exports锛夈€?
---
## 1. 官方管线(Ghidra 反编译确认)
## 1. 瀹樻柟绠$嚎锛圙hidra 鍙嶇紪璇戠‘璁わ級
```
USB (type=0, 0x1bb1b11b 标记)
→ 帧解析器 0x18001d930
验证: [0x08]=len, [0x1c+len]=0x1bb1b11c, type∈{0,1}
快门: width=160 时 = 帧尾字 frame[len+0x24]
metadata 0x4c 字节: {0, counter, len, 1, 0, w, dev54, 8, 0, -50000,
USB 甯?(type=0, 0x1bb1b11b 鏍囪)
鈫?甯цВ鏋愬櫒 0x18001d930
楠岃瘉: [0x08]=len, [0x1c+len]=0x1bb1b11c, type鈭坽0,1}
蹇棬: width=160 鏃?= 甯у熬瀛?frame[len+0x24]
metadata 0x4c 瀛楄妭: {0, counter, len, 1, 0, w, dev54, 8, 0, -50000,
shutter-500, shutter, 0, 0, type, 0, 0}
→ 帧调度 0x180009ee0FFC 状态机 + ref/表重建时序, 见 §3
→ 主渲染 0x18000ca30
→ 0x18000c950: f20 平滑器 0x41f10 (mode=1: 直通) → NUC
→ NUC 查表 0x180017200:
鈫?甯ц皟搴?0x180009ee0锛團FC 鐘舵€佹満 + ref/琛ㄩ噸寤烘椂搴? 瑙?搂3锛? 鈫?涓绘覆鏌?0x18000ca30
鈫?0x18000c950: f20 骞虫粦鍣?0x41f10 (mode=1: 鐩撮€? 鈫?NUC
鈫?NUC 鏌ヨ〃 0x180017200:
d2 = (f20[i] - ref[i]) >> 1
seg: 每像素 (nsegs-1) signed 阈值顺序比较
out = off + ((gain * d2) >> shift), shift=0x11c=12
seg: 姣忓儚绱?(nsegs-1) 涓?signed 闃堝€奸『搴忔瘮杈? out = off + ((gain * d2) >> shift), shift=0x11c=12
clamp [0, 65535]
→ 盲元补偿 0x180017330:
固定记录表 dev+0x41878, 数量 dev+0x41654[sel]
每条 40 字节: {u32 target, u32 type(3..8=邻域数), u32 neigh[8]}
out[target] = mean(neigh) (type 8/4 用移位, 其余用除法)
temporal filter 0x18001e920: dev+0x41fe0>1 时启用, 当前=1 跳过
→ 统计 0x180010780: min/max/mean/std dev+0x42010..0x42024
→ 窗口 0x1800109c0 + 半宽 0x1800108a0:
鈫?鐩插厓琛ュ伩 0x180017330:
鍥哄畾璁板綍琛?dev+0x41878, 鏁伴噺 dev+0x41654[sel]
姣忔潯 40 瀛楄妭: {u32 target, u32 type(3..8=閭诲煙鏁?, u32 neigh[8]}
out[target] = mean(neigh) (type 8/4 鐢ㄧЩ浣? 鍏朵綑鐢ㄩ櫎娉?
鈫?temporal filter 0x18001e920: 浠?dev+0x41fe0>1 鏃跺惎鐢? 褰撳墠=1 璺宠繃
鈫?缁熻 0x180010780: min/max/mean/std 鈫?dev+0x42010..0x42024
鈫?绐楀彛 0x1800109c0 + 鍗婂 0x1800108a0:
half = max(128, dev24*1000 >> dev4c_shift) / 2 (live: 5*1000>>3 /2 = 312)
lo = min(fmin, mean-half) >= 0
hi = max(fmax, mean+half) <= 65535
LUT1024 重建 0x180011950 + 0x180011ee0(直方图均衡, 见 §5
→ 灰度: gray = LUT[(nuc-lo) * 0xffc00000/(hi-lo) >> 22]
→ 2x 升采样 0x1800197402-tap 双线性 + 边缘外推, 见 §6)
→ 调色板 dev+0xb18 (256×4 BGR)
鈫?LUT1024 閲嶅缓 0x180011950 + 0x180011ee0锛堢洿鏂瑰浘鍧囪 , 瑙?搂5锛? 鈫?鐏板害: gray = LUT[(nuc-lo) * 0xffc00000/(hi-lo) >> 22]
鈫?2x 鍗囬噰鏍?0x180019740锛?-tap 鍙岀嚎鎬?+ 杈圭紭澶栨帹, 瑙?搂6锛? 鈫?璋冭壊鏉?dev+0xb18 (256脳4 BGR)
```
## 2. DDT 校准文件(表的数据源)
- 位置:`%TEMP%\Core<序列号>`(无扩展名),由 app 用 MAG_SaveDDT 保存、
MAG_StartProcessImage → 0x18000f130 在启动时加载;文件路径存 dev+0x4134c。
- 本机文件已复制:`build-artifacts/mag160c_official.ddt`1,856,416 字节,v3)。
## 2. DDT 鏍″噯鏂囦欢锛堣〃鐨勬暟鎹簮锛?
- 浣嶇疆锛歚%TEMP%\Core<搴忓垪鍙?`锛堟棤鎵╁睍鍚嶏級锛岀敱 app 鐢?MAG_SaveDDT 淇濆瓨銆? MAG_StartProcessImage 鈫?0x18000f130 鍦ㄥ惎鍔ㄦ椂鍔犺浇锛涙枃浠惰矾寰勫瓨 dev+0x4134c銆?- 鏈満鏂囦欢宸插鍒讹細`build-artifacts/mag160c_official.ddt`锛?,856,416 瀛楄妭锛寁3锛夈€?
```
v3 格式 (magic 0x5aa50003):
v3 鏍煎紡 (magic 0x5aa50003):
+0 u32 magic
+4 u32 width (160)
+8 u32 height (120)
+12 u32 端点数量 (0x41558, live=6)
+12 u32 绔偣鏁伴噺 (0x41558, live=6)
+16 u32 nsegs (0x41554, live=3)
+20 u32 0x47944 (8, 2 的幂)
+20 u32 0x47944 (8, 2 鐨勫箓)
+24 u32 0x47948 (-50000)
+28 u32 0x4155c (1024)
+32 u32 0x41560 (0)
+36 i32 T[count] 端点温度: [8304, 18390, 28495, 33637, 38730, 47664]
+.. u32 0x415b4[count] (偏移基准)
+36 i32 T[count] 绔偣娓╁害: [8304, 18390, 28495, 33637, 38730, 47664]
+.. u32 0x415b4[count] (鍋忕Щ鍩哄噯)
+.. u32 0x41604[count]
+.. u32 0x41654[count-1] 每端点盲元记录数 (live: 32×5)
+128 端点表块 × count:
thr (nsegs-1)*npix + 0x4155c/2 int16 (像素主序)
gain nsegs*npix*2 uint16 (seg 主序: [seg][pix].gain/.off)
+.. 盲元记录 × count (每端点 40 字节 × 数量)
+.. u32 0x41654[count-1] 姣忕鐐圭洸鍏冭褰曟暟 (live: 325)
+128 绔偣琛ㄥ潡 脳 count:
thr (nsegs-1)*npix + 0x4155c/2 涓?int16 (鍍忕礌涓诲簭)
gain nsegs*npix*2 涓?uint16 (seg 涓诲簭: [seg][pix].gain/.off)
+.. 鐩插厓璁板綍 脳 count (姣忕鐐?40 瀛楄妭 脳 鏁伴噺)
+.. trailer: 0x6bb60001, "lens f6.5"
```
## 3. 端点选择 + 表插值 + ref 时序(0x180009ee0 / 0x180016ae0
### 3.1 快门温度 = 设备温度代理
- 快门 = 帧尾字(width=160 时 frame[len+0x24]),每帧进入 metadata。
- dev+0x5c = 当前快门,dev+0x54 = 上次 FFC(0) 时的快门。
- FFC 条件:`idx >= N0+1800`(周期)或 `(|dev54 - 快门累加| > 250 && idx >= 冷却)`
### 3.2 端点选择(实测验证)
## 3. 绔偣閫夋嫨 + 琛ㄦ彃鍊?+ ref 鏃跺簭锛?x180009ee0 / 0x180016ae0锛?
### 3.1 蹇棬娓╁害 = 璁惧娓╁害浠g悊
- 蹇棬 = 甯у熬瀛楋紙width=160 鏃?frame[len+0x24]锛夛紝姣忓抚杩涘叆 metadata銆?- dev+0x5c = 褰撳墠蹇棬锛宒ev+0x54 = 涓婃 FFC(0) 鏃剁殑蹇棬銆?- FFC 鏉′欢锛歚idx >= N0+1800`锛堝懆鏈燂級鎴?`(|dev54 - 蹇棬绱姞| > 250 && idx >= 鍐峰嵈)`銆?
### 3.2 绔偣閫夋嫨锛堝疄娴嬮獙璇侊級
```
sel = 0
while (sel < count-2 && 快门 > T[sel+1]) sel++
while (sel < count-2 && 蹇棬 > T[sel+1]) sel++
```
live 实测:快门 29289 sel=2T[2]=28495 < 29289 T[3]=33637)✓
live 瀹炴祴锛氬揩闂?29289 鈫?sel=2锛圱[2]=28495 < 29289 鈮?T[3]=33637锛夆湏
### 3.3 Q12 插值(0x180016dd0 / 0x180016f10
```
t = ((快门 - T[sel]) << 12) / (T[sel+1] - T[sel]) clamp ±0x3fff
### 3.3 Q12 鎻掑€硷紙0x180016dd0 / 0x180016f10锛?```
t = ((蹇棬 - T[sel]) << 12) / (T[sel+1] - T[sel]) clamp 卤0x3fff
work[i] = a[i] + ((b[i] - a[i]) * t >> 12)
```
验证:阈值 0/38400 误差,gain 0/115200 误差。
### 3.4 ref 采集时序(关键!)
```
FFC(0) 后帧计数复位:
idx 1..5 : 表重建(分块)
idx 6..9 : 采集 ref —— 4 个 type=1 校准帧的均值(累加 >> 2)
(idx 6 复位平滑器,idx 9 发 FFC(1)
idx 10..13 : 表重建
idx 14+ : 正常渲染(ref 冻结,直到下次 FFC)
```
- **ref = 4 个 type=1 帧的均值**,不是场景帧!
- type=1 帧均值实测 ~15000-16300type=0 场景帧 ~11700-13700
因此官方 d = f20 - ref ≈ **-2200 ~ -2700,恒 ≤ 0**。
- ref 在每次 FFC 对之后重新采集;FFC 之间完全冻结。
## 4. 逐像素验证(官方抓帧 vs 反推重建)
用官方同帧抓帧(`analysis/pairs_verify_20260813/`+ DDT 离线复算:
| 环节 | 结果 |
楠岃瘉锛氶槇鍊?0/38400 璇樊锛実ain 0/115200 璇樊銆?
### 3.4 ref 閲囬泦鏃跺簭锛堝叧閿紒锛?```
FFC(0) 鍚庡抚璁℃暟澶嶄綅:
idx 1..5 : 琛ㄩ噸寤猴紙鍒嗗潡锛? idx 6..9 : 閲囬泦 ref 鈥斺€?4 涓?type=1 鏍″噯甯х殑鍧囧€硷紙绱姞 >> 2锛? 锛坕dx 6 澶嶄綅骞虫粦鍣紝idx 9 鍙?FFC(1)锛? idx 10..13 : 琛ㄩ噸寤? idx 14+ : 姝e父娓叉煋锛坮ef 鍐荤粨锛岀洿鍒颁笅娆?FFC锛?```
- **ref = 4 涓?type=1 甯х殑鍧囧€?*锛屼笉鏄満鏅抚锛?- type=1 甯у潎鍊煎疄娴?~15000-16300锛宼ype=0 鍦烘櫙甯?~11700-13700锛? 鍥犳瀹樻柟 d = f20 - ref 鈮?**-2200 ~ -2700锛屾亽 鈮?0**銆?- ref 鍦ㄦ瘡娆?FFC 瀵逛箣鍚庨噸鏂伴噰闆嗭紱FFC 涔嬮棿瀹屽叏鍐荤粨銆?
## 4. 閫愬儚绱犻獙璇侊紙瀹樻柟鎶撳抚 vs 鍙嶆帹閲嶅缓锛?
鐢ㄥ畼鏂瑰悓甯ф姄甯э紙`analysis/pairs_verify_20260813/`锛? DDT 绂荤嚎澶嶇畻锛?
| 鐜妭 | 缁撴灉 |
|---|---|
| 阈值插值 (t 由快门算) | diff 0/38400 |
| gain/off 插值 | diff 0/115200 |
| NUC 查表 | diff 30/19200MAE 0.118|
| NUC + 盲元补偿 | **diff 0/19200MAE 0.0000** |
| 窗口 [lo,hi] | 与官方完全一致 |
| 灰度 (LUT+idx) | 160 19200/19200 |
| 2x 升采样 | **diff 0/76800** |
| demo3 C 实现离线复算官方数据 | NUC/窗口/灰度全部 0 误差 |
| 闃堝€兼彃鍊?(t 鐢卞揩闂ㄧ畻) | diff 0/38400 |
| gain/off 鎻掑€?| diff 0/115200 |
| NUC 鏌ヨ〃 | diff 30/19200锛圡AE 0.118锛墊
| NUC + 鐩插厓琛ュ伩 | **diff 0/19200锛圡AE 0.0000锛?* |
| 绐楀彛 [lo,hi] | 涓庡畼鏂瑰畬鍏ㄤ竴鑷?|
| 鐏板害 (LUT+idx) | 160 灞?19200/19200 |
| 2x 鍗囬噰鏍?| **diff 0/76800** |
| demo3 C 瀹炵幇绂荤嚎澶嶇畻瀹樻柟鏁版嵁 | NUC/绐楀彛/鐏板害鍏ㄩ儴 0 璇樊 |
LUT 填充公式:在正确 center 834/1024 精确,其余 ±1~±58
跨帧捕获偏差(h1024/cdf/lut 不同帧)+ center 时域平滑所致。
LUT 濉厖鍏紡锛氬湪姝g‘ center 涓?834/1024 绮剧‘锛屽叾浣?卤1~58 涓?璺ㄥ抚鎹曡幏鍋忓樊锛坔1024/cdf/lut 涓嶅悓甯э級+ center 鏃跺煙骞虫粦鎵€鑷淬€?
## 5. LUT1024 閲嶅缓绠楁硶锛?x180011950 + 0x180011ee0锛?
1. 1024-bin 鐩存柟鍥撅細bin = ((nuc-lo) * 0xffc00000/(hi-lo)) >> 22锛坲32 绠楁湳锛?2. 3-tap 灏卞湴骞虫粦锛坆in 0..1022锛?3. **0x8c 鍒嗘敮锛坙ive=1锛?*锛氭壘骞虫粦鍚庣洿鏂瑰浘绱 >= 鎬昏鏁懊?/4 鐨勭涓€涓?bin锛? CDF 涓績 = max(鍧囧€糱in, 璇in)锛堝疄娴?545 鈫?631锛屽畼鏂?633锛岃法甯у樊 2锛?4. 鍙屽悜 CDF锛堜粠涓績鍚戜袱渚х疮绉級锛? - 鍚戜笅锛氭瘡绱Н u21(=total>>12) 涓鏁?+0x100
- 鍚戜笂锛?8*u21 鏃舵瘡 u21 涓?+0x100锛?=8*u21 鏃舵瘡 bin +0x200
5. 瀵规瘮搴︽洸绾?curve[k] = max(1, (0x300000 + k*0x800)>>13)
6. 涓績鍊间簩鍒嗘悳绱紙fmin/fmax 瀵瑰簲 LUT 绔害鏉燂級
7. center 鏃跺煙骞虫粦 + 閲嶅~
## 5. LUT1024 重建算法(0x180011950 + 0x180011ee0
1. 1024-bin 直方图:bin = ((nuc-lo) * 0xffc00000/(hi-lo)) >> 22u32 算术)
2. 3-tap 就地平滑(bin 0..1022
3. **0x8c 分支(live=1**:找平滑后直方图累计 >= 总计数×3/4 的第一个 bin
CDF 中心 = max(均值bin, 该bin)(实测 545 → 631,官方 633,跨帧差 2)
4. 双向 CDF(从中心向两侧累积):
- 向下:每累积 u21(=total>>12) 个计数 +0x100
- 向上:<8*u21 时每 u21 个 +0x100>=8*u21 时每 bin +0x200
5. 对比度曲线 curve[k] = max(1, (0x300000 + k*0x800)>>13)
6. 中心值二分搜索(fmin/fmax 对应 LUT 端约束)
7. center 时域平滑 + 重填
验证:用官方同帧 cdf + 中心搜索,LUT 123/1024 差异,全部集中在 lres 上方
灰度过渡区(±1-7 级),来源是官方 SDK 抓帧的跨帧异步(cdf/lut 不同帧),
非算法差异。官方会话实测启用路径 = 0x109c0 → 0x11ee0 → 0x19740
temporal(0x41fe0=1)/帧差(0x230=0)/隔行平滑(0x41fe8=0)/0x30 gray 路径(0x30=0)
全部关闭,demo3 默认一致,temporal 已移植作备用开关。
## 6. 2x 升采样(0x180019740,逐像素验证)
楠岃瘉锛氱敤瀹樻柟鍚屽抚 cdf + 涓績鎼滅储锛孡UT 123/1024 宸紓锛屽叏閮ㄩ泦涓湪 lres 涓婃柟
鐏板害杩囨浮鍖猴紙卤1-7 绾э級锛屾潵婧愭槸瀹樻柟 SDK 鎶撳抚鐨勮法甯у紓姝ワ紙cdf/lut 涓嶅悓甯э級锛?闈炵畻娉曞樊寮傘€傚畼鏂逛細璇濆疄娴嬪惎鐢ㄨ矾寰?= 0x109c0 鈫?0x11ee0 鈫?0x19740锛?temporal(0x41fe0=1)/甯у樊(0x230=0)/闅旇骞虫粦(0x41fe8=0)/0x30 gray 璺緞(0x30=0)
鍏ㄩ儴鍏抽棴锛宒emo3 榛樿涓€鑷达紝temporal 宸茬Щ妞嶄綔澶囩敤寮€鍏炽€?
## 6. 2x 鍗囬噰鏍凤紙0x180019740锛岄€愬儚绱犻獙璇侊級
```
内部: out[2y][2x]=a out[2y][2x+1]=(a+b)>>1 out[2y][2x+2]=b out[2y][2x+3]=(c+b)>>1
鍐呴儴: out[2y][2x]=a out[2y][2x+1]=(a+b)>>1 out[2y][2x+2]=b out[2y][2x+3]=(c+b)>>1
out[2y+1][2x]=(d+a)>>1 out[2y+1][2x+1]=(d+e+a+b)>>2
out[2y+1][2x+2]=(e+b)>>1 out[2y+1][2x+3]=(f+e+c+b)>>2
右缘: out[2y][2W-1] = (3a>>2)+(l>>2)(外推)
底缘: out[2H-1][2x] = (3a>>2)+(u>>2)
角落: (3a+l)>>2 / (3a+u)>>2 / 三者均值
```
鍙崇紭: out[2y][2W-1] = (3a>>2)+(l>>2)锛堝鎺級
搴曠紭: out[2H-1][2x] = (3a>>2)+(u>>2)
瑙掕惤: (3a+l)>>2 / (3a+u)>>2 / 涓夎€呭潎鍊?```
## 7. 鬼影根因分析(为什么旧 demo3 有鬼影)
## 7. 楝煎奖鏍瑰洜鍒嗘瀽锛堜负浠€涔堟棫 demo3 鏈夐褰憋級
demo3(v4,SBNUC 版)与官方的差异,每一条都有上面的证据:
### 7.1 ref 语义完全不同(最根本)
| | 官方 | 旧 demo3 |
鏃?demo3锛坴4锛孲BNUC 鐗堬級涓庡畼鏂圭殑宸紓锛屾瘡涓€鏉¢兘鏈変笂闈㈢殑璇佹嵁锛?
### 7.1 ref 璇箟瀹屽叏涓嶅悓锛堟渶鏍规湰锛?| | 瀹樻柟 | 鏃?demo3 |
|---|---|---|
| ref 来源 | FFC 窗口 4 **type=1 校准帧**均值 | 启动场景 12 帧中值 |
| ref 值域 | 场景 + ~2200 counts(d 恒负)| ≈ 场景(d ≈ 0)|
| 刷新时机 | **每次 FFC 对之后** | 仅启动一次(FFC 后只 rebase 全局偏置)|
| FFC 之间 | 冻结 | 冻结 + SBNUC 自愈 |
| ref 鏉ユ簮 | FFC 绐楀彛 4 涓?**type=1 鏍″噯甯?*鍧囧€?| 鍚姩鍦烘櫙 12 甯т腑鍊?|
| ref 鍊煎煙 | 鍦烘櫙 + ~2200 counts锛坉 鎭掕礋锛墊 鈮?鍦烘櫙锛坉 鈮?0锛墊
| 鍒锋柊鏃舵満 | **姣忔 FFC 瀵逛箣鍚?* | 浠呭惎鍔ㄤ竴娆★紙FFC 鍚庡彧 rebase 鍏ㄥ眬鍋忕疆锛墊
| FFC 涔嬮棿 | 鍐荤粨 | 鍐荤粨 + SBNUC 鑷剤 |
后果:
- 官方 NUC 输出 ≈ 9800(off 段配合 d 恒负),旧 demo3 输出 ≈ 10900+d≈0),
两者对同一场景的画面等级都不同,更谈不上残影行为一致。
- 旧 demo3 启动采集一次 ref 后永不刷新 → 场景基线漂移(如设备升温、
环境温度变化)后 ref 失配 → 旧位置出现"黑洞/黑拖影",且只能等手动 FFC。
- 官方每次 FFC 重采 ref → 残影最多持续到下次 FFC(周期 120s 或快门漂移 250 触发),
且表也按新快门重建,匹配始终成立。
鍚庢灉锛?- 瀹樻柟 NUC 杈撳嚭 鈮?9800锛坥ff 娈甸厤鍚?d 鎭掕礋锛夛紝鏃?demo3 杈撳嚭 鈮?10900+锛坉鈮?锛夛紝
涓よ€呭鍚屼竴鍦烘櫙鐨勭敾闈㈢瓑绾ч兘涓嶅悓锛屾洿璋堜笉涓婃畫褰辫涓轰竴鑷淬€?- 鏃?demo3 鍚姩閲囬泦涓€娆?ref 鍚庢案涓嶅埛鏂?鈫?鍦烘櫙鍩虹嚎婕傜Щ锛堝璁惧鍗囨俯銆? 鐜娓╁害鍙樺寲锛夊悗 ref 澶遍厤 鈫?鏃т綅缃嚭鐜?榛戞礊/榛戞嫋褰?锛屼笖鍙兘绛夋墜鍔?FFC銆?- 瀹樻柟姣忔 FFC 閲嶉噰 ref 鈫?娈嬪奖鏈€澶氭寔缁埌涓嬫 FFC锛堝懆鏈?120s 鎴栧揩闂ㄦ紓绉?250 瑙﹀彂锛夛紝
涓旇〃涔熸寜鏂板揩闂ㄩ噸寤猴紝鍖归厤濮嬬粓鎴愮珛銆?
### 7.2 NUC 琛ㄤ笉鏄潤鎬佺殑
- 瀹樻柟锛氳〃 = DDT 绔偣鎸夊揩闂ㄦ俯搴?Q12 鎻掑€硷紝FFC 鍚庨噸寤恒€?- 鏃?demo3锛氶潤鎬佹姄鍙栬〃锛堟煇娆′細璇濈殑鎻掑€肩粨鏋滐級锛屾俯搴︽紓绉诲悗澶遍厤锛? 琛ㄧ幇涓?灏忔俯宸畫褰辨摝闄ゆ參"鈥斺€旀湰璐ㄦ槸琛ㄤ笌褰撳墠娓╁害涓嶅尮閰嶉€犳垚鐨勬畫宸紝
涓嶆槸鐪熸鐨勬樉绀哄眰楝煎奖銆?
### 7.3 SBNUC 鏄潪瀹樻柟 hack锛屽紩鍏ユ绾ч褰?- 鏃?demo3 鐨?鏇剧儹鍙樺喎蹇€熷惛鏀?浣庢俯闈欐涓嶅惛鏀?鐘舵€佹満锛屼細鎶婁綆娓╃墿浣? 鎺掗櫎鍦?ref 涔嬪 鈫?鐗╀綋绂诲紑鍚庣暀涓嬩寒娈嬪奖锛涙妸鏇剧儹鍍忕礌鍐欏洖 ref 鈫? 鏀瑰彉灞€閮ㄥ熀绾?鈫?鏂伴粦娲炪€?- 瀹樻柟娌℃湁 SBNUC锛歳ef 鍐荤粨 + 瀹氭湡 FFC 鍒锋柊鏄畼鏂瑰敮涓€鐨?鍘婚褰?鏈哄埗銆?
### 7.4 鐩插厓琛ュ伩缂哄け
- 瀹樻柟鏈?32 鏉″浐瀹氱洸鍏冭褰曪紙閭诲煙骞冲潎锛夛紝鏃?demo3 瀹屽叏娌℃帴 鈫?姝诲儚绱? 鐩存帴鏄剧ず锛? 鍊奸粦鐐癸級锛屾浘鐢ㄥ姩鎬?badmap 灏濊瘯 鈫?鍙嶈€屾妸鍦烘櫙缁撴瀯閽夊湪
灞忓箷鍧愭爣锛圔ADMAP_ENABLE=0 鍚庢畫鐣欓粦鐐癸級銆?
### 7.5 绐楀彛/鐏板害宸紓
- 瀹樻柟绐楀彛 = [min(fmin, mean-312), max(fmax, mean+312)]锛? 鏃?demo3 鐢?P2..P98 鑷€傚簲 鈫?瀵规瘮搴﹁涓轰笉鍚岋紝浣嗕笉鏄褰变富鍥犮€?
### 7.6 缁撹
鏃?demo3 鐨?楝煎奖"鏄?ref 璇箟閿欒 + ref/琛ㄤ笉闅?FFC 鍒锋柊 + 闈欐€佽〃 +
闈炲畼鏂?SBNUC 鍏卞悓閫犳垚鐨勶紝涓庡畼鏂?鍐荤粨 ref 鐨勮交寰棫浣嶇疆鍋忔殫"涓嶆槸
鍚屼竴涓幇璞°€備慨澶?= 瀹屾暣澶嶅埢瀹樻柟绠$嚎锛坉emo3 v5 宸插疄鐜帮紝瑙佷笅锛夈€?
## 8. demo3 v5锛堝畼鏂瑰鍒伙級瀹炵幇鐘舵€?
### 8.1 瀹樻柟 0x18000ca30 璋冪敤閾惧疄鐜板鐓ц〃锛?026-08-14 瀹¤锛?
| 瀹樻柟鐜妭 | 鎺у埗瀛楁(live) | demo3 | 璇存槑 |
|---|---|---|---|
| 甯ч鏍囧織娓呴浂 0x4203c/40/44/04 | 鈥?| 鉁?| 宸茶ˉ |
| c950: f20 骞虫粦(mode=1 鐩撮€?+NUC+blind | 41fdc=1 | 鉁?| NUC+blind 0/19200 璇樊 |
| temporal 0x18001e920 | 41fe0=1(鍏? | 鉁?宸茬Щ妞?| 0x41fe0>1 鍚敤锛岄粯璁ゅ叧=瀹樻柟 |
| 甯у樊璋冩暣 0x1800175a0 | 230=0(鍏? | 猬?鏈Щ妞嶄富浣?| 瀹樻柟鍏筹紝绛変环 |
| 闅旇骞虫粦 0x1800184f0/660 | 41fe8=0(鍏? | 猬?鏈Щ妞嶄富浣?| 瀹樻柟鍏筹紝绛変环 |
| 缁熻 0x180010780 | 鈥?| 鉁?| min/max/mean/std 涓€鑷?|
| 绐楀彛+LUT+gray 0x1800109c0/0x11ee0 | 90=0, 8c=1 | 鉁?| 鍚?0x8c 75% 涓績銆乽niform 鍒嗘敮 |
| 0x30 gray 瑕嗙洊璺緞 0x180017770/0x17c40 | 30=0(鍏? | 猬?鏈Щ妞嶄富浣?| 瀹樻柟鍏筹紝绛変环 |
| 鍗囬噰鏍?0x19xxx | 2x | 鉁?2x | 4x/8x/1.5x 鏈Щ妞嶏紙褰撳墠 2x锛墊
| 娓╁害鎹㈢畻 0x18000d2a0 | 鈥?| 鉁?counts_to_c | 鎺㈤拡/鏈€楂樻俯鏄剧ず |
| FFC 鐘舵€佹満 0x180009ee0 | 鈥?| 鉁?| 鍛ㄦ湡1800/婕傜Щ250/甯?5寮哄埗 |
| ref 骞虫粦鍣?0x1800011a0(mode=4) | 41fdc=1 | 鉁?| 4脳type1 甯у潎鍊?|
| 琛ㄩ噸寤?0x18000c760/16ae0/dd0/f10 | 鈥?| 鉁?| 蹇棬椹卞姩绔偣+Q12 |
| 绗簩骞虫粦鍣?0x41f90 | 41fbc=1 | 猬?鏃犺皟鐢?| 瀹樻柟鏃犳覆鏌撹皟鐢紝绛変环 |
### 7.2 NUC 表不是静态的
- 官方:表 = DDT 端点按快门温度 Q12 插值,FFC 后重建。
- 旧 demo3:静态抓取表(某次会话的插值结果),温度漂移后失配,
表现为"小温差残影擦除慢"——本质是表与当前温度不匹配造成的残差,
不是真正的显示层鬼影。
### 8.2 2026-08-14 瀹屾暣瀵规瘮缁撴灉锛坉emo3 vs 瀹樻柟鍚屽満鏅法浼氳瘽锛?
- NUC+鐩插厓锛?/19200 鍍忕礌璇樊锛堢绾匡紝瀹樻柟鍚屽抚鏁版嵁锛?- 绐楀彛/缁熻锛氬畬鍏ㄤ竴鑷达紙绂荤嚎锛?- gray+2x锛?/76800 鍍忕礌璇樊锛堢绾匡級
- LUT 缁撴瀯锛歞emo3 [500]=41 vs 瀹樻柟 40锛孾900]=242 vs 242锛堝舰鎬佸悓鏋勶級
- gray 鐩存柟鍥剧浉鍏虫€э細0.966锛堝疄鏈鸿法浼氳瘽锛?- 闆跺儚绱狅細涓よ竟鍧囦负 0
- 宸紓鏉ユ簮锛氫細璇濋棿 ref/蹇棬宸紓锛堝畼鏂圭墿鐞嗘満鍒讹級
### 7.3 SBNUC 是非官方 hack,引入次级鬼影
- 旧 demo3 的"曾热变冷快速吸收/低温静止不吸收"状态机,会把低温物体
排除在 ref 之外 → 物体离开后留下亮残影;把曾热像素写回 ref →
改变局部基线 → 新黑洞。
- 官方没有 SBNUC:ref 冻结 + 定期 FFC 刷新是官方唯一的"去鬼影"机制。
## 9. demo3 v5 杩愯渚濊禆涓庝骇鐗?
- DDT 鍔犺浇锛坴3 瑙f瀽锛屽惈绔偣琛?鐩插厓璁板綍锛?- 绔偣閫夋嫨 + Q12 鎻掑€硷紙蹇棬椹卞姩锛孎FC 鍚庨噸寤猴級
- ref = FFC 绐楀彛 4 涓?type=1 甯у潎鍊硷紙u32 绱姞鍣級
- NUC + 鐩插厓琛ュ伩锛?2 鏉″浐瀹氳褰曪級
- 绐楀彛/缁熻锛堝畼鏂瑰叕寮忥級
- LUT1024 閲嶅缓锛堢洿鏂瑰浘鍧囪  + center 骞虫粦锛?- 鐏板害 + 2x 鍗囬噰鏍?+ 瀹樻柟璋冭壊鏉?- FFC锛氬懆鏈?1800 / 蹇棬婕傜Щ 250 / 13 甯ч殣钘忓懆鏈?- 瀹炴満杩愯锛歴el=2銆丗FC 鑷姩瑙﹀彂姝e父銆佺敾闈㈢粺璁℃帴杩戝畼鏂? 锛坉emo3 mean 9377 vs 瀹樻柟 9640锛?
### 閬楃暀闂
1. ~~demo3 NUC 杈撳嚭鏈?2 涓浂鍍忕礌~~ **宸蹭慨澶嶏紙2026-08-13 鏅氾級**锛? 鏍瑰洜鏄?demo3 `load_ddt` 璇诲彇甯冨眬閿欒鈥斺€攂lind 璁板綍鍖哄湪鏂囦欢鎵€鏈夌鐐瑰潡涔嬪悗锛? 浠g爜鍗村湪姣忎釜绔偣鍧楀唴璇讳簡 blind锛屽鑷?EP1+ 琛ㄦ暣浣撻敊浣?1280 瀛楄妭銆? 閿欎綅琛ㄥ湪姝诲儚绱犲垪闄勮繎 seg0 gain=35321锛堝簲涓?~4000锛夛紝d2 韪╀腑鍚?NUC clamp 鍒?0銆? 淇鍚庡叏甯?0 涓浂鍍忕礌锛?65,25) nuc=9814锛実ain=4000 姝e父鍊笺€?2. LUT 閲嶅缓鐨勮法甯т竴鑷存€э細绠楁硶宸叉寜鍙嶇紪璇戝疄鐜板苟瀹炴満杩愯锛屽悓鍦烘櫙 gray 鐩存柟鍥? 涓庡畼鏂圭浉鍏虫€?0.9197锛堣法浼氳瘽锛夛紝鍓╀綑宸紓鏉ヨ嚜浼氳瘽闂?ref/蹇棬娓╁害宸紓锛? 灞炲畼鏂圭墿鐞嗘満鍒讹紝涓嶆槸 bug銆?
## 10. 鍏抽敭鏂囦欢
### 7.4 盲元补偿缺失
- 官方有 32 条固定盲元记录(邻域平均),旧 demo3 完全没接 → 死像素
直接显示(0 值黑点),曾用动态 badmap 尝试 → 反而把场景结构钉在
屏幕坐标(BADMAP_ENABLE=0 后残留黑点)。
### 7.5 窗口/灰度差异
- 官方窗口 = [min(fmin, mean-312), max(fmax, mean+312)]
旧 demo3 用 P2..P98 自适应 → 对比度行为不同,但不是鬼影主因。
### 7.6 结论
旧 demo3 的"鬼影"是 ref 语义错误 + ref/表不随 FFC 刷新 + 静态表 +
非官方 SBNUC 共同造成的,与官方"冻结 ref 的轻微旧位置偏暗"不是
同一个现象。修复 = 完整复刻官方管线(demo3 v5 已实现,见下)。
## 8. demo3 v5(官方复刻)实现状态
- DDT 加载(v3 解析,含端点表/盲元记录)
- 端点选择 + Q12 插值(快门驱动,FFC 后重建)
- ref = FFC 窗口 4 个 type=1 帧均值(u32 累加器)
- NUC + 盲元补偿(32 条固定记录)
- 窗口/统计(官方公式)
- LUT1024 重建(直方图均衡 + center 平滑)
- 灰度 + 2x 升采样 + 官方调色板
- FFC:周期 1800 / 快门漂移 250 / 13 帧隐藏周期
- 实机运行:sel=2、FFC 自动触发正常、画面统计接近官方
demo3 mean 9377 vs 官方 9640
### 遗留问题
1. ~~demo3 NUC 输出有 2 个零像素~~ **已修复(2026-08-13 晚)**
根因是 demo3 `load_ddt` 读取布局错误——blind 记录区在文件所有端点块之后,
代码却在每个端点块内读了 blind,导致 EP1+ 表整体错位 1280 字节。
错位表在死像素列附近 seg0 gain=35321(应为 ~4000),d2 踩中后 NUC clamp 到 0。
修复后全帧 0 个零像素,(65,25) nuc=9814gain=4000 正常值。
2. LUT 重建的跨帧一致性:算法已按反编译实现并实机运行,同场景 gray 直方图
与官方相关性 0.9197(跨会话),剩余差异来自会话间 ref/快门温度差异,
属官方物理机制,不是 bug。
## 9. 关键文件
- 反编译全量:`analysis/ida/export/ghidra_dump/`
- `keyfuncs_decomp_CoreSDKLib.dll.txt`(核心函数伪代码)
- `callers_decomp_CoreSDKLib.dll.txt`(调用关系 + 主管线)
- `exports_decomp_CoreSDKLib.dll.txt`(全部导出函数)
- 鍙嶇紪璇戝叏閲忥細`analysis/ida/export/ghidra_dump/`
- `keyfuncs_decomp_CoreSDKLib.dll.txt`锛堟牳蹇冨嚱鏁颁吉浠g爜锛? - `callers_decomp_CoreSDKLib.dll.txt`锛堣皟鐢ㄥ叧绯?+ 涓荤绾匡級
- `exports_decomp_CoreSDKLib.dll.txt`锛堝叏閮ㄥ鍑哄嚱鏁帮級
- `exports_decomp_ThermalSDK.dll.txt`
- `all_functions_decomp_libcoresdk_arm64.so_00100000.txt`ARM64 21.6MB
- DDT 文件:`build-artifacts/mag160c_official.ddt``analysis/ida/Core160043865.ddt`
- 官方抓帧:`analysis/pairs_verify_20260813/``analysis/pairs_final_20260813/`
- demo3 v5`csdk/tools/mag160c_demo3.c`
- 采集工具:`csdk/tools/tsdk_pair3.c`(含 DDT 复制、表/盲元/快门/窗口抓取)
- `all_functions_decomp_libcoresdk_arm64.so_00100000.txt`锛圓RM64 21.6MB锛?- DDT 鏂囦欢锛歚build-artifacts/mag160c_official.ddt`銆乣analysis/ida/Core160043865.ddt`
- 瀹樻柟鎶撳抚锛歚analysis/pairs_verify_20260813/`銆乣analysis/pairs_final_20260813/`
- demo3 v5锛歚csdk/tools/mag160c_demo3.c`
- 閲囬泦宸ュ叿锛歚csdk/tools/tsdk_pair3.c`锛堝惈 DDT 澶嶅埗銆佽〃/鐩插厓/蹇棬/绐楀彛鎶撳彇锛?