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

支持实时滤波--IIR巴特沃斯低通滤波器(数字滤波器)

驯服双重噪声:基于动态相位补偿的巴特沃斯低通滤波方案

在电机驱动、开关电源等电力电子应用中,我们的信号采集系统常常面临两类“噪音”的干扰:一是工频整流后残余的100Hz低频纹波,二是功率器件高速开关产生的20kHz及以上高频噪声。前者可能干扰精确的力矩控制,后者则像背景“嘶嘶声”污染信号质量。

今天,我们介绍一种在嵌入式平台(如STM32)上优雅解决此问题的方案:一种系数实时生成、并结合动态相位补偿的二阶巴特沃斯低通滤波器。它巧妙地在滤波效果与系统实时性之间取得了平衡。

实时滤波

高频噪声滤波器

应用场景:滤除20kHz开关噪声、高频纹波、PWM干扰等

高频噪声滤波器的实现如以下两图所示:

截止频率均设置为1500hz

信号波形为:1*50hz正弦+0.1*5khz谐波+0.1*20k开关噪声+0.05*随机噪声

信号波形为:1*50hz正弦+0.1*20k开关噪声+0.05*随机噪声

可以看到出该滤波函数的效果还是很明显的,并且没有明显的时延特征

这个滤波函数实时低通滤波器,具有:

  • 优异的噪声抑制能力:能有效分离50Hz有用信号和20kHz噪声

  • 良好的实时性能:适合嵌入式系统实时处理

  • 合理的计算复杂度:在资源有限的MCU上也能高效运行

  • 灵活的参数配置:可通过调整截止频率适应不同应用

谐波纹波滤波器

以下两图均为整流后携带100hz纹波的直流电:

应用场景:滤除100Hz整流纹波、工频谐波

截止频率设置为50hz时的效果

截止频率设置为20hz的效果

这个谐波纹波滤波器在滤除100Hz整流纹波方面表现出色:

  1. 效果显著:能将带有明显纹波的直流电转换为平滑的直流

  2. 灵活可调:通过设置不同截止频率(20Hz/50Hz)平衡滤波效果与动态响应

  3. 实用性强:特别适合电源整流、电机驱动等电力电子应用

核心价值:解决了整流电路中普遍存在的100Hz纹波问题,为后续电路提供了干净的直流电源,是电力电子系统中不可或缺的信号调理环节。

谐波生成代码:

// ADC相关参数定义
#define ADC_RESOLUTION 4096 // 12位ADC分辨率
#define ADC_REF_VOLTAGE 3.3f // ADC参考电压3.3V
#define FIXED_SAMPLE_RATE 20000.0f // 固定采样率 20kHz

