一阶滤波器分为一阶低通和一阶高通滤波器,本节将从一阶低通滤波器s域表达及z域表达进行分析推导。
在Simulink中建立简要的RC电路,如图所示:
RC电路
针对上面的RC电路,电阻两端的电压为UO,电源端激励为UI,假定流经电路的电流为I(t)
UI=RIR(t)+UO
电路中仅存在一条回路,任意时刻流经电阻及电容各处电流必然相等,
IR(t)=IC(t)=C∗dtdUO(t)
将电流带入电压等式:
UI=RC∗dtdUO(t)+UO
等式两端同时进行拉氏变换:
UI(s)=(RCs+1)UO(s)
进一步得到输出输入比:
G(s)=UI(s)UO(s)=1+RCs1(1)
注:电容的阻抗也可以认为是Cs1,继而直接得到电容上的电压分压为,结果与式(1)一致。
G(s)=R+Cs1Cs1=1+RCs1(2)
上述传递函数对应的时域为(冲激响应)
y(t)=RC1e−RCt
对应的阶跃响应为:
H(s)=s1G(s)=s11+RCs1=s1s+RC1RC1=s1−s+RC11
阶跃响应的时域为(0初始状态)
y(t)=1−e−RCt(3)
输入与输出电压响应
输出与输入电压的传递函数幅频与相频曲线
其中令τ=RC为时间常数,fωc=τ1=RC1为截止频率,在此频率点的传递函数为
H(ω)=H(RCj)=1+RC∗RCj1=1+j1
∣H(ω)∣=21=0.707=−3dB
此时相位之后45°。
一阶低通滤波器在经过截止频率后,幅值以-20dB/10Oct的速率进行衰减,相位最终稳定在-90°。
如果在Matlab中用上述参数绘制伯德图,可以得到类似的曲线
clc,clear,close all;
Fs=10000;
T_end=5;
nfft=Fs*T_end;
R=100;%Ohm
C=100e-6;% F
Tau=R*C;
Fc=1/(2*pi*R*C);
bode(1,[R*C 1])
注意:由于Bode图绘制横坐标为角频率,需要进行线性频率设置,调整相关属性后,得到的结果与RC电路仿真结果基本一致。
一阶低通滤波器Bode图
G(s)=UI(s)UO(s)=1+RCs1∣∣∣∣∣∣s=zTsz−1
令τ=RC=,采用向后差分法:
H(z)=1+Tsτzz−11=XY
H(z)=(1+Tsτ)z−Tsτz=XY(提供给freqz时)
⇒Y(1+Tsτzz−1)=X⇒Y(1+Tsτ(1−z−1))=X⇒Y(1+Tsτ)=Yz−1Tsτ+X⇒yn=1+TsτTsτyn−1+1+Tsτxn
令KCoef=1+Tsτ1,则
yn=KCoefxn+(1−KCoef)yn−1
根据上述表达式建立Simulink模型,K1=K_
其中
fωc=2πfc=τ1⇒τ=2πfc1
则:
KCoef=1+Tsτ1∣∣∣∣∣∣τ=2πfc1
⇒KCoef=2πfc+Ts12πfc=2πfc+Fs2πfc
同理,当采用向前差分时,
H(z)=Tsτz+1−Tsτ1=XY(提供给freqz使用)
⇒Y=(Tsτ)Tsτ−1Yz−1+(Tsτ)1Xz−1
令KCoef=(Tsτ)1,则
⇒yn=KCoefxn−1+(1−KCoef)yn−1
根据上述表达式建立Simulink模型,K1=K_
则:
KCoef=(Tsτ)1∣∣∣∣∣∣τ=2πfc1=Fs2πfc
注:Servotest在单极点滤波器DSP代码中采用的是向后差分的方法,因此计算截止频率时按照前一种公式计算,即KCoef=2πfc+Fs2πfc,但在PID的微分项低通滤波采用的是向前差分的取系数的方法。
public float DifferentialTimeConstant
{
get { return 1 / (block[(int)WordIndices.Kd_lpf].FloatValue * DSPCodeIterationFrequency); }
set
{
block[(int)WordIndices.Kd_lpf] = new Word(1 / (value * DSPCodeIterationFrequency));
}
}
高通滤波的RC电路只需要将电阻R和电容C的位置进行互换即可,如下图所示。
仿真参数与前面提到的低通滤波器参数一致,得到仿真结果如下图所示。
根据上述低通滤波器类似原理,推导得到高通滤波器公式为
G(s)=UI(s)UO(s)=1+RCsRCs
[magHP,phaseHP,woutHP] =bode([R*C 0],[R*C 1])
将H(s)通过伯德图进行绘制,得到结果如下:
将高通低通的Bode图绘制到一起后,如下图(横坐标为rad/s)所示:
bode(1,[R*C 1]); hold on;grid on;
bode([R*C 0],[R*C 1])
滤波系数越小,滤波结果越平稳,但是灵敏度越低;
滤波系数越大,灵敏度越高,但是滤波结果越不稳定。
一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。即:
当数据快速变化时,滤波结果能及时跟进(灵敏度优先);
当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。
一阶滤波算法有一个鲜为人知的问题:小数舍弃带来的误差。 比如: 本次采样值=25,上次滤波结果=24,滤波系数=10, 根据滤波算法:
本次滤波结果=(2510+24(256-10))/256=24.0390625 但是,我在单片机运算中,很少采用浮点数。因此运算后的小数部分要么舍弃,么进行四舍五入运算。这样一来,本例中的结果24.0390625就变成24。假如每次采样值都=25,那么滤波结果永远=24。也就是说滤波结果实际数据一直存在无法消除的误差。