返回首页

阶段分析文档

# 声信号频段分析计算评审文档

日期:2026-07-08  
项目目录:`/Users/mv/Desktop/cncmock`  
评审目的:把当前真实现场声信号分析的需求、计算口径、公式、代码对应关系、数字结论、硬件含义和风险边界整理成一份可被复核的技术文档,供 Claude Code 或其他评审方检查是否存在较大错误、口径不一致或需要纠正的地方。

## 0. 评审后修正记录

根据 Claude Code 复核和专家对 t-f-A 图的疑问,2026-07-08 已完成以下修正:

1. **A/B/C 分型已补回可执行入口**:新增 `src/ae_field_survey.py classify` 子命令,可从 `output/ch1/ch2/ch3/ch4_multiscale_20windows/*_multi_window_summary.csv` 重建 `output/channel_comparison_report/`。重建后的通道级 A/B/C 数字与原报告一致。
2. **t-f-A 图矩阵方向已修正**:计算矩阵内部为 `[time, frequency]`,Plotly 显示需要 `[frequency, time]`。现已在 2D/3D 图中转置输出,坐标严格为 `x=t`、`y=f`、`z=A`。
3. **增加 t-f-A 首帧方向检查表**:每张 t-f-A 图中新增“首帧频谱检查”,并输出 `output/tfa_first_frame_diagnostics_all.csv`。固定同一时间点时,不同频率的 A 值已用数字列出,避免图形误读。
4. **结论语气已收紧**:500 kSPS 结论前置条件改为“必须确认 ADC 前端模拟抗混叠低通能压住 250 kHz 以上能量”;无动作标签导致全文件统计可能稀释短促事件,仍是当前最大方法风险。

## 1. 当前需求与范围

### 1.1 需求侧重点变更

项目早期关注 AE 声发射传感器用于 CNC 刀具崩刃、断刀、Z 向接触预警。随着现场专家提供 2 MSPS 多通道真实数据,当前阶段目标已临时调整为:

- 碰:刀具碰工件
- 敲:手敲击机床外舱门
- 切:刀具切削工件
- 挤:刀具挤压工件

当前不是最终动作分类器训练,也不是断刀/崩刃报警定型,而是先回答一个硬件决策问题:

> 现场声信号的有效频段是否主要落在 125 kHz 以内,或者至少落在 200 kHz 以内,从而判断 500 kSPS 原型采集卡是否有复用价值。

### 1.2 当前能回答与不能回答的问题

当前可以回答:

- 四个传感器通道在已采集真实数据中的频段能量分布。
- 哪些文件/通道明显低频稳定,哪些存在 `>250 kHz` 高频风险。
- 500 kSPS 原型卡在不同通道上的适配风险。
- t-f-A 图中声信号能量在时间和频率上的大致形态。

当前不能最终回答:

- 不能确认“碰/敲/切/挤”四类动作各自对应哪个频段,因为当前文件没有可靠动作标签或时间段标签。
- 不能把 A/B/C 频段风险分型直接等同于四类动作分类结果。
- 不能用当前 2 MSPS 专家采集设备的数据直接固化 500 kSPS 板端阈值,因为两个前端链路、传感器安装、抗混叠滤波和增益链路可能不同。

## 2. 输入数据与通道覆盖

### 2.1 数据目录

现场真实数据目录:

```text
/Users/mv/Desktop/cncmock/1-机床移动
```

数据情况:

- 根目录共有 48 个 `.txt` 波形导出文件。
- 总体原始数据约 58 GB。
- 多数 `.par` 参数显示采样率为 `2,000,000 Hz`,单位为 mV。
- `.txt` 为分号分隔文本,表头包含时间列和通道列,例如 `Time(s);CH1-广州清诚;CH 2-北京物声;...`。

### 2.2 通道覆盖不完全

48 个文件不是全部都有 4 个通道:

| 通道 | 有效文件数 | 跳过文件数 | 说明 |
|---|---:|---:|---|
| CH1 广州清诚 | 48 | 0 | 全部文件均有 CH1 |
| CH2 北京物声 | 48 | 0 | 全部文件均有 CH2 |
| CH3 嘉泰 | 33 | 15 | 15 个文件无 CH3 |
| CH4 友机 | 17 | 31 | 31 个文件无 CH4 |

因此,多通道比例必须以“该通道实际存在的文件数”为分母,不能用 48 作为所有通道的统一分母。

## 3. 专家需求与本次实现的对应关系

### 3.1 专家提出的核心思路

根据会议纪要与原始记录,专家希望:

- 使用 2 MSPS 真实数据做频段侦察。
- 从 1 ms 开始做不同时间窗口的 FFT 或频谱矩阵。
- 观察 t-f-A 结构,即时间 `t`、频率 `f`、幅值或能量 `A`。
- 找出碰/敲/切/挤的有效触发频段。
- 若有效频段落在 125 kHz 以内,则 500 kSPS 设备有较大复用价值。
- 若有效频段需要到 200 kHz,则 500 kSPS 仍可能可用,但对模拟抗混叠滤波要求更高。

### 3.2 当前实际完成范围

当前已完成:

- 对 48 个真实 `.txt` 文件做 1 ms 主口径全文件频段统计。
- 对 CH1-CH4 做 20 个代表窗长的多尺度 FFT 统计:
  `1,2,3,4,5,6,8,10,15,20,30,50,75,100,150,200,300,500,750,1000 ms`
- 对 CH1 生成 A/B/C 代表 t-f-A 图。
- 对 CH2-CH4 生成代表 t-f-A 图。
- 生成本机完整版展示站和 Cloudflare Pages 汇报站。

当前未完成或未严格覆盖:

- 没有按 `1,2,3,...,10000 ms` 全整数窗长穷举。
- 当前代表窗长最大到 `1000 ms`,未完成 `10000 ms` 的全量结果。
- 尚未根据动作标签输出“碰/敲/切/挤”各自的频段统计。

这点需要评审方重点判断:当前 20 个代表窗长是否足以支撑阶段性硬件判断,还是必须补做专家原始要求的完整 `1-10000 ms` 扫描。

## 4. 计算流程

主计算代码:

```text
src/ae_field_survey.py
```

网页汇总代码:

```text
scripts/build_report_site.py
scripts/build_full_demo_site.py
```

### 4.1 数据读取

流程:

1. 读取 `.txt` 表头,识别通道名称。
2. 尝试从同名测量目录中的 `.par` 文件读取采样率、位数、单位、前置放大器信息。
3. 若 `.par` 不可用,使用 fallback 采样率 `2,000,000 Hz`。
4. 流式读取分号分隔文本数据,避免一次性加载 58 GB 文件。

代码对应:

- `read_header()`:读取表头。
- `parse_par_file()`:解析 `.par` 参数。
- `load_channel_meta()`:合并通道元数据。
- `read_numeric_batch()`:批量读取数值波形。

### 4.2 固定频段定义

默认频段定义在 `src/ae_field_survey.py`:

```text
0-50 kHz
50-100 kHz
100-125 kHz
125-200 kHz
200-250 kHz
250-400 kHz
400-1000 kHz
```

代码对应:

```text
DEFAULT_BANDS_HZ
```

这些频段对应当前硬件判断逻辑:

- `<=125 kHz`:500 kSPS 设备最稳妥的可用区。
- `125-200 kHz`:500 kSPS 可能可用,但依赖模拟抗混叠低通滤波。
- `200-250 kHz`:接近 500 kSPS 奈奎斯特边界,工程余量较小。
- `>250 kHz`:500 kSPS 无法直接表示,会发生混叠或漏采风险。

### 4.3 FFT 窗口与频率分辨率

1 ms 主口径下:

```text
fs = 2,000,000 Hz
window_ms = 1 ms
window_samples = 2,000 samples
```

专家口径中常说“1 ms 对应 1 kHz 频点”。当前代码为了 FFT 计算效率使用:

```text
fft_size = next_pow2(window_samples)
```

