高精度运动控制器的“武器库”:数字滤波器篇---2(附代码实现)

引言:从理论蓝图到工程实践

在上一篇中,我们系统地构建了数字滤波器的理论武器库。我们从时域的差分方程出发,穿越至Z域剖析其传递函数与零极点,最终在频域中直观审视了滤波器对信号的塑造能力。我们明确了IIR滤波器家族以其递归结构和高效率,成为高精度运动控制中不可或缺的利器,并建立了统一的“双二阶”视角来看待其各种应用特例。

然而,精良的理论蓝图若无法在真实的硅基世界中高效、稳定地运行,便只是空中楼阁。理论的终极价值在于实践。 本篇将聚焦于工程的实现,将数学公式转化为能够在DSP、FPGA或微控制器中实时运行的、鲁棒的C语言代码。我们将直面从浮点到定点的精度权衡,攻克溢出保护与状态初始化的工程陷阱,并最终亮出我们最锋利的武器之一:实时在线陷波器,用于动态狙击机械谐振。

让我们一同,将这些无声的守护者代码化,真正赋能我们的高精度运动控制系统。

三、 滤波器C语言实现:从公式到代码

将理论公式转化为高质量代码,不仅是简单的语法翻译,更是一场对精度、效率和鲁棒性的全面考量。

  3.1 头文件定义 (biquad_filter.h)

#ifndef BIQUAD_FILTER_H
#define BIQUAD_FILTER_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stddef.h>

/* ====== 滤波器类型定义 ====== */
typedef enum {
    BIQUAD_LOWPASS = 0,    // 低通滤波器 - 信号平滑,噪声抑制
    BIQUAD_HIGHPASS,       // 高通滤波器 - 去除直流偏置,提取高频
    BIQUAD_BANDPASS,       // 带通滤波器 - 频率选择,信道提取
    BIQUAD_BANDSTOP,       // 陷波滤波器 - 机械谐振抑制,工频干扰消除
    BIQUAD_ALLPASS,        // 全通滤波器 - 相位校正,群延迟均衡
    BIQUAD_PEAK,           // 峰值均衡器 - 特定频率增益/衰减
    BIQUAD_LOWSHELF,       // 低架均衡器 - 低频区域调节
    BIQUAD_HIGHSHELF,      // 高架均衡器 - 高频区域调节
    BIQUAD_CUSTOM          // 自定义滤波器 - 特殊应用
} BiquadType;

/* ====== 精度配置选项 ====== */
typedef enum {
    PRECISION_LOW = 8,     // 8位定点 - 低成本MCU,计算资源受限
    PRECISION_MEDIUM = 16, // 16位定点 - 平衡精度与效率,通用场景
    PRECISION_HIGH = 24,   // 24位定点 - 高精度应用,音视频处理
    PRECISION_FLOAT = 32   // 32位浮点 - 最高精度,科学计算
} PrecisionLevel;

/* ====== 滤波器性能统计 ====== */
typedef struct {
    uint32_t sample_count;     // 处理样本总数
    uint32_t saturation_count; // 输出饱和次数
    uint32_t overflow_count;   // 计算溢出次数
    uint32_t reset_count;      // 状态重置次数
    float max_input_value;     // 历史最大输入值
    float max_output_value;    // 历史最大输出值
    float avg_computation_us;  // 平均计算时间(微秒)
} FilterStatistics;

/* ====== 直接I型滤波器结构(推荐:数值稳定性好) ====== */
typedef struct {
    // 滤波器系数
    float b0, b1, b2;
    float a1, a2;
    
    // 状态变量(分离的输入输出延迟线)
    float x1, x2;  // 输入延迟: x[n-1], x[n-2]
    float y1, y2;  // 输出延迟: y[n-1], y[n-2]
    
    // 滤波器参数
    float sample_freq;     // 采样频率 (Hz)
    float center_freq;     // 中心/截止频率 (Hz)
    float Q_factor;        // 品质因数
    float gain_db;         // 增益 (dB) - 用于均衡器
    
    // 保护机制
    float input_limit;     // 输入限幅值
    float output_limit;    // 输出限幅值
    float state_limit;     // 状态变量限幅值
    
    // 运行时信息
    BiquadType filter_type;
    FilterStatistics stats;
    uint32_t update_count;
    int stability_checked;
    
    // 调试支持
    char debug_name[32];
} BiquadFilter;

