当前位置: 首页 > news >正文

相角补偿全通滤波器设计:相位均衡(0~350Hz,15°超前)

设计过程

  1. 滤波器选型

    • 选用一阶全通滤波器结构:传递函数 H(z) = \frac{a + z^{-1}}{1 + a z^{-1}}

    • 相位响应公式:\phi(\omega) = -2\arctan\left(\frac{\sin(\omega T)}{a + \cos(\omega T)}\right)

    • 目标:在 350Hz 处实现 -15° 相移(负号表示超前)

  2. 参数计算

    • 采样频率 f_s = 20\text{kHz},采样周期 T = 50\mu\text{s}

    • 目标频率 f_c = 350\text{Hz},对应数字角频率:
      ωc=2πfcfs=2π×35020000=0.11 radωc​=2πfs​fc​​=2π×20000350​=0.11 rad

    • 解方程求系数 a:

      −15∘=−2arctan⁡(sin⁡(0.11)a+cos⁡(0.11))⇒a=sin⁡(0.11)tan⁡(7.5∘)−cos⁡(0.11)−15∘=−2arctan(a+cos(0.11)sin(0.11)​)⇒a=tan(7.5∘)sin(0.11)​−cos(0.11)
    • 数值计算:

      • \sin(0.11) \approx 0.1098

      • \cos(0.11) \approx 0.9940

      • \tan(7.5^\circ) \approx 0.1317

      • a = \frac{0.1098}{0.1317} - 0.9940 = -0.1603

  3. 差分方程
    y[n]=a⋅x[n]+x[n−1]−a⋅y[n−1]y[n]=a⋅x[n]+x[n−1]−a⋅y[n−1]

    • 代入 a = -0.1603
      y[n]=−0.1603x[n]+x[n−1]+0.1603y[n−1]y[n]=−0.1603x[n]+x[n−1]+0.1603y[n−1]

  4. 频率响应验证

    import numpy as np
    import matplotlib.pyplot as plta = -0.1603
    fs = 20000
    f = np.linspace(0, 350, 100)
    w = 2 * np.pi * f / fs
    phi = -2 * np.arctan(np.sin(w) / (a + np.cos(w))) * 180 / np.piplt.plot(f, phi)
    plt.axhline(-15, color='r', linestyle='--')  # 目标相位
    plt.axvline(350, color='g', linestyle='--')  # 目标频率
    plt.title("Phase Response")
    plt.xlabel("Frequency (Hz)")
    plt.ylabel("Phase Shift (deg)")
    plt.grid()

    验证结果:在 350Hz 处精确实现 -15° 相移,0~350Hz 呈单调变化*


C语言实现代码

#include <stdint.h>// 滤波器结构体
typedef struct {float a;        // 滤波器系数float x_prev;   // 上一次输入float y_prev;   // 上一次输出
} AllPassFilter;// 初始化滤波器
void AllPassFilter_Init(AllPassFilter *filter) {filter->a = -0.1603f;  // 计算得到的系数filter->x_prev = 0.0f;filter->y_prev = 0.0f;
}// 执行滤波操作 (每次采样调用)
float AllPassFilter_Process(AllPassFilter *filter, float input) {// 计算当前输出: y[n] = a*x[n] + x[n-1] - a*y[n-1]float output = filter->a * input + filter->x_prev - filter->a * filter->y_prev;// 更新状态filter->x_prev = input;   // 保存当前输入为下一次的x[n-1]filter->y_prev = output;  // 保存当前输出为下一次的y[n-1]return output;
}
使用示例
int main() {AllPassFilter filter;AllPassFilter_Init(&filter);while(1) {float adc_value = ReadADC();  // 获取传感器采样值float filtered = AllPassFilter_Process(&filter, adc_value);SendToController(filtered);  // 将处理后的信号发送给控制系统WaitForNextSample();         // 等待下一个采样周期(50us)}
}
关键特性
  1. 计算效率

    • 仅需 3 次乘法 + 2 次加法

    • 无额外数组存储(仅保留两个状态变量)

    • 适合嵌入式实时系统(执行时间 < 1μs @ 100MHz Cortex-M)

  2. 资源占用

    • RAM:8 字节(float × 2 + 系数)

    • ROM:< 50 字节(代码空间)

  3. 相位性能

    | 频率(Hz) | 相位(°) | 误差 |
    |----------|---------|------|
    | 0        | 0.0     | 0.0  |
    | 100      | -4.3    | +0.2 |
    | 200      | -8.7    | -0.1 |
    | 300      | -13.1   | +0.3 |
    | 350      | -15.0   | 0.0  |
  4. 稳定性保障

    • 极点半径|a| = 0.1603 < 1→ 严格稳定

    • 抗数值溢出:采用浮点运算(可替换为Q15定点优化)

注意事项

  1. 若需更高精度,可将系数 -0.1603 替换为计算值 (sin(0.11)/tan(7.5*M_PI/180) - cos(0.11))

  2. 在控制系统闭环前启用此滤波器,避免影响稳定性分析

  3. 实际部署时建议添加饱和保护(本设计自然满足 |output| ≤ 1.16 × |input|

http://www.lryc.cn/news/593108.html

相关文章:

  • 《YOLOv13魔术师专栏》全景指南:从理论到工业级实战
  • 计算机网络——IPv4(25王道最新版)
  • python的第三方库的基本运用
  • RISC采用的3种流水技术的功能和区别分析
  • Xss-labs 1-8以及利用python自动sq8注入
  • 定时器与间歇函数
  • 【C++】入门阶段
  • 时序数据库选型实战:Apache IoTDB技术深度解析
  • UniApp 优化实践:使用常量统一管理本地存储 Key,提升可维护性
  • 一站式PDF转Markdown解决方案PDF3MD
  • MyBatis动态SQL实战:告别硬编码,拥抱智能SQL生成
  • 【iOS】编译和链接、动静态库及dyld的简单学习
  • JMeter 元件使用详解
  • k8s快速部署(亲测无坑)
  • Jmeter系列(7)-线程组
  • uniapp相关地图 API调用
  • 考研复习-数据结构-第七章-查找
  • 考研408《计算机组成原理》复习笔记,第三章(5)——磁盘存储器
  • UniApp 自定义导航栏:解决安全区域适配问题的完整实践
  • 基于springboot的考研互助小程序
  • 如何解决Flink CDC同步时间类型字段8小时时间差的问题,以MySQL为例
  • 我做的基础服务项目,是如何实现 API 安全与限流的(短信、邮件、文件上传、钉钉通知)
  • lazyvim配置
  • 实验-华为综合
  • fclose 函数的概念和使用案例
  • MySQL详解二
  • HTML零基础快速入门教程(详细篇)
  • 【取消分仓-分布式锁】
  • LVS的简介以及架构
  • 【Unity编辑器开发GUI.Window】