因此 1 ms 时:

```text
fft_size = 2048
实际 FFT bin = fs / fft_size = 2,000,000 / 2048 = 976.5625 Hz
```

t-f-A 图为了展示,会把频率轴插值到 `1000 Hz` 网格。这意味着:

- 展示图接近专家口径的 1 kHz 网格。
- 但底层 FFT 原始 bin 不是严格 1 kHz,而是约 976.56 Hz。

这不一定改变频带占比结论,但属于需要评审方检查的技术细节。

### 4.4 每个窗口的计算步骤

对每个通道、每个窗口:

1. 切分窗口:

```text
window_samples = round(fs * window_ms * 1e-3)
```

2. 去直流:

```text
x_centered = x - mean(x)
```

3. 加 Hann 窗:

```text
x_windowed = x_centered * hann
```

4. 做实数 FFT:

```text
X = rfft(x_windowed, n=fft_size)
```

5. 计算功率谱:

```text
P(f) = |X(f)|^2
```

6. 去除 DC:

```text
P(0 Hz) = 0
```

7. 按频带求和:

```text
E_band = sum(P(f), f in target_band)
E_total = sum(P(f), f > 0)
```

8. 计算频带占比:

```text
band_fraction = E_band / E_total
```

代码对应:

- `analyze_signal_single_channel()` 中的 `frames - mean`、`np.hanning()`、`np.fft.rfft()`、`np.abs(spectra) ** 2`。
- `ChannelAccumulator.update()` 对所有窗口进行能量累计。
- `ChannelAccumulator.to_row()` 输出 `all_frac_le_125k`、`all_frac_le_200k`、`all_frac_above_250k`。

### 4.5 文件级与通道级汇总

文件级:

- 一个文件内所有窗口的频带能量先累计。
- 再计算该文件的 `<=125 kHz`、`<=200 kHz`、`>250 kHz` 等比例。

通道级:

- 对某通道全部有效文件的文件级比例取中位数。
- 因此通道级表中的 `median_le125`、`median_gt250` 是“文件级结果的中位数”,不是把所有文件全部拼接后重新算一次总能量。

这个口径的优点:

- 不让超长文件或能量特别大的文件完全主导通道结论。

这个口径的风险:

- 中位数可能掩盖少数高风险文件,所以仍需单独查看 C 类文件清单。

## 5. A/B/C 频段风险分型

### 5.1 分型规则

当前分型是频段风险分型,不是动作分类。

规则:

```text
A_low_frequency_stable:
  >250 kHz < 1%
  且 125 kHz 以外 < 5%

C_high_frequency_risk:
  >250 kHz >= 20%

B_transition_or_mixed:
  其余边界/混合样本
```

等价理解:

- A 类:基本全部落在 125 kHz 以内,对 500 kSPS 最友好。
- B 类:低频为主,但存在一定中高频成分,需要结合工况复核。
- C 类:高频能量显著,500 kSPS 存在混叠/漏采风险。

规则来源与可复现入口:

- `src/ae_field_survey.py` 中 `risk_class_label()`
- 可重跑命令:

```bash
.venv/bin/python src/ae_field_survey.py classify --out-dir output/channel_comparison_report
```

默认读取:

```text
output/ch1_multiscale_20windows/CH1_multi_window_summary.csv
output/ch2_multiscale_20windows/CH1_multi_window_summary.csv
output/ch3_multiscale_20windows/CH3_multi_window_summary.csv
output/ch4_multiscale_20windows/CH4_multi_window_summary.csv
```

重建后的 `channel_summary.csv` 与当前正式报告数字一致。

### 5.2 这套规则的性质

这套规则是工程风险划分规则,而不是经过动作标签训练得到的分类模型。

它适合回答:

- 哪些文件/通道对 500 kSPS 友好?
- 哪些文件/通道需要复核是否存在高频目标信号?

它不适合直接回答:

- 某个文件是否是“碰”。
- 某个文件是否是“敲”。
- 某个文件是否是“切”。
- 某个文件是否是“挤”。

