一.数字滤波器分类
系统的传递函数可设定为 ,其中常系数线性方程为:。
根据该方程滤波器可分为两类滤波器,分别为FIR滤波器和IIR滤波器。
其中FIR滤波器输出只跟以前的输入信号有关,其结构可写成 。
IIR滤波器的输出不仅跟以前的输入信号有关,而且和以前的输出有关,其结构函数可以写成
。
其中FIR滤波器相位是线性的,其相位延迟为,而IIR滤波器的幅频特性精度高,但是相位是非线性的。
二.IIR滤波器相位补偿原理
IIR滤波器相位补偿原理通过matlab的filtfilt函数。
滤波器的变换,其时域的卷积为:
Z域的变换为:
对y(n)的数据进行反转则,
并通过滤波器,则其Z域变换为:
,
并对y_{3}(n)再次进行反转,则可得到:
对其变换可得:
由于IIR滤波器理论上理解为理想滤波器,其:
,且相位,则认为其相位无延迟。
三.IIR滤波器实现
IIR滤波器通过matlab例程代码:
fs = 100;
t = 0:1/fs:1;
x = sin(2*pi*t*3)+.25*sin(2*pi*t*40);
[b,a] = butter(6,20/(fs/2));
y = filtfilt(b,a,x);
yy = filter(b,a,x);
plot(t,x,t,y,t,yy)
legend('Original','filtfilt','filter')
IIR滤波器代码通过C实现:
for (i = 0; i < 3; i++)
{
x[1] = 0;
x[2] = 0;
y[1] = 0;
y[2] = 0;
}
for (i = 0; i < NUMSIZE; i = i + 1)
{
result = a[0] * pInput[i] + a[1] * x[1] + a[2] * x[2] - b[1] * y[1] - b[2] * y[2];
x[2] = x[1];
x[1] = pInput[i];
y[2] = y[1];
y[1] = result;
pOutput1[i] = result;
}
for (i = 0; i < NUMSIZE; i = i + 1)
{
pOutput2[NUMSIZE -1-i] = pOutput1[i];
}
for (i = 0; i < 3; i++)
{
x[1] = 0;
x[2] = 0;
y[1] = 0;
y[2] = 0;
}
for (i = 0; i < NUMSIZE; i = i + 1)
{
result = a[0] * pOutput2[i] + a[1] * x[1] + a[2] * x[2] - b[1] * y[1] - b[2] * y[2];
x[2] = x[1];
x[1] = pOutput2[i];
y[2] = y[1];
y[1] = result;
pOutput3[i] = result;
}
for (i = 0; i < NUMSIZE; i = i + 1)
{
pOutput4[NUMSIZE - 1 - i] = pOutput3[i];
}
并通过gunplot进行画图:
更多相关内容请关注振动噪声公众号。