/* ====== 直接II型滤波器结构(可选:内存效率高) ====== */
// 适用场景:内存严格受限,但对数值误差不敏感的应用
typedef struct {
    float b0, b1, b2, a1, a2;  // 滤波器系数
    float w1, w2;              // 中间状态变量(更少的内存占用)
    char filter_type[20];
} BiquadCanonical;

/* ====== 谐振抑制系统 ====== */
typedef struct {
    BiquadFilter notch_filter;           // 主陷波滤波器
    BiquadFilter identification_filter;  // 辨识用辅助滤波器
    
    // 谐振参数
    float estimated_resonant_freq;       // 估计的谐振频率
    float estimated_damping_ratio;       // 估计的阻尼比
    float notch_bandwidth;               // 陷波器带宽 (Hz)
    
    // 自适应参数
    float adapt_rate;                    // 自适应速率 (0.001-0.1)
    float min_freq, max_freq;            // 频率搜索范围
    float stability_margin;              // 稳定性裕度
    
    // 系统状态
    uint32_t identification_interval;    // 辨识间隔(样本数)
    uint32_t identification_counter;
    int identification_enabled;
    
    // 性能监控
    float suppression_performance;       // 抑制性能指标
    uint32_t adaptation_count;
} ResonanceSuppressor;

/* ====== API 函数声明 ====== */

/* --- 核心滤波器操作 --- */
// 初始化滤波器(必须首先调用)
int BiquadFilter_Init(BiquadFilter* filter, BiquadType type, 
                     float freq, float Q, float gain_db, 
                     float sample_freq, const char* debug_name);

// 更新滤波器状态(每个采样周期调用)
float BiquadFilter_Update(BiquadFilter* filter, float input);

// 重置滤波器状态(模式切换、异常恢复时调用)
void BiquadFilter_Reset(BiquadFilter* filter, float initial_value);

// 安全更新(包含完整的保护机制)
float BiquadFilter_UpdateSafe(BiquadFilter* filter, float input);

/* --- 滤波器分析与验证 --- */
// 稳定性分析(设计阶段调用)
int BiquadFilter_AnalyzeStability(const BiquadFilter* filter, 
                                 float* pole_radius, float* pole_angle);

// 频率响应计算(验证设计)
int BiquadFilter_FrequencyResponse(const BiquadFilter* filter, float freq,
                                  float* magnitude, float* phase_deg);

// 实时监控(运行时诊断)
void BiquadFilter_GetStatistics(const BiquadFilter* filter, FilterStatistics* stats);

/* --- 高级操作 --- */
// 参数平滑切换(在线重配置)
int BiquadFilter_SmoothTransition(BiquadFilter* filter, 
                                 float new_freq, float new_Q, float new_gain_db,
                                 uint32_t transition_samples);

// 谐振抑制系统初始化
int ResonanceSuppressor_Init(ResonanceSuppressor* suppressor,
                           float sample_freq, float freq_min, float freq_max,
                           float initial_Q, float adapt_rate);

// 谐振抑制处理
float ResonanceSuppressor_Process(ResonanceSuppressor* suppressor, float input);

#ifdef __cplusplus
}
#endif

#endif /* BIQUAD_FILTER_H */

3.2 核心实现文件 (biquad_filter.c)

#include "biquad_filter.h"
#include <math.h>
#include <string.h>
#include <stdio.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846f
#endif

// 内部常量定义
#define BIQUAD_STABILITY_THRESHOLD 0.999f
#define BIQUAD_MIN_SAMPLE_FREQ 100.0f
#define BIQUAD_MAX_SAMPLE_FREQ 1e6f

/* ====== 私有辅助函数 ====== */

// 参数验证
static int validate_parameters(float freq, float Q, float sample_freq) {
    if (freq <= 0.0f || Q <= 0.0f || sample_freq <= 0.0f) {
        return 0;
    }
    if (freq >= sample_freq / 2.0f) {
        return 0; // 超过奈奎斯特频率
    }
    if (sample_freq < BIQUAD_MIN_SAMPLE_FREQ || sample_freq > BIQUAD_MAX_SAMPLE_FREQ) {
        return 0;
    }
    return 1;
}

// 安全频率限制
static float safe_frequency(float freq, float sample_freq) {
    float nyquist = sample_freq * 0.49f; // 留有余量
    return (freq < nyquist) ? freq : nyquist;
}

/* ====== 核心滤波器实现 ====== */