## 6. 主要计算结果

### 6.1 CH1 广州清诚文件级分型

来源:

```text
output/ch1_decision_report/class_summary.csv
output/ch1_decision_report/overall_metrics.json
```

| CH1 分型 | 文件数 | 占比 | `<=125 kHz` 中位数 | `>250 kHz` 中位数 | `400 kHz-1 MHz` 中位数 |
|---|---:|---:|---:|---:|---:|
| A 低频稳定 | 30 | 62.50% | 99.99% | 0.01% | 0.01% |
| B 边界/混合 | 7 | 14.58% | 82.26% | 14.91% | 11.85% |
| C 高频风险 | 11 | 22.92% | 48.56% | 43.36% | 34.44% |

补充指标:

- CH1 共 48 个文件。
- `<=125 kHz >= 99%` 的文件数:30。
- `>250 kHz < 1%` 的文件数:30。
- `>250 kHz >= 20%` 的文件数:11。
- `>250 kHz >= 40%` 的文件数:6。

### 6.2 CH1 结论

CH1 是当前最支持 500 kSPS 低频版验证的通道:

- 30/48 文件为 A 类低频稳定。
- A 类样本几乎全部能量集中于 125 kHz 内。
- 但仍有 11 个 C 类文件存在稳定高频风险。

因此,不能只看 CH1 中位数就宣布 500 kSPS 无风险。必须确认 11 个 C 类文件,特别是前 5 个强风险文件,是否对应目标动作“碰/敲/切/挤”。

### 6.3 CH1-CH4 通道级结果

来源:

```text
output/channel_comparison_report/channel_summary.csv
```

| 通道 | 有效文件 | 跳过文件 | A/B/C | `<=125 kHz` 中位数 | `<=200 kHz` 中位数 | `>250 kHz` 中位数 | `400 kHz-1 MHz` 中位数 | 当前判断 |
|---|---:|---:|---:|---:|---:|---:|---:|---|
| CH1 广州清诚 | 48 | 0 | 30/7/11 | 99.98% | 99.99% | 0.01% | 0.01% | 主验证通道,但需复核 C 类 |
| CH2 北京物声 | 48 | 0 | 12/27/9 | 97.39% | 97.55% | 2.33% | 1.74% | 可做辅助验证,边界样本多 |
| CH3 嘉泰 | 33 | 15 | 11/14/8 | 94.90% | 95.07% | 4.82% | 3.86% | 可做辅助对比,高频风险更明显 |
| CH4 友机 | 17 | 31 | 0/0/17 | 50.89% | 55.53% | 41.71% | 27.89% | 高频风险显著,不建议 500 kSPS 定型 |

### 6.4 多通道结论

从当前数据看:

- CH1 最适合作为 500 kSPS 原型卡的主验证通道。
- CH2/CH3 可以作为辅助通道,但边界混合和高频风险比例高于 CH1。
- CH4 在已有 17 个有效文件中全部为 C 类,`>250 kHz` 中位数约 41.71%,不建议作为 500 kSPS 定型依据。

这不是说 CH4 一定“错误”或“无用”,而是说:如果目标信号必须依赖 CH4 当前观测到的高频成分,500 kSPS 不能完整覆盖。

## 7. t-f-A 图的含义

### 7.1 坐标定义

t-f-A 图中:

- `t`:时间,表示 FFT 窗口在原始波形中的位置。
- `f`:频率,表示 FFT 后的频率点。
- `A`:FFT 幅值或由 FFT 得到的频谱量。

注意:

> A 不是原始时域瞬时电压。原始数据单位可以是 mV,但经过 FFT 后,A 应理解为频谱幅值、功率或 dB 显示量。

### 7.2 2D/3D 图与数字结论的关系

t-f-A 图用于观察形态:

- 哪个时间段有明显能量。
- 能量大致落在哪些频段。
- 是否有跨过 125/200/250 kHz 边界的高频结构。

最终比例判断以 CSV 统计值为准:

```text
output/ch1_tfa_report/tfa_report_summary.csv
output/multi_channel_tfa_report/multi_channel_tfa_summary.csv
output/channel_comparison_report/channel_summary.csv
```

原因:

- 图形为了浏览,会进行可视化降采样、dB 裁剪和插值。
- CSV 是完整计算输出,更适合作为数字评审依据。

### 7.3 t-f-A 图方向修正

专家提出疑问:“在 t-f-A 三维图里,在时间 0 位,不同频率的 A 值一般不会是相同的。”

复核后确认:原绘图代码存在展示方向问题,不是 FFT 计算本身的问题。

- `compute_ch1_spectrogram()` 返回的矩阵形状是 `[time_index, frequency_index]`。
- Plotly heatmap/surface 在给定一维 `x=t`、`y=f` 时,`z` 应为 `[frequency_index, time_index]`。
- 原版本未转置,可能造成固定 `t` 时看到的是错误维度,视觉上像“不同频率 A 值相同”或形态异常。

已修正:

- `write_spectrogram_html()`:`z = amp_db.T`
- `write_spectrogram_surface_html()`:`z = amp_db.T`
- 新增 `tfa_first_frame_diagnostic()`,每张图显示固定首个时间窗下多个频率点的原始 FFT 幅值。

验证输出:

```text
output/tfa_first_frame_diagnostics_all.csv
output/ch1_tfa_report/tfa_first_frame_diagnostics.csv
output/multi_channel_tfa_report/tfa_first_frame_diagnostics.csv
```

示例:CH1 A 类首帧在 `0/50k/125k/200k/250k/400k/1000k Hz` 的 A 值均不同,说明当前图形方向已按 `x=t, y=f, z=A` 修正。

## 8. 500 kSPS 硬件适配解释

### 8.1 采样率边界

500 kSPS 的奈奎斯特频率为:

```text
f_N = 500 kSPS / 2 = 250 kHz
```

工程解释:

- `<=125 kHz`:安全余量较大,最适合 500 kSPS。
- `125-200 kHz`:理论可采,但抗混叠滤波、模拟前端带宽和采样时钟质量变得重要。
- `200-250 kHz`:接近奈奎斯特边界,工程余量较小。
- `>250 kHz`:500 kSPS 不能直接表示,会混叠到低频或被模拟滤波器挡掉。

### 8.2 混叠风险

如果 500 kSPS 临时采集板的模拟前端没有在 250 kHz 以下做足够低通滤波,那么 `>250 kHz` 的真实声信号会折叠到低频。

例如:

```text
320 kHz 信号在 500 kSPS 采样下可能折叠到 180 kHz 附近
```

这会造成一个危险现象:

- 采集结果看起来落在 200 kHz 内。
- 实际上低频中混入了高频折叠信号。
- 软件后处理无法可靠区分“真实低频”与“混叠低频”。

因此,500 kSPS 方案是否成立,不只取决于频谱分析,还取决于硬件模拟抗混叠低通滤波器。

## 9. 当前工程结论

### 9.1 可以作为阶段性结论的内容

在“500 kSPS 前端抗混叠低通有效压制 250 kHz 以上能量”这个前提成立时,当前可以较有把握地说:

1. 基于 2 MSPS 真实数据,CH1 广州清诚在多数文件中表现出明显低频集中,适合作为 500 kSPS 原型卡的主验证通道。
2. CH2/CH3 也有低频可用价值,但边界混合和高频风险比例更高,建议作为辅助对比通道。
3. CH4 当前高频风险最强,不建议用 500 kSPS 对 CH4 做最终定型判断。
4. 当前已发现一批 C 类高频风险文件,若这些文件对应目标动作“碰/敲/切/挤”,则 500 kSPS 只能做低频近似验证,不能覆盖完整目标信号。

### 9.2 不应过度表达的内容

当前不应说:

- 已经完成碰/敲/切/挤四分类。
- 已经证明 500 kSPS 一定可交付。
- 已经证明所有目标动作都落在 125 kHz 以内。
- CH4 一定是错误通道或无效传感器。
- 当前频段阈值可以直接固化到板端。

