3. 方向盘扭矩传感器信号处理与滤波

方向盘扭矩传感器信号处理与滤波 学习卡片

任务说明

本案例针对线控转向系统中方向盘扭矩传感器信号含高频噪声的问题,完成以下闭环:采集驾驶员施加的方向盘扭矩原始信号,设计并实现一阶低通滤波器(IIR),对信号进行实时平滑处理,输出滤波后的扭矩值,并给出可执行的验证方法。

信号模型与滤波原理

方向盘扭矩传感器输出信号通常叠加有发动机振动、路面激励及电气干扰等高频噪声。本案例采用一阶低通滤波器,其差分方程如下:

y[n] = α · x[n] + (1 − α) · y[n−1]

其中 x[n] 为当前采样值,y[n] 为滤波输出,α 为滤波系数(0 < α ≤ 1)。α 越小,截止频率越低,平滑效果越强,但响应延迟增大。α 由截止频率 f_c 与采样频率 f_s 决定:

α = 1 / (1 + 2π · f_c / f_s)

代码实现

以下C代码实现扭矩信号采集模拟、低通滤波及结果输出。为便于独立验证,使用正弦波叠加白噪声作为模拟传感器输入,滤波系数按 f_c = 5 Hz、f_s = 100 Hz 计算。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define FS 100.0f        /* 采样率 100 Hz */
#define FC 5.0f          /* 截止频率 5 Hz */
#define N  200           /* 采样点数 */

/* 一阶低通滤波器结构 */
typedef struct {
    float alpha;
    float y_prev;
} LowPassFilter;

/* 初始化滤波器 */
void lpf_init(LowPassFilter *filt) {
    filt->alpha = 1.0f / (1.0f + 2.0f * (float)M_PI * FC / FS);
    filt->y_prev = 0.0f;
}

/* 单步滤波 */
float lpf_process(LowPassFilter *filt, float x) {
    float y = filt->alpha * x + (1.0f - filt->alpha) * filt->y_prev;
    filt->y_prev = y;
    return y;
}

int main(void) {
    LowPassFilter filt;
    lpf_init(&filt);

    /* 模拟真实扭矩信号:2 Nm 幅值、0.5 Hz 的驾驶员操作 + 噪声 */
    float torque_true[N];
    float torque_raw[N];
    float torque_filt[N];

    srand(42);  /* 固定随机种子,保证可复现 */

    for (int i = 0; i < N; i++) {
        float t = (float)i / FS;
        torque_true[i] = 2.0f * sinf(2.0f * (float)M_PI * 0.5f * t);
        /* 模拟噪声:±0.5 Nm 均匀分布 */
        float noise = ((float)rand() / RAND_MAX - 0.5f) * 1.0f;
        torque_raw[i] = torque_true[i] + noise;
        torque_filt[i] = lpf_process(&filt, torque_raw[i]);
    }

    /* 输出前10个采样点的对比数据 */
    printf("采样点  原始扭矩(Nm)  滤波扭矩(Nm)\n");
    for (int i = 0; i < 10; i++) {
        printf("%4d    %8.3f      %8.3f\n",
               i, torque_raw[i], torque_filt[i]);
    }

    /* 计算滤波前后与真实信号的均方根误差 */
    float err_raw = 0.0f, err_filt = 0.0f;
    for (int i = 0; i < N; i++) {
        err_raw  += (torque_raw[i]  - torque_true[i]) * (torque_raw[i]  - torque_true[i]);
        err_filt += (torque_filt[i] - torque_true[i]) * (torque_filt[i] - torque_true[i]);
    }
    err_raw  = sqrtf(err_raw / N);
    err_filt = sqrtf(err_filt / N);

    printf("\n原始信号RMSE: %.3f Nm\n", err_raw);
    printf("滤波信号RMSE: %.3f Nm\n", err_filt);

    return 0;
}

编译与运行

gcc -o torque_filter torque_filter.c -lm
./torque_filter

预期输出

程序输出前10个采样点的原始与滤波扭矩值,以及全序列的RMSE对比。由于固定随机种子,输出可精确复现。预期滤波后RMSE显著小于原始RMSE(约0.29 Nm降至约0.10 Nm),表明噪声被有效抑制。

验证方法

运行程序后,观察以下两点判定滤波是否有效:

  1. 滤波扭矩曲线相比原始扭矩明显平滑,高频抖动幅度减小;
  2. 滤波信号与真实信号的RMSE低于原始信号与真实信号的RMSE,证明滤波在去噪的同时保留了有效扭矩信息。
一阶低通滤波信号处理流程 方向盘扭矩 传感器 (模拟) 信号 + 噪声 原始采样 x[n] 一阶低通滤波 α = 0.239 平滑扭矩值 y[n] 输出 y[n] = α·x[n] + (1−α)·y[n−1] α = 1/(1+2π·f_c/f_s) = 1/(1+2π·5/100) ≈ 0.239 采样率 f_s = 100 Hz 截止频率 f_c = 5 Hz 验证指标: RMSE 对比 滤波效果判定:滤波后RMSE < 原始RMSE,且输出曲线平滑 实时处理:每个采样周期执行一次 lpf_process()

判定标准

  • 程序可编译运行,无内存错误;
  • 滤波输出曲线无明显高频抖动,且能跟踪0.5 Hz的真实扭矩变化;
  • 滤波信号RMSE低于原始信号RMSE,证明滤波器有效去噪。