int BiquadFilter_Init(BiquadFilter* filter, BiquadType type, 
                     float freq, float Q, float gain_db, 
                     float sample_freq, const char* debug_name) {
    if (filter == NULL) return 0;
    
    // 参数验证
    if (!validate_parameters(freq, Q, sample_freq)) {
        return 0;
    }
    
    // 安全频率限制
    freq = safe_frequency(freq, sample_freq);
    
    // 清除滤波器结构
    memset(filter, 0, sizeof(BiquadFilter));
    
    // 设置基本参数
    filter->sample_freq = sample_freq;
    filter->center_freq = freq;
    filter->Q_factor = Q;
    filter->gain_db = gain_db;
    filter->filter_type = type;
    
    // 设置保护参数(基于信号范围的合理估计)
    filter->input_limit = 10.0f;   // 默认±10V输入范围
    filter->output_limit = 10.0f;  // 默认±10V输出范围  
    filter->state_limit = 100.0f;  // 状态变量更宽松的限制
    
    // 调试名称
    if (debug_name != NULL) {
        strncpy(filter->debug_name, debug_name, sizeof(filter->debug_name)-1);
    }
    
    // 计算滤波器系数
    return calculate_filter_coefficients(filter);
}

// 系数计算实现
static int calculate_filter_coefficients(BiquadFilter* filter) {
    float A, omega, sin_omega, cos_omega, alpha;
    float a0; // 归一化分母
    
    // 根据滤波器类型计算参数
    switch (filter->filter_type) {
        case BIQUAD_LOWPASS:
            // 低通滤波器:H(s) = 1 / (s² + s/Q + 1)
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            a0 = 1.0f + alpha;
            filter->b0 = (1.0f - cos_omega) / 2.0f / a0;
            filter->b1 = (1.0f - cos_omega) / a0;
            filter->b2 = filter->b0;
            filter->a1 = -2.0f * cos_omega / a0;
            filter->a2 = (1.0f - alpha) / a0;
            break;
            
        case BIQUAD_HIGHPASS:
            // 高通滤波器:H(s) = s² / (s² + s/Q + 1)
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            a0 = 1.0f + alpha;
            filter->b0 = (1.0f + cos_omega) / 2.0f / a0;
            filter->b1 = -(1.0f + cos_omega) / a0;
            filter->b2 = filter->b0;
            filter->a1 = -2.0f * cos_omega / a0;
            filter->a2 = (1.0f - alpha) / a0;
            break;
            
        case BIQUAD_BANDPASS:
            // 带通滤波器:H(s) = (s/Q) / (s² + s/Q + 1) - 常数幅度增益型
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            a0 = 1.0f + alpha;
            filter->b0 = alpha / a0;
            filter->b1 = 0.0f;
            filter->b2 = -alpha / a0;
            filter->a1 = -2.0f * cos_omega / a0;
            filter->a2 = (1.0f - alpha) / a0;
            break;
            
        case BIQUAD_BANDSTOP: // 陷波滤波器
            // 陷波滤波器:H(s) = (s² + 1) / (s² + s/Q + 1)
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            a0 = 1.0f + alpha;
            filter->b0 = 1.0f / a0;
            filter->b1 = -2.0f * cos_omega / a0;
            filter->b2 = 1.0f / a0;
            filter->a1 = -2.0f * cos_omega / a0;
            filter->a2 = (1.0f - alpha) / a0;
            break;
            
        case BIQUAD_ALLPASS:
            // 全通滤波器:H(s) = (s² - s/Q + 1) / (s² + s/Q + 1)
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            a0 = 1.0f + alpha;
            filter->b0 = (1.0f - alpha) / a0;
            filter->b1 = -2.0f * cos_omega / a0;
            filter->b2 = (1.0f + alpha) / a0;
            filter->a1 = -2.0f * cos_omega / a0;
            filter->a2 = (1.0f - alpha) / a0;
            break;
            
        case BIQUAD_PEAK:
            // 峰值均衡器:在中心频率处提供增益或衰减
            A = powf(10.0f, filter->gain_db / 40.0f); // 电压增益
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            a0 = 1.0f + alpha / A;
            filter->b0 = (1.0f + alpha * A) / a0;
            filter->b1 = -2.0f * cos_omega / a0;
            filter->b2 = (1.0f - alpha * A) / a0;
            filter->a1 = -2.0f * cos_omega / a0;
            filter->a2 = (1.0f - alpha / A) / a0;
            break;
            
        case BIQUAD_LOWSHELF:
            // 低架均衡器:调节低频区域响应
            A = powf(10.0f, filter->gain_db / 40.0f);
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            {
                float sqrt_A = sqrtf(A);
                float beta = 2.0f * sqrt_A * alpha;
                
                a0 = (A + 1.0f) + (A - 1.0f) * cos_omega + beta;
                filter->b0 = A * ((A + 1.0f) - (A - 1.0f) * cos_omega + beta) / a0;
                filter->b1 = 2.0f * A * ((A - 1.0f) - (A + 1.0f) * cos_omega) / a0;
                filter->b2 = A * ((A + 1.0f) - (A - 1.0f) * cos_omega - beta) / a0;
                filter->a1 = -2.0f * ((A - 1.0f) + (A + 1.0f) * cos_omega) / a0;
                filter->a2 = ((A + 1.0f) + (A - 1.0f) * cos_omega - beta) / a0;
            }
            break;
            
        case BIQUAD_HIGHSHELF:
            // 高架均衡器:调节高频区域响应
            A = powf(10.0f, filter->gain_db / 40.0f);
            omega = 2.0f * M_PI * filter->center_freq / filter->sample_freq;
            sin_omega = sinf(omega);
            cos_omega = cosf(omega);
            alpha = sin_omega / (2.0f * filter->Q_factor);
            
            {
                float sqrt_A = sqrtf(A);
                float beta = 2.0f * sqrt_A * alpha;
                
                a0 = (A + 1.0f) - (A - 1.0f) * cos_omega + beta;
                filter->b0 = A * ((A + 1.0f) + (A - 1.0f) * cos_omega + beta) / a0;
                filter->b1 = -2.0f * A * ((A - 1.0f) + (A + 1.0f) * cos_omega) / a0;
                filter->b2 = A * ((A + 1.0f) + (A - 1.0f) * cos_omega - beta) / a0;
                filter->a1 = 2.0f * ((A - 1.0f) - (A + 1.0f) * cos_omega) / a0;
                filter->a2 = ((A + 1.0f) - (A - 1.0f) * cos_omega - beta) / a0;
            }
            break;
            
        case BIQUAD_CUSTOM:
            // 自定义滤波器:系数由外部直接设置
            // 这里不做任何计算,系数需要在外部通过其他方式设置
            // 例如:filter->b0 = ... 等
            // 返回成功但不修改系数
            return 1;
        default:
            return 0; // 不支持的滤波器类型
    }
    
    // 验证系数有效性
    if (isnan(filter->b0) || isnan(filter->a1)) {
        return 0;
    }
    
    return 1;
}