/**
* @brief 生成模拟ADC采样的整型噪声信号
* @param adc_out: ADC输出数组 (0-4095)
* @param sample_count: 样本点数
* @note 采样率固定为20kHz,包含50Hz基波+5kHz谐波+20kHz噪声+随机噪声
*/
void Generate_NoisySignal_ADC(uint16_t* adc_out,
uint32_t sample_count)
{
float t, signal_value, voltage_value;

// 噪声成分幅度配置 (电压值,单位:V)
float amp_50hz = 1.0f; // 50Hz基波幅度 1V
float amp_5khz = 0.3f; // 5kHz谐波幅度 0.3V
float amp_20khz = 0.2f; // 20kHz开关噪声幅度 0.2V
float amp_noise = 0.1f; // 随机噪声幅度 0.1V

// 信号频率定义
float freq_50hz = 50.0f;
float freq_5khz = 5000.0f;
float freq_20khz = 20000.0f;
float phase_offset_100hz = PI / 4.0f;

// 预计算采样间隔
float sample_interval = 1.0f / FIXED_SAMPLE_RATE;

for (uint32_t i = 0; i < sample_count; i++)
{
// 1. 计算当前时间
t = (float)i * sample_interval;

// 2. 生成模拟电压信号 (双极性,-1.5V ~ +1.5V范围)
// 50Hz基波信号
float signal_50hz = amp_50hz * sinf(2.0f * PI * freq_50hz * t);

// 100Hz整流谐波
float signal_100hz = amp_5khz * sinf(2.0f * PI * freq_5khz * t + phase_offset_100hz);

// 20kHz高频开关噪声
float signal_20khz = amp_20khz * sinf(2.0f * PI * freq_20khz * t);

// 随机白噪声
float white_noise = amp_noise * ((2.0f * (float)rand() / RAND_MAX) - 1.0f);

// 合成所有成分
signal_value = signal_50hz + signal_100hz + signal_20khz + white_noise;

// 3. 转换为电压值并加上直流偏置,使信号在0-3.3V范围内
// 加上1.5V偏置,使其在0-3V范围内
voltage_value = signal_value + 1.5f;

// 4. 电压值限制在0-3.3V之间(防止溢出)
if (voltage_value < 0.0f)
voltage_value = 0.0f;
else if (voltage_value > ADC_REF_VOLTAGE)
voltage_value = ADC_REF_VOLTAGE;

// 5. 转换为12位ADC值 (0-4095)
// ADC值 = (电压值 / 参考电压) * 分辨率
uint16_t adc_value = (uint16_t)((voltage_value / ADC_REF_VOLTAGE) * (ADC_RESOLUTION - 1));

// 确保在0-4095范围内
if (adc_value >= ADC_RESOLUTION)
adc_value = ADC_RESOLUTION - 1;

adc_out[i] = adc_value;
}
}

代码原理、特点介绍

一、 二阶巴特沃斯低通滤波器

巴特沃斯滤波器的核心优势在于其“最大平坦”的通带幅度响应。这意味着,在截止频率之前,信号几乎不会被衰减,完美保留了我们需要的有用信号形态。

在我们的实现中,它有三个关键设计亮点:

  1. “即用即生成”的系数计算:与传统方式需要借助MATLAB等工具预计算、再查表不同,本方案在初始化时,仅需输入目标截止频率系统采样频率,即可通过双线性变换法实时计算出所有滤波器系数。这种方法省去了庞大的系数表,增加了系统的灵活性和可配置性,只需修改参数,同一个滤波器程序就能应对不同的工况需求。

  2. 针对性的频率阻击

    • 对于100Hz整流纹波:我们可以将滤波器的截止频率(例如设为20-50Hz)巴特沃斯滤波器平缓的过渡带能温和地衰减100Hz成分,解决了整流电路中普遍存在的100Hz纹波问题,为后续电路提供了干净的直流电源

    • 对于20kHz开关噪声:20kHz远高于截止频率,正处于滤波器阻带。巴特沃斯特性在此频率点能提供显著的衰减(例如-30dB以上),能有效将其抑制到很低的水平。

  3. 嵌入式友好结构:我们采用二阶直接I型结构,计算量小,非常适合STM32这类微控制器。通过调用ARM CMSIS-DSP库中高度优化的函数,能以极低的CPU开销完成高速实时滤波。

二、 动态相位补偿技术

所有模拟和数字滤波器都会引入一个共同的副作用——相位滞后。信号经过滤波器后会产生延时,在闭环控制中,这会降低系统稳定性,让响应变得“迟钝”。

为此,我们在经典滤波器后级联了一个动态相位补偿器,这是本方案的智慧所在:

  1. 工作原理:补偿器持续观测滤波器当前的输出,并将其与一个“历史瞬间”的输出值进行比较,计算出一个差值。这个差值,本质上代表了信号在滤波后“丢失”的最新变化趋势。然后,我们将这个差值乘以一个动态系数,并叠加回当前输出上。这就相当于给被延迟的信号一个“向前推一把”的力,从而在时域上抵消掉一部分滞后。

  2. “动态”的奥秘:补偿的强度(系数α)并非固定不变。我们的核心发现是:信号频率越高,滤波器对其造成的相位滞后越大。因此,补偿系数被设计为与输入信号的估计频率成比例。当系统检测到信号频率升高时(例如电机加速),会自动增强补偿力度,实现自适应的滞后修正,确保在各种工况下都能获得一致的快速响应。

  3. 带来的优势

    • 提升系统带宽:有效减少了控制环路的总延时,允许采用更高的控制频率,提升系统动态性能。

    • 维持稳定性:通过精准补偿,避免了因相位滞后过大而需要在控制器设计中进行的保守补偿,提高了系统的稳定裕度。

