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

14 KiB
Raw Blame History

不同车型在线圈检测器上的信号特征与分辨策略

编写日期: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 基本检测——自适应基线 + 双阈值

所有分辨的基础是先检测到。针对大跨度信噪比,必须用自适应基线跟踪

// 自适应基线 —— 抗温漂+抗噪声
// 使用一阶低通滤波器跟踪无车时的频率
#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:    平顶占比 (平顶持续时间/总时间)
}

分辨逻辑(决策树)

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)

  • 两个线圈分别检测,测速后反推车身长度
  • 用两线圈的进入时间差和离开时间差取平均,提高鲁棒性
// 双线圈测速
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:多区段采样 + 峰值保持

不依赖单点频偏,对完整窗口做分段分析:

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:自动阈值补偿(基线+噪声自适应)

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的实用状态机伪代码:

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类以上建议配合雷达/激光辅助