/* ====== 核心计算函数 ====== */

float BiquadFilter_Update(BiquadFilter* filter, float input) {
    // 输入有效性检查
    if (filter == NULL || isnan(input) || isinf(input)) {
        return 0.0f;
    }
    
    // 输入限幅
    if (input > filter->input_limit) {
        input = filter->input_limit;
        filter->stats.saturation_count++;
    } else if (input < -filter->input_limit) {
        input = -filter->input_limit;
        filter->stats.saturation_count++;
    }
    
    // === 核心计算 ===
    // y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] + a1*y[n-1] + a2*y[n-2]
    // 注意:系数 a1, a2 在设计中已经考虑了负号
    float output = filter->b0 * input + 
                   filter->b1 * filter->x1 + 
                   filter->b2 * filter->x2 + 
                   filter->a1 * filter->y1 +  
                   filter->a2 * filter->y2;   
    
    // 输出限幅
    if (output > filter->output_limit) {
        output = filter->output_limit;
        filter->stats.saturation_count++;
    } else if (output < -filter->output_limit) {
        output = -filter->output_limit;
        filter->stats.saturation_count++;
    }
    
    // 状态变量保护
    if (fabsf(filter->y1) > filter->state_limit || 
        fabsf(filter->y2) > filter->state_limit) {
        BiquadFilter_Reset(filter, 0.0f);
        filter->stats.reset_count++;
    }
    
    // 更新状态变量
    filter->x2 = filter->x1;
    filter->x1 = input;
    filter->y2 = filter->y1;
    filter->y1 = output;
    
    // 更新统计信息
    filter->update_count++;
    filter->stats.sample_count++;
    if (fabsf(input) > filter->stats.max_input_value) {
        filter->stats.max_input_value = fabsf(input);
    }
    if (fabsf(output) > filter->stats.max_output_value) {
        filter->stats.max_output_value = fabsf(output);
    }
    
    return output;
}

/* ====== 稳定性分析 ====== */

