支持实时滤波--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整流纹波方面表现出色:
效果显著:能将带有明显纹波的直流电转换为平滑的直流
灵活可调:通过设置不同截止频率(20Hz/50Hz)平衡滤波效果与动态响应
实用性强:特别适合电源整流、电机驱动等电力电子应用
核心价值:解决了整流电路中普遍存在的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;
}
}
代码原理、特点介绍
一、 二阶巴特沃斯低通滤波器
巴特沃斯滤波器的核心优势在于其“最大平坦”的通带幅度响应。这意味着,在截止频率之前,信号几乎不会被衰减,完美保留了我们需要的有用信号形态。
在我们的实现中,它有三个关键设计亮点:
“即用即生成”的系数计算:与传统方式需要借助MATLAB等工具预计算、再查表不同,本方案在初始化时,仅需输入目标截止频率和系统采样频率,即可通过
双线性变换法实时计算出所有滤波器系数。这种方法省去了庞大的系数表,增加了系统的灵活性和可配置性,只需修改参数,同一个滤波器程序就能应对不同的工况需求。针对性的频率阻击:
对于100Hz整流纹波:我们可以将滤波器的截止频率(例如设为20-50Hz)巴特沃斯滤波器平缓的过渡带能温和地衰减100Hz成分,解决了整流电路中普遍存在的100Hz纹波问题,为后续电路提供了干净的直流电源
对于20kHz开关噪声:20kHz远高于截止频率,正处于滤波器阻带。巴特沃斯特性在此频率点能提供显著的衰减(例如-30dB以上),能有效将其抑制到很低的水平。
嵌入式友好结构:我们采用二阶直接I型结构,计算量小,非常适合STM32这类微控制器。通过调用ARM CMSIS-DSP库中高度优化的函数,能以极低的CPU开销完成高速实时滤波。
二、 动态相位补偿技术
所有模拟和数字滤波器都会引入一个共同的副作用——相位滞后。信号经过滤波器后会产生延时,在闭环控制中,这会降低系统稳定性,让响应变得“迟钝”。
为此,我们在经典滤波器后级联了一个动态相位补偿器,这是本方案的智慧所在:
工作原理:补偿器持续观测滤波器当前的输出,并将其与一个“历史瞬间”的输出值进行比较,计算出一个差值。这个差值,本质上代表了信号在滤波后“丢失”的最新变化趋势。然后,我们将这个差值乘以一个动态系数,并叠加回当前输出上。这就相当于给被延迟的信号一个“向前推一把”的力,从而在时域上抵消掉一部分滞后。
“动态”的奥秘:补偿的强度(系数α)并非固定不变。我们的核心发现是:信号频率越高,滤波器对其造成的相位滞后越大。因此,补偿系数被设计为与输入信号的估计频率成比例。当系统检测到信号频率升高时(例如电机加速),会自动增强补偿力度,实现自适应的滞后修正,确保在各种工况下都能获得一致的快速响应。
带来的优势:
提升系统带宽:有效减少了控制环路的总延时,允许采用更高的控制频率,提升系统动态性能。
维持稳定性:通过精准补偿,避免了因相位滞后过大而需要在控制器设计中进行的保守补偿,提高了系统的稳定裕度。
其他滤波器
二阶IIR巴特沃斯低通滤波-无时延补偿版
二阶IIR巴特沃斯高通滤波
二阶IIR巴特沃斯带通滤波器介绍
四阶IIR巴特沃斯带通滤波
