Files
xdeSpace/docs/不同车型在线圈检测器上的信号特征与分辨策略.md
T

409 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 不同车型在线圈检测器上的信号特征与分辨策略
> 编写日期:2026-07-01
> 技术领域:环形线圈车辆检测器 / 车型分类
> 关键词:车型分辨、波形特征、自适应基线、双阈值检测、状态机、线圈变形补偿
---
## 一、物理层——不同车型对线圈信号的三个核心维度
环形线圈本质上是一个 LC 振荡器,车辆经过时等效于在电感线圈下方引入一个**涡流耦合的金属体**。不同车型在以下三个维度上影响振荡信号:
### ① 底盘高度(耦合间距)
决定感应强度最重要的因素,遵循 **1/(d²)~1/(d³)** 衰减规律。
| 车型 | 典型底盘高度 | 耦合效率 | 关键影响 |
|------|------------|---------|---------|
| 自行车 | 无底盘,车架距地15~30cm | 极弱 | 金属质量太小,信号接近噪声底限 |
| 摩托车 | ~15cm(发动机部位更低) | 中等 | 发动机曲轴箱有一定金属量 |
| 三轮车 | 货斗部位可低至20~30cm | 弱-中等 | 电动三轮金属车架+电池组 |
| 小轿车 | ~15cm | 强 | 底盘平整,耦合好 |
| 人货车 | 25~35cm | 中等偏强 | 铁质货箱耦合面高,但底盘高 |
| 大货车 | 40~70cm | 弱-中等 | 底盘极高,但轮胎巨大、金属总量大 |
| 集装箱挂车 | 60~90cm | 极弱 | 底盘最高,但整个箱体是铁皮 |
### ② 金属覆盖面积(ΔL/L 幅度)
单位时间内的有效金属体积影响**频率偏移量**:
```
自行车: Δf ≈ 20~80 Hz (信号幅度最低,接近噪声)
摩托车: Δf ≈ 100~300 Hz (发动机集中)
三轮车: Δf ≈ 150~400 Hz (车架+电池)
小轿车: Δf ≈ 400~1200 Hz (底盘全耦合)
人货车: Δf ≈ 300~800 Hz (铁质货箱,但耦合弱)
大货车: Δf ≈ 200~600 Hz (底盘高,金属在后轴集中)
集装箱: Δf ≈ 150~500 Hz (底盘极高,仅有集装箱底部)
```
### ③ 车身长度(信号持续时长)
车辆通过线圈的速度 × 车身长度 = 占道时间。详见下文"速度归一化"。
### ④ 铁磁性 vs 非铁磁性
- **铁磁性材料**(钢制底盘、发动机缸体):不仅增加涡流损耗,还**提高线圈电感量**——初期信号方向相反(频率先降后升),形成特有波形特征
- **纯铝/非铁金属**:纯涡流效应,**只降低电感量**(频率上升)
> 大货车的信号波形有时会"先凹后凸"——铁质车轴进入时电感升高→频率下降,进入感应区后涡流占主导→频率上升。
---
## 二、各类车型的典型波形形态
```
频率偏移量 ↑
| ___
1400Hz | / \_________ 小轿车 (底盘低, Δf大, 波形陡)
| / \____
1200Hz |/
|
1000Hz |
| ____
800Hz | / \ 人货车 (货箱铁皮, 波形有双峰)
| / \____
600Hz |/ \
|
400Hz | __/--\_____ 集装箱 (振幅小, 持续长, 可能平顶)
| / \__
200Hz | /
| -_ _ _ _ _ _ _ _
0Hz |__________________________→ 时间
↑ ↑ ↑
进入 车轴/发动机 离开
(铁磁性凸起)
```
### 波形特征速查表
| 车型 | Δf 幅度 | 持续时长 | 波形包络 | 特征备注 |
|------|---------|---------|---------|---------|
| 自行车 | <80Hz | ~0.3s@20km/h | 窄尖峰 | 极难分辨,信噪比低 |
| 摩托车 | 100~300Hz | ~0.4s | 单峰对称 | 钢制车架可能有小凸起 |
| 三轮车 | 150~400Hz | ~0.5s | 单峰或双峰 | 电机/电池位置产生不对称 |
| 小轿车 | 400~1200Hz | ~0.8s | 平滑单峰 | 基准波形,波动小 |
| 人货车 | 300~800Hz | ~1s | 双峰(发动机舱+货箱) | 铁质货箱产生二次凸起 |
| 大货车 | 200~600Hz | ~1.5s | 平顶或双峰 | 铁质车轴+高底盘,振幅被压缩 |
| 集装箱 | 150~500Hz | ~2.5s | 平顶+缓慢起伏 | 持续极长,幅度不高 |
---
## 三、稳定可靠的检测与分辨策略
### 3.1 基本检测——自适应基线 + 双阈值
所有分辨的基础是先检测到。针对大跨度信噪比,必须用**自适应基线跟踪**:
```c
// 自适应基线 —— 抗温漂+抗噪声
// 使用一阶低通滤波器跟踪无车时的频率
#define BASELINE_ALPHA 0.01f // 慢速跟踪
if (!occupied) {
baseline_freq = baseline_freq * (1 - ALPHA) + current_freq * ALPHA;
}
// 双阈值检测
#define THRESHOLD_OCCUPY 150 // 占车阈值 (Hz)
#define THRESHOLD_RELEASE 80 // 释放阈值 (Hz) — 滞后比较
delta_f = current_freq - baseline_freq;
if (!occupied && delta_f > THRESHOLD_OCCUPY) {
occupied = TRUE;
// 进入检测态
} else if (occupied && delta_f < THRESHOLD_RELEASE) {
occupied = FALSE;
// 离开 → 触发分类流程
}
```
**关键设计点**
- 自行车Δf仅20~80Hz → 单车场景下可将阈值降至40Hz,但必须配合**持续时间滤波**(≥50ms才算检测到,避开尖峰噪声)
- 大货车Δf也偏小(200~600Hz) → 阈值150Hz能覆盖,但若安装深度过浅或线圈变形,货车可能被漏检 → 建议备用雷达或长线圈
### 3.2 车型分辨 — 特征向量 + 决策树
采集车辆经过的完整波形后,提取以下特征向量:
```
特征向量 = {
peak_delta_f: 最大频偏 (反映底盘高度+金属量)
mean_delta_f: 平均频偏
std_delta_f: 波形标准差 (反映轮廓锐度)
duration_ms: 持续时长 (÷速度 = 车身长度)
rise_time_ms: 上升时间 (进入阶段)
fall_time_ms: 下降时间 (离开阶段)
asymmetry_ratio: 上升/下降时间比 (波形对称性)
double_peak_flag: 是否有多个峰值 (发动机+货箱)
plateau_ratio: 平顶占比 (平顶持续时间/总时间)
}
```
#### 分辨逻辑(决策树)
```c
typedef enum {
UNKNOWN,
BICYCLE,
MOTORCYCLE,
TRICYCLE,
SEDAN,
TRUCK_LIGHT, // 人货车
TRUCK_HEAVY, // 大货车
CONTAINER
} VehicleClass;
VehicleClass classify_vehicle(VehicleFeatures *f) {
// Step 1: 先评估信号强度,过滤弱信号
if (f->peak_delta_f < 80) {
if (f->duration_ms > 300 && f->duration_ms < 800)
return BICYCLE;
else
return UNKNOWN; // 噪声/行人干扰
}
// Step 2: 按峰值幅度粗分
if (f->peak_delta_f > 600) {
if (f->duration_ms > 600 && f->asymmetry_ratio < 1.3f)
return SEDAN;
if (f->duration_ms < 500 && f->double_peak_flag)
return MOTORCYCLE;
return SEDAN; // fallback
}
// Step 3: 中等信号 → 货车类
if (f->peak_delta_f > 300) {
if (f->duration_ms > 1200)
return TRUCK_HEAVY;
if (f->double_peak_flag)
return TRUCK_LIGHT;
if (f->duration_ms > 500 && f->duration_ms < 900)
return TRICYCLE;
return TRUCK_LIGHT;
}
// Step 4: 弱信号 → 高底盘车辆
if (f->duration_ms > 1000) {
if (f->plateau_ratio > 0.3f)
return CONTAINER;
return TRUCK_HEAVY;
}
return UNKNOWN;
}
```
### 3.3 速度归一化——核心前提
没有速度,所有持续时间特征都无意义。
**方案:两个线圈成对使用(间距1m~3m)**
- 两个线圈分别检测,测速后反推车身长度
- 用两线圈的进入时间差和离开时间差取平均,提高鲁棒性
```c
// 双线圈测速
speed = coil_distance / (entry_time_2 - entry_time_1); // m/s
// 车身长度
body_length = speed * (exit_time_1 - entry_time_1);
// 速度过滤
if (speed < 0.5f) speed = 0.5f; // 怠速/蠕动处理
```
---
## 四、线圈变形导致的异常与规避策略
### 4.1 常见变形问题
| 现象 | 物理本质 | 对信号的影响 |
|------|---------|------------|
| **线圈拉伸变形**(矩形变梯形/锥形) | 电感量不均,磁场分布畸变 | 同一车辆在不同位置通过时信号幅度相差2~3倍 |
| **引线断裂/接触不良** | 回路电阻增加,Q值下降 | 基线噪声增大,弱信号(自行车/高底盘)消失 |
| **线圈受潮** | 分布电容增大,串联等效电阻变化 | 基线频率持续漂移,信号幅度下降 |
| **路面沉降/线圈移位** | 线圈面与路面不平 | 感应区域偏移,部分车辆漏检 |
### 4.2 锥形线圈的幅度变化
车辆从不同车道位置通过,频偏差异极大。这是最头疼的实际问题之一。
### 4.3 抗变形策略
#### 方案A:多区段采样 + 峰值保持
不依赖单点频偏,对完整窗口做分段分析:
```c
void update_zone_features(SignalBuffer *buf) {
int samples_per_zone = buf->sample_count / SECTOR_COUNT;
if (samples_per_zone < 1) return;
for (int z = 0; z < SECTOR_COUNT; z++) {
int16_t max_val = 0;
int start = z * samples_per_zone;
int end = (z == SECTOR_COUNT - 1) ? buf->sample_count
: start + samples_per_zone;
for (int i = start; i < end; i++) {
if (buf->freq_samples[i] > max_val)
max_val = buf->freq_samples[i];
}
buf->zone_max[z] = max_val;
}
// 取分段峰值加权值——排掉最小1/4区段,取剩余最大值
}
```
#### 方案B:自动阈值补偿(基线+噪声自适应)
```c
static int16_t noise_floor = 50;
static int16_t noise_peak = 80;
void update_noise_floor(int16_t baseline_stability_ms) {
static int16_t peak_buf[10];
static int idx = 0;
peak_buf[idx % 10] = baseline_stability_ms;
idx++;
if (idx >= 10) {
int sum = 0, max = 0;
for (int i = 0; i < 10; i++) {
sum += peak_buf[i];
if (peak_buf[i] > max) max = peak_buf[i];
}
noise_floor = sum / 10;
noise_peak = max;
}
}
```
#### 方案C:双线圈相关性校验(高端方案)
两个线圈一长一短或一前一后,校验一致性:
- 结果矛盾→标记"变形/异常"
- 峰值比超出历史基准→发出线圈退化预警
### 4.4 线圈维护体检建议
1. **空载测量**:无车时测线圈电感L + Q值(正常:L=50~200μHQ>30Q<20→需检修)
2. **频率漂移测试**:记录1小时内基线变化(正常<±50Hz;异常>±200Hz
3. **行走测试**:推标准车从左中右分别通过(偏差>40%→已变形)
---
## 五、完整状态机框架
适用于STM32/GD32等MCU的实用状态机伪代码:
```c
typedef enum {
IDLE, RISE, PLATEAU, FALL, CLASSIFY, VERIFY
} CoilState;
typedef struct {
CoilState state;
int32_t freq, baseline, delta_f;
uint32_t tick, entry_tick, peak_tick, exit_tick;
int32_t peak_delta, plateau_start_delta;
uint32_t plateau_duration;
uint8_t double_peak_cnt;
bool double_peak_flag, occupied;
VehicleClass vclass;
} CoilDetector;
void coil_state_machine(CoilDetector *cd, int32_t cur_freq) {
cd->freq = cur_freq;
cd->delta_f = cur_freq - cd->baseline;
uint8_t noise_margin = cd->noise_peak * 2 + 20;
if (abs(cd->delta_f) < noise_margin && cd->state == IDLE) return;
switch (cd->state) {
case IDLE:
if (cd->delta_f > TH_OCCUPY) {
cd->state = RISE;
cd->entry_tick = cd->tick;
cd->peak_delta = cd->delta_f;
cd->double_peak_cnt = 0;
cd->double_peak_flag = false;
}
break;
case RISE:
if (cd->delta_f > cd->peak_delta) {
cd->peak_delta = cd->delta_f;
cd->peak_tick = cd->tick;
}
if (cd->delta_f < cd->peak_delta - 50)
cd->double_peak_cnt++;
if (cd->delta_f < cd->peak_delta * 0.85f) {
if (cd->tick - cd->peak_tick > 20)
cd->state = PLATEAU;
else
cd->state = FALL;
}
if (cd->tick - cd->entry_tick > MAX_OCCUPY_TICKS)
cd->state = FALL;
break;
case PLATEAU:
cd->plateau_duration++;
if (cd->delta_f < cd->plateau_start_delta * 0.7f)
cd->state = FALL;
break;
case FALL:
if (cd->delta_f < TH_RELEASE) {
cd->exit_tick = cd->tick;
cd->state = CLASSIFY;
}
if (cd->delta_f > TH_OCCUPY + 100
&& cd->tick - cd->peak_tick > 100) {
cd->state = RISE;
cd->entry_tick = cd->tick;
cd->peak_delta = cd->delta_f;
}
break;
case CLASSIFY: {
uint32_t duration = cd->exit_tick - cd->entry_tick;
VehicleFeatures f = {
.peak_delta_f = cd->peak_delta,
.duration_ms = duration * 10,
.double_peak_flag = (cd->double_peak_cnt > 1),
.plateau_ratio = (float)cd->plateau_duration / duration,
};
cd->vclass = classify_vehicle(&f);
cd->occupied = false;
report_vehicle(cd->vclass, duration, cd->peak_delta);
cd->state = VERIFY;
}
break;
case VERIFY:
if (cd->tick - cd->exit_tick > 5)
cd->state = IDLE;
break;
}
cd->tick++;
}
```
---
## 六、总结
| 问题 | 核心对策 |
|------|---------|
| 自行车/摩托车难检测 | 动态阈值+持续时间滤波+噪声跟踪 |
| 大货车/集装箱信号弱 | 双线圈+分段峰值保持+自动阈值补偿 |
| 车型分辨 | 特征向量(幅度+时长+波形形态)+速度归一化 |
| 线圈变形 | 分区分段采样+双线圈相关性校验+老化预警 |
| 尾随/并排 | 状态机的超时/再次触发逻辑+分类后的VERIFY窗口 |
**现场实施优先级**
1. 先做稳**自适应基线+双阈值**
2. 双线圈测速归一化(没有速度,"持续时长"特征毫无意义)
3. 分段峰值保持——免疫力最强、改动最小的抗变形手段
4. 纯线圈做到5类车型已是较优水平,7类以上建议配合雷达/激光辅助