int BiquadFilter_AnalyzeStability(const BiquadFilter* filter, 
                                 float* pole_radius, float* pole_angle) {
    if (filter == NULL) return 0;
    
    // 计算极点:解方程 1 + a1*z⁻¹ + a2*z⁻² = 0
    // 等价于 z² + a1*z + a2 = 0
    float discriminant = filter->a1 * filter->a1 - 4.0f * filter->a2;
    
    if (discriminant >= 0) {
        // 实根
        float root1 = (-filter->a1 + sqrtf(discriminant)) / 2.0f;
        float root2 = (-filter->a1 - sqrtf(discriminant)) / 2.0f;
        
        *pole_radius = fmaxf(fabsf(root1), fabsf(root2));
        *pole_angle = 0.0f;
    } else {
        // 复共轭根
        float real_part = -filter->a1 / 2.0f;
        float imag_part = sqrtf(-discriminant) / 2.0f;
        
        *pole_radius = sqrtf(real_part * real_part + imag_part * imag_part);
        *pole_angle = atan2f(imag_part, real_part);
    }
    
    // 稳定性判断:所有极点模长 < 1
    return (*pole_radius < BIQUAD_STABILITY_THRESHOLD);
}

3.3  定点数实现 (biquad_fixed.c)

#include "biquad_filter.h"
#include <limits.h>

/* ====== 定点数滤波器结构 ====== */
typedef struct {
    int32_t b0, b1, b2, a1, a2;  // Q格式系数
    int32_t x1, x2, y1, y2;      // Q格式状态
    uint8_t q_format;             // Q值(小数位数)
    int32_t output_limit;         // Q格式输出限幅
    uint32_t overflow_count;      // 溢出计数
} BiquadFixed;

/* ====== 定点数辅助宏 ====== */
#define Q_CONVERT(x, q) ((int32_t)((x) * (1 << (q))))
#define FIXED_MUL(a, b, q) ((int32_t)(((int64_t)(a) * (b)) >> (q)))
#define FIXED_SATURATE(x, max_val) ((x) > (max_val) ? (max_val) : ((x) < -(max_val) ? -(max_val) : (x)))

/* ====== 定点数系数量化误差分析 ====== */
typedef struct {
    float original_value;     // 原始浮点值
    int32_t quantized_value;  // 量化后的定点值
    float quantization_error; // 量化误差
    float relative_error;     // 相对误差
} QuantizationAnalysis;

void analyze_quantization_error(float float_coeffs[5], int32_t fixed_coeffs[5], 
                               uint8_t q_format, QuantizationAnalysis analysis[5]) {
    float scale = (float)(1 << q_format);
    
    for (int i = 0; i < 5; i++) {
        analysis[i].original_value = float_coeffs[i];
        analysis[i].quantized_value = fixed_coeffs[i];
        analysis[i].quantization_error = float_coeffs[i] - (fixed_coeffs[i] / scale);
        analysis[i].relative_error = analysis[i].quantization_error / fabsf(float_coeffs[i]);
    }
}

/* ====== 定点数滤波器实现 ====== */
int32_t BiquadFixed_Update(BiquadFixed* filter, int32_t input) {
    int64_t acc = 0;
    
    // 使用64位中间变量防止乘法溢出
    acc += (int64_t)filter->b0 * input;
    acc += (int64_t)filter->b1 * filter->x1;
    acc += (int64_t)filter->b2 * filter->x2;
    acc += (int64_t)filter->a1 * filter->y1;  // 修正:使用加法
    acc += (int64_t)filter->a2 * filter->y2;  // 修正:使用加法
    
    // 移位回目标Q格式
    int32_t output = (int32_t)(acc >> filter->q_format);
    
    // 饱和运算
    output = FIXED_SATURATE(output, filter->output_limit);
    
    // 溢出检测
    if (output == filter->output_limit || output == -filter->output_limit) {
        filter->overflow_count++;
    }
    
    // 更新状态
    filter->x2 = filter->x1;
    filter->x1 = input;
    filter->y2 = filter->y1;
    filter->y1 = output;
    
    return output;
}

3.4  谐振抑制系统 (resonance_suppressor.c)

#include "biquad_filter.h"
#include <math.h>

/* ====== 自适应算法 ====== */