其他滤波器

二阶IIR巴特沃斯低通滤波-无时延补偿版

二阶IIR巴特沃斯高通滤波

二阶IIR巴特沃斯带通滤波器介绍

四阶IIR巴特沃斯带通滤波

【完整代码和移植思路】链接

滤波器代码和移植步骤

视频讲解

http://www.jsqmd.com/news/746041/

相关文章:

  • GitHub Copilot在IDEA/VSCode里的10个高效用法:不止是代码补全,还能写测试和文档
  • 电力设备红外图像与可见光图像配准数据集205对共410张图无标注
  • GitHub Skills技能生态:2026年开发者必备的AI能力封装与复用指南
  • Photoshop 2020插件安装避坑实录:Geographic Imager 6.2从下载、授权到面板调出的完整指南
  • 【工业级Python 3D管线优化白皮书】:基于NVIDIA Nsight+py-spy双工具链的CPU-GPU异步流水线调优实录(仅限首批200位开发者获取)
  • 避坑指南:StaMPS+GACOS大气校正全流程复盘,从数据下载到结果可视化的5个关键点
  • OpenClaw从入门到应用——Agent:系统提示词
  • Transformer特征注入性问题与SIPIT算法解析
  • Grasscutter Tools:原神私服管理的终极解决方案,告别命令行复杂操作
  • 从踩坑到封装:我的OkHttp工具类进化史(支持HTTPS/自定义头/超时配置)
  • LLM驱动的UI仿真系统:智能理解与操作网页界面
  • 2026年5月在上海定制西装有哪些品牌 从面料工艺处一一解析 - 生活测评君
  • springMVC-获取前端请求的数据与三个作用域一文彻底搞懂 OpenClaw 的架构设计与运行原理(万字图文)
  • Olmo 3开源大模型:技术架构与实战应用解析
  • AI废话经济学:你的钱有40%花在了“如果你愿意,我很乐意....“
  • 5分钟掌握Windows安卓应用无缝运行方案
  • 避坑指南:FFmpeg 4.2.2 集成到Android项目时,那些让你头疼的CMake配置问题
  • 【TGRS 2026 】PSAA 注意力(并行自感知注意力): 全局上下文与小波细节协同建模、轻量高效红外小目标特征提取
  • 8大网盘限速终结者:LinkSwift直链下载助手的完全指南
  • 鸿蒙 HarmonyOS 6 | TextInput组件 ONE_TIME_CODE 验证码输入实战
  • Windows APK安装终极指南:无需模拟器直接运行安卓应用
  • 如何永久保存微信聊天记录:WeChatMsg完整指南,高效备份你的数字记忆
  • 配置中心选型生死局:对比Nacos/Consul/Etcd/Apollo在Python生态中的启动延迟、内存开销、TLS握手耗时与Leader选举收敛时间(实测数据表已附)
  • 通过 curl 命令快速测试 Taotoken 大模型 API 的连通性与响应
  • 用Python的异步编程思维理解ROS:回调、spin()与asyncio的异同
  • 将ClaudeCode编程助手对接至Taotoken的配置步骤详解
  • 5步轻松优化Magpie性能:让老旧电脑也能流畅放大窗口
  • 电力场景设备检测可见光设备部件检测数据集VOC+YOLO格式633张7类别
  • Python 实战 | 班级学风精准画像:从考勤成绩数据看透班风,量化评价有凭有据
  • UMAP与k-NN参数敏感性分析及编程问题生成算法