#ifndef LOWPASS_H #define LOWPASS_H #include // 一阶低通滤波器结构体 typedef struct { float b0, b1; // 分子系数 float a1; // 分母系数 (a0 归一化为 1) float x1; // 上一个输入样本 float y1; // 上一个输出样本 } LowPassFilter_t; /** * 初始化低通滤波器 * @param f 滤波器结构体指针 * @param fs 采样频率 (Hz) * @param fc 截止频率 (-3dB 频率) (Hz) */ static inline void LowPassFilter_Init(LowPassFilter_t *f, float fs, float fc) { // 预畸变角频率: w = 2 * pi * fc / fs, 然后 tan(w/2) float wc = 2.0f * M_PI * fc / fs; float tan_wc2 = tanf(wc * 0.5f); float den = 1.0f + tan_wc2; f->b0 = tan_wc2 / den; f->b1 = f->b0; f->a1 = (tan_wc2 - 1.0f) / den; f->x1 = 0.0f; f->y1 = 0.0f; } /** * 运行低通滤波器 * @param f 滤波器结构体指针 * @param x 当前输入样本 * @return 滤波后的输出 */ static inline float LowPassFilter_Run(LowPassFilter_t *f, float x) { // y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1] float y = f->b0 * x + f->b1 * f->x1 - f->a1 * f->y1; f->x1 = x; f->y1 = y; return y; } #endif // LOWPASS_H