// Goertzel算法 - 精确的单频点能量检测
float goertzel_algorithm(const float* samples, int num_samples, 
                        float target_freq, float sample_rate) {
    float omega = 2.0f * M_PI * target_freq / sample_rate;
    float coeff = 2.0f * cosf(omega);
    float s1 = 0.0f, s2 = 0.0f;
    
    for (int i = 0; i < num_samples; i++) {
        float s = samples[i] + coeff * s1 - s2;
        s2 = s1;
        s1 = s;
    }
    
    // 计算目标频率的能量
    return s1*s1 + s2*s2 - coeff*s1*s2;
}

// 频率扫描辨识
float improved_frequency_identification(ResonanceSuppressor* suppressor, 
                                       const float* signal_buffer, 
                                       int buffer_size) {
    float max_energy = 0.0f;
    float best_freq = suppressor->estimated_resonant_freq;
    
    // 在频率范围内扫描,寻找能量峰值
    for (float test_freq = suppressor->min_freq; 
         test_freq <= suppressor->max_freq; 
         test_freq += 1.0f) { // 1Hz分辨率
        
        float energy = goertzel_algorithm(signal_buffer, buffer_size, 
                                         test_freq, suppressor->notch_filter.sample_freq);
        
        if (energy > max_energy) {
            max_energy = energy;
            best_freq = test_freq;
        }
    }
    
    // 自适应调整陷波器带宽(基于阻尼比估计)
    float new_bandwidth = best_freq * 0.05f; // 默认5%带宽
    suppressor->notch_bandwidth = new_bandwidth;
    
    return best_freq;
}

/* ====== 谐振抑制系统实现 ====== */

int ResonanceSuppressor_Init(ResonanceSuppressor* suppressor,
                           float sample_freq, float freq_min, float freq_max,
                           float initial_Q, float adapt_rate) {
    if (suppressor == NULL) return 0;
    
    memset(suppressor, 0, sizeof(ResonanceSuppressor));
    
    // 初始化主陷波滤波器
    float initial_freq = (freq_min + freq_max) / 2.0f;
    if (!BiquadFilter_Init(&suppressor->notch_filter, BIQUAD_BANDSTOP,
                          initial_freq, initial_Q, 0.0f, sample_freq, 
                          "ResonanceNotch")) {
        return 0;
    }
    
    // 初始化辨识滤波器
    if (!BiquadFilter_Init(&suppressor->identification_filter, BIQUAD_BANDPASS,
                          initial_freq, 2.0f, 0.0f, sample_freq,
                          "IdentificationBPF")) {
        return 0;
    }
    
    // 设置自适应参数
    suppressor->estimated_resonant_freq = initial_freq;
    suppressor->min_freq = freq_min;
    suppressor->max_freq = freq_max;
    suppressor->adapt_rate = adapt_rate;
    suppressor->identification_interval = 1000; // 每1000个样本更新一次
    suppressor->identification_enabled = 1;
    
    return 1;
}

float ResonanceSuppressor_Process(ResonanceSuppressor* suppressor, float input) {
    static float signal_buffer[512]; // 信号缓存用于频率分析
    static int buffer_index = 0;
    
    // 1. 通过陷波滤波器处理信号
    float filtered_output = BiquadFilter_UpdateSafe(&suppressor->notch_filter, input);
    
    // 2. 收集信号用于频率分析
    signal_buffer[buffer_index] = input;
    buffer_index = (buffer_index + 1) % 512;
    
    // 3. 定期更新频率估计
    suppressor->identification_counter++;
    if (suppressor->identification_enabled && 
        suppressor->identification_counter >= suppressor->identification_interval) {
        
        float new_freq = improved_frequency_identification(suppressor, 
                                                          signal_buffer, 512);
        
        // 频率变化检查(防止突变)
        float freq_change = fabsf(new_freq - suppressor->estimated_resonant_freq);
        float max_allowed_change = suppressor->estimated_resonant_freq * 0.1f; // 最大10%变化
        
        if (freq_change < max_allowed_change) {
            // 平滑更新陷波器参数
            BiquadFilter_SmoothTransition(&suppressor->notch_filter,
                                         new_freq, 
                                         new_freq / suppressor->notch_bandwidth,
                                         0.0f, 100); // 100个样本的过渡
            
            suppressor->estimated_resonant_freq = new_freq;
            suppressor->adaptation_count++;
        }
        
        suppressor->identification_counter = 0;
    }
    
    return filtered_output;
}

3.5  性能分析与调试工具 (filter_analyzer.c)

#include "biquad_filter.h"
#include <time.h>

