三个核验案例的独立复核记录
日期:2026-07-08
目的:汇报要求"给出某个截图或时间点的实际值,回原始文件核实"。Codex 整理了
3 个案例(output/review_verification_cases/),本记录是 Claude Code 对这 3 个
案例做的独立复核——不信任 Codex 报告的数字,直接从原始 txt 重新取数、重新
用 numpy 手写脚本算一遍,检查是否一致。
复核方法
对每个案例:
- 用
sed按案例给出的行号范围,从原始.txt直接截取对应行,核对"原始波形 前10点"是否逐位吻合。 - 用一份不依赖项目任何代码(不 import
ae_field_survey.py等)的独立 Python 脚本,重新执行:去均值 → Hann 窗 →rfft(fft_size=2048)→ 功率谱|X|^2→ 剔除 0 Hz → 按频带求和 → 计算占比。 - 对比复算结果与案例文档中的数字。
复核结果
| 案例 | 文件 / 通道 / 时间窗 | 行号核对 | 复算 vs 报告 |
|---|---|---|---|
| 1. CH1 低频稳定 | 26-07-06 16-57-30.txt,CH1,0–1ms |
行 2–2001,前10点逐位吻合 | RMS=25.3283、<=125k=99.9879%、>250k=0.0088%、主频20507.8125Hz — 精确吻合 |
| 2. CH1 高频风险 | 26-07-07 15-00-55.txt,CH1,2.684–2.685s |
行 5368002–5370001(2.684s×2MHz=5,368,000,换算无误),前10点逐位吻合 | RMS=17.893、<=125k=31.4252%、>250k=57.8462%、250-400k=10.9595%、400k-1M=46.8867% — 精确吻合 |
| 3. CH4 高频风险 | 26-07-07 14-27-36.txt,CH4(第5列),0–1ms |
行 2–2001,前10点吻合(唯一差异是报告文本四舍五入到6位小数,非数值错误) | RMS=1.5403、<=125k=1.5226%、>250k=97.6183%、主频324218.75Hz — 精确吻合 |
三个案例,所有数字均通过独立复现验证,未发现偏差。
结论与建议
- 这 3 个案例可以直接提交用于汇报核对:每个案例给出的行号范围和原始波形数值, 足够汇报时用文本编辑器/Excel 直接核对到具体行,不需要相信任何"黑箱计算"。
- 案例选择有代表性:案例1是安全区(支持500kSPS判断),案例2是同一通道 CH1 在不同时间窗口的危险区(说明不能只看通道级中位数),案例3是CH4的 极端高频区。三者组合能让评审方一次看清"同通道不同文件差异"和"跨通道差异" 两个维度。
- 遗留问题(不影响本次交付,供后续说明用):案例2选取的 2.684s 窗口未说明
是如何被选中的(是否取自
top_energy_windows的峰值窗口,还是固定/随机 时间点)。若汇报中追问"是不是挑了个最极端的例子",需要补充这个选择依据。 - 另需注意(详见
documents/REVIEW_ANALYSIS_CALCULATION_2026-07-08.md的 评审记录):本次验证的是频带占比计算本身(FFT→功率谱→频带求和),这部分 已确认正确;但 A/B/C 风险分型的生成代码目前在代码库中未找到,如果汇报中进一步 追问"分型规则能否重跑",仍需先补回这部分代码。
复核脚本(供复查)
复核用的独立脚本逻辑(非项目代码,手写一次性验证脚本):
import numpy as np
fs = 2_000_000.0
with open(path, "r", encoding="utf-8", errors="replace") as f:
lines = f.readlines()
rows = lines[start_line - 1 : end_line] # 案例给出的行号范围
values = np.array([float(r.strip().split(";")[col]) for r in rows])
rms = np.sqrt(np.mean(values**2))
mean = np.mean(values)
peak = np.max(np.abs(values))
n = 2048 # next_pow2(2000)
centered = values - mean
hann = np.hanning(2000)
spec = np.fft.rfft(centered * hann, n=n)
power = np.abs(spec) ** 2
freqs = np.fft.rfftfreq(n, d=1.0 / fs)
power[freqs == 0] = 0.0
total = power.sum()
def frac(lo, hi):
mask = (freqs >= lo) & (freqs < hi)
return power[mask].sum() / total
le125 = frac(0, 50_000) + frac(50_000, 100_000) + frac(100_000, 125_000)
le200 = le125 + frac(125_000, 200_000)
above250 = frac(250_000, 400_000) + frac(400_000, 1_000_000)