更准确的表达是:

> 在确认 500 kSPS 采集卡 ADC 前端抗混叠设计有效之前,当前所有 `<=125 kHz`、`<=200 kHz` 结论都应视为阶段性频段侦察结果。  
> 若抗混叠前提成立,当前结果支持“以 CH1 为主推进 500 kSPS 低频版验证”;但最终硬件定型仍取决于目标动作标签复核、500 kSPS 前端抗混叠设计和现场复采一致性。

## 10. 主要输出文件

汇总网站:

```text
full-report-site/index.html
report-site/index.html
https://cnc-ae-field-report.pages.dev
```

核心结果:

```text
output/ch1_decision_report/per_file_decision_table.csv
output/ch1_decision_report/class_summary.csv
output/ch1_decision_report/overall_metrics.json
output/channel_comparison_report/channel_summary.csv
output/channel_comparison_report/per_file_channel_decision.csv
output/channel_comparison_report/top_high_frequency_files.csv
```

t-f-A 图集:

```text
output/ch1_tfa_report/index.html
output/ch1_tfa_report/tfa_report_summary.csv
output/ch1_tfa_report/tfa_first_frame_diagnostics.csv
output/multi_channel_tfa_report/index.html
output/multi_channel_tfa_report/multi_channel_tfa_summary.csv
output/multi_channel_tfa_report/tfa_first_frame_diagnostics.csv
output/tfa_first_frame_diagnostics_all.csv
```

多窗口结果:

```text
output/ch1_multiscale_20windows/
output/ch2_multiscale_20windows/
output/ch3_multiscale_20windows/
output/ch4_multiscale_20windows/
```

阶段记录:

```text
documents/FIELD_FREQUENCY_SURVEY_2026-07-07.md
documents/ALGORITHM_KNOWLEDGE_BASE.md
documents/PIVOT_PLAN.md
```

## 11. 风险与待复核问题

### 11.1 无动作标签

这是当前最大限制。

需要补充至少一种标签:

```csv
file,event_label,start_s,end_s,notes
1-机床移动 26-07-07 14-29-14.txt,敲,0.0,5.0,手敲外舱门
1-机床移动 26-07-07 15-00-06.txt,切,12.5,18.0,正常切削
```

没有标签时,只能做频段风险侦察,不能输出四类动作的最终频段。

### 11.2 频带能量占比是否应使用功率谱

当前频带比例使用:

```text
P(f) = |FFT(f)|^2
band_fraction = sum(P_band) / sum(P_all)
```

评审点:

- 使用功率谱而不是幅值谱是否符合专家预期?
- 若专家口中的 A 更接近幅值矩阵,是否需要同时输出 `sum(|FFT|)` 版本作为对照?
- Hann 窗的能量归一化对比例影响较小,但对绝对幅值 A 会有影响,是否需要明确 ENBW 或幅值校正口径?

### 11.3 1 ms 对 1 kHz 的口径差异

当前代码使用 `next_pow2(2000)=2048`,1 ms 实际 bin 约 976.56 Hz。t-f-A 图展示插值到 1 kHz 网格。

评审点:

- 是否需要改成严格 `n=2000`,以保证 1 ms 精确对应 1 kHz?
- 当前 `2048` FFT 对宽频段能量占比是否影响可忽略?
- 对专家要求的“0,1k,2k,...1M”矩阵,是否应单独输出严格 1 kHz 频点版本?

### 11.4 文件级全窗口统计 vs 事件窗口统计

当前主结论使用全文件 1 ms 窗口能量汇总。

优点:

- 稳定、可复现。
- 不需要动作标签。

风险:

- 如果目标动作只发生在文件中很短的时间段,全文件统计会被背景段稀释。
- 如果文件中有非目标干扰,全文件统计会把干扰也计入结论。

这是当前最大的算法方法风险,优先级高于继续扩展更多窗长。即使只提供粗略标签,也比完全没有标签更有价值。

评审点:

- 在标签缺失阶段,是否应该优先采用 top energy windows 或局部窗口,而不是全文件汇总?
- 当前 A/B/C 分型是否会误把持续背景高频当成目标高频风险?

### 11.5 通道之间是否可直接比较

不同通道对应不同传感器、安装位置、前端响应和可能的通道数覆盖。

评审点:

- 频带“占比”在同一通道内比较较稳健,但跨通道绝对可比性有限。
- CH4 高频占比高,可能来自传感器响应、安装位置或采集链路差异,不一定代表目标动作必须依赖高频。
- 是否需要用同一事件时间段对齐四通道后再比较?

### 11.6 500 kSPS 前端抗混叠未知

当前结论对 500 kSPS 的判断依赖硬件前端:

- ADC 输入前模拟低通截止频率。
- 低通滤波器阶数和滚降。
- 放大器带宽。
- 500 kSPS 临时板是否沿用 2 MSPS 前端。

如果抗混叠不明确,则 `125-200 kHz` 甚至更低频段的实际采集都可能被 `>250 kHz` 折叠污染。

## 12. 建议 Claude Code 重点审核的问题

请 Claude Code 或评审方优先检查以下问题:

1. **公式是否正确**:用 `|FFT|^2` 的频带能量占比是否适合当前专家需求?是否需要补充幅值谱占比?
2. **FFT bin 口径**:`next_pow2(2000)=2048` 导致 1 ms 不再严格等于 1 kHz bin,这是否需要纠正?
3. **分型阈值是否合理**:A 类 `>250kHz <1% 且 125kHz 外 <5%`、C 类 `>250kHz >=20%` 是否过于主观?是否应根据硬件误报/漏报目标重新设定?分型代码现已可通过 `ae_field_survey.py classify` 重跑。
4. **全文件统计是否合适**:没有动作标签时,使用全文件能量占比是否会稀释目标动作?是否应以 top windows 或人工标注窗口为主?
5. **中位数通道结论是否掩盖风险**:CH1 中位数极低,但有 11 个 C 类文件;当前“CH1 最适合”是否表达得足够保守?
6. **跨通道比较是否公平**:CH1-CH4 传感器、安装、有效文件数不同,当前通道对比是否应增加限定语?
7. **t-f-A 图是否可能误导**:矩阵方向已修正,并加入首帧方向检查表;仍需注意图形经过降采样、dB 裁剪和插值,最终比例以 CSV 为准。
8. **500 kSPS 判断是否过早**:在抗混叠参数未知时,是否应把 `125-200kHz 可用` 的表述进一步降级?
9. **CH4 高频是否可能是链路/安装问题**:是否需要做同一时间段四通道对齐,而不是仅看文件级占比?
10. **是否必须补做 10000 ms**:专家原始建议包含到 10000 ms,目前代表窗长只到 1000 ms,是否影响评审接受度?

## 13. 建议下一步

优先级从高到低:

1. 向硬件确认 500 kSPS 板卡 ADC 前端抗混叠低通截止频率、阶数和放大器带宽。
2. 获取动作标签:文件级或时间段级都可以。
3. 对标签窗口重新统计四类动作的 `<=125kHz`、`<=200kHz`、`>250kHz`、`400kHz-1MHz`。
4. 对 C 类文件做现场工况复核,确认是否为目标动作还是非目标干扰。
5. 如果评审要求严格复现专家矩阵,补做严格 `n=2000` 的 1 kHz bin 版本,以及更长窗口到 10000 ms 的抽样或全量统计。

## 14. 最终阶段性判断

当前数据支持以下谨慎结论:

> 以 CH1 广州清诚为主的低频版 500 kSPS 验证值得继续推进;CH2/CH3 可作为辅助对比;CH4 当前高频风险显著,不建议作为 500 kSPS 定型依据。  
> 但在缺少“碰/敲/切/挤”动作标签、缺少 500 kSPS 前端抗混叠参数、且 C 类文件尚未工况复核之前,不能宣布 500 kSPS 已满足最终交付要求。