/* ====== 计算复杂度分析 ====== */
typedef struct {
    uint32_t float_operations;    // 浮点运算次数
    uint32_t memory_bytes;        // 内存占用(字节)
    float execution_time_us;      // 执行时间(微秒)
    uint32_t mips_requirement;    // MIPS要求(百万指令/秒)
} ComplexityAnalysis;

void analyze_filter_complexity(const BiquadFilter* filter, ComplexityAnalysis* analysis) {
    // 每次更新需要的运算
    analysis->float_operations = 5; // 5次乘加运算
    
    // 内存占用
    analysis->memory_bytes = sizeof(BiquadFilter);
    
    // 根据不同处理器架构估算执行时间
    #ifdef ARCH_CORTEX_M4
        analysis->execution_time_us = 0.5f; // Cortex-M4: ~0.5μs
        analysis->mips_requirement = 2;
    #elifdef ARCH_CORTEX_M7  
        analysis->execution_time_us = 0.2f; // Cortex-M7: ~0.2μs
        analysis->mips_requirement = 5;
    #elifdef ARCH_X86
        analysis->execution_time_us = 0.05f; // x86: ~0.05μs
        analysis->mips_requirement = 20;
    #else
        analysis->execution_time_us = 1.0f; // 通用估算
        analysis->mips_requirement = 1;
    #endif
}

/* ====== 实时监控与诊断 ====== */
typedef struct {
    BiquadFilter* monitored_filter;
    float stability_margin;
    float performance_metric;
    uint32_t warning_count;
    char diagnostic_message[256];
} FilterMonitor;

void monitor_filter_health(FilterMonitor* monitor) {
    float pole_radius, pole_angle;
    FilterStatistics stats;
    
    // 稳定性检查
    int stable = BiquadFilter_AnalyzeStability(monitor->monitored_filter, 
                                              &pole_radius, &pole_angle);
    
    // 性能统计
    BiquadFilter_GetStatistics(monitor->monitored_filter, &stats);
    
    // 生成诊断信息
    if (!stable) {
        monitor->warning_count++;
        snprintf(monitor->diagnostic_message, sizeof(monitor->diagnostic_message),
                "WARNING: Filter unstable! Pole radius: %.3f", pole_radius);
    } else if (stats.saturation_count > 1000) {
        snprintf(monitor->diagnostic_message, sizeof(monitor->diagnostic_message),
                "WARNING: High saturation count: %u", stats.saturation_count);
    } else if (stats.reset_count > 100) {
        snprintf(monitor->diagnostic_message, sizeof(monitor->diagnostic_message),
                "WARNING: Frequent resets: %u", stats.reset_count);
    } else {
        snprintf(monitor->diagnostic_message, sizeof(monitor->diagnostic_message),
                "OK: Stable operation, %u samples processed", stats.sample_count);
    }
    
    // 计算性能指标
    monitor->stability_margin = 1.0f - pole_radius;
    monitor->performance_metric = (float)stats.saturation_count / stats.sample_count;
}

3.6   综合测试框架 (test_framework.c)

#include "biquad_filter.h"
#include <stdio.h>
#include <assert.h>

/* ====== 全面测试函数 ====== */
void comprehensive_filter_test() {
    printf("=== 双二阶滤波器综合测试 ===\n\n");
    
    BiquadFilter filter;
    FilterStatistics stats;
    ComplexityAnalysis complexity;
    
    /* 测试1:基本低通滤波器 */
    printf("1. 测试低通滤波器:\n");
    assert(BiquadFilter_Init(&filter, BIQUAD_LOWPASS, 100.0f, 0.707f, 0.0f, 
                           1000.0f, "TestLPF"));
    
    // 稳定性验证
    float pole_radius, pole_angle;
    int stable = BiquadFilter_AnalyzeStability(&filter, &pole_radius, &pole_angle);
    printf("   稳定性: %s, 极点半径: %.3f\n", stable ? "稳定" : "不稳定", pole_radius);
    assert(stable);
    
    /* 测试2:陷波滤波器性能 */
    printf("\n2. 测试陷波滤波器:\n");
    assert(BiquadFilter_Init(&filter, BIQUAD_BANDSTOP, 60.0f, 5.0f, 0.0f, 
                           1000.0f, "TestNotch"));
    
    // 频率响应验证
    float mag, phase;
    BiquadFilter_FrequencyResponse(&filter, 60.0f, &mag, &phase);
    printf("   60Hz处衰减: %.3f, 期望: <0.1\n", mag);
    assert(mag < 0.1f);
    
    /* 测试3:信号处理测试 */
    printf("\n3. 信号处理测试:\n");
    BiquadFilter_Reset(&filter, 0.0f);
    
    float signal_power = 0.0f, noise_power = 0.0f;
    for (int i = 0; i < 1000; i++) {
        float t = i / 1000.0f;
        float signal = sinf(2 * M_PI * 10 * t);      // 10Hz有用信号
        float noise = 0.5f * sinf(2 * M_PI * 60 * t); // 60Hz干扰
        float input = signal + noise;
        
        float output = BiquadFilter_Update(&filter, input);
        
        signal_power += signal * signal;
        noise_power += (input - output) * (input - output);
    }
    
    float snr_improvement = 10.0f * log10f(noise_power / signal_power);
    printf("   信噪比改善: %.1f dB\n", snr_improvement);
    
    /* 测试4:性能分析 */
    printf("\n4. 性能分析:\n");
    BiquadFilter_GetStatistics(&filter, &stats);
    analyze_filter_complexity(&filter, &complexity);
    
    printf("   处理样本: %u\n", stats.sample_count);
    printf("   饱和次数: %u\n", stats.saturation_count);
    printf("   内存占用: %u 字节\n", complexity.memory_bytes);
    printf("   执行时间: %.2f μs\n", complexity.execution_time_us);
    
    printf("\n=== 所有测试通过 ===\n");
}

/* ====== 实时性测试 ====== */
void realtime_performance_test() {
    printf("\n=== 实时性能测试 ===\n");
    
    BiquadFilter filter;
    assert(BiquadFilter_Init(&filter, BIQUAD_LOWPASS, 1000.0f, 0.707f, 0.0f, 
                           10000.0f, "PerfTest"));
    
    clock_t start_time = clock();
    uint32_t iterations = 100000;
    
    for (uint32_t i = 0; i < iterations; i++) {
        float input = (float)rand() / RAND_MAX * 2.0f - 1.0f; // -1到1的随机输入
        BiquadFilter_Update(&filter, input);
    }
    
    clock_t end_time = clock();
    double total_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
    double time_per_sample = total_time / iterations * 1e6; // 微秒
    
    printf("平均处理时间: %.2f μs/样本\n", time_per_sample);
    printf("最大理论采样率: %.0f Hz\n", 1e6 / time_per_sample);
}

3.7  滤波器类型选择指南:

/* 应用场景与滤波器类型映射 */
BiquadType select_filter_for_application(const char* application) {
    if (strstr(application, "smoothing") != NULL) 
        return BIQUAD_LOWPASS;        // 信号平滑
    if (strstr(application, "resonance") != NULL) 
        return BIQUAD_BANDSTOP;       // 机械谐振抑制
    if (strstr(application, "50hz") != NULL || strstr(application, "60hz") != NULL) 
        return BIQUAD_BANDSTOP;       // 工频干扰消除
    if (strstr(application, "dc_remove") != NULL) 
        return BIQUAD_HIGHPASS;       // 直流分量去除
    if (strstr(application, "phase_correct") != NULL) 
        return BIQUAD_ALLPASS;        // 相位校正
    if (strstr(application, "tone_control") != NULL) 
        return BIQUAD_PEAK;           // 音调控制
    
    return BIQUAD_LOWPASS; // 默认
}

注意:直接I型 vs 直接II型 适用场景

"直接I型",  数值稳定性好,状态变量物理意义明, 内存占用稍多(4个状态变量), 高精度应用,数值敏感场景。

"直接II型",  内存效率高(2个状态变量), 对系数量化误差更敏感, 内存受限系统,对精度要求不高的场景。

总结:从理论蓝图到工业级实践的全栈解决方案

通过本篇的深入探索,我们成功完成了从数学理论到工业实践的完整闭环,为高精度运动控制领域提供了真正可用的全栈解决方案:

  • 模块化设计:清晰的接口分离,便于集成和维护

  • 统一框架:所有滤波器类型统一在双二阶结构下,极大提升代码复用性

  • 分层实现:从核心算法到高级应用,层次分明,易于理解

  • 完整覆盖:8大标准滤波器类型 + 4种特殊应用特例,满足各种场景需求

  • 性能优化:浮点/定点双实现,平衡精度与效率

  • 主动防护:预见性处理边界条件和异常情况

  • 智能恢复:自动状态重置和平滑过渡机制

  • 全面诊断:运行时监控和性能分析

本文构建的滤波器框架为后续高级控制算法奠定了坚实基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值