【信号滤波 (下)】采样条件,多种滤波算法对比(Matlab/C++)
目录
在上一篇中,介绍了信号时域到频域的转化以及傅里叶变换的原理,以及滤波算法的简单实现,本篇作为补充,介绍基于傅里叶变换的其他几种滤波方法。
一、信号采样条件
采样定理
为什么采样定理要求ADC采样频率要是噪声频率的两倍以上?参考这篇文章:
为什么采样率需要时被测信号最高频率的两倍
仅仅达到采样定理的最低要求,噪声信号会显示成三角波,要较为清晰的还原噪声波形,看出到底是正弦波还是其他波形,需要十倍,参考这篇文章:
采样频率到底多高才不会使信号幅值明显失真?
也就是如果你的噪声频率是100Hz,采样频率要大于200Hz(也就是ADC读取间隔5ms),你才能看出噪声频率,如果要还原波形需要1000Hz(也就是ADC读取间隔1ms)。
ADC的SPS设置
SPS (sample per second,每秒采样次数),是衡量ADC时采样速率的单位。采样频率不仅表示ADC的转换速度,同时也决定了系统可处理信号的带宽范围。
以单片机STM32F103C8T6为例,ADC的采样频率是可以配置的,ADC的时钟是通过APB2总线(PCLK2)分频得到的,最高可以达到14MHz。采样时间越长,转换结果相对越准确,但是转换速度就越慢。
STM32F103C8T6的ADC的总转换时间包括采样时间和固定的12.5个ADC周期,当ADCCLK设置为14MHz,采样时间设置为1.5个ADC周期时,转换时间TCONV为1.5 + 12.5 = 14个ADC周期,约等于1μs。说明ADC的最大采样速率约为1MHz。通过调整采样时间和ADC时钟的分频系数,可以设置合适的采样频率。
在实践设计中,既要兼顾ADC转换结果的准确性,又要保证转换速度达到采样定理最低要求。
二、常用滤波算法对比
查阅资料的时候碰到 “限幅滤波算法” “中位值滤波算法” “算术平均滤波算法” “加权平均滤波算法” “滑动平均滤波算法”等,个人觉得前面这些算法用Excel设置条件筛选配合简单的公式都能做到,充其量只能说是数据处理方法,达不到算法的程度。
但上面这些“Excel数据处理方法”在某些场合也会很好用,比如对于周期性干扰,滑动平均滤波在选择合适窗口大小的时候能和陷波滤波器达到差不多的效果。
下面介绍在实践中滤除周期性干扰比较有用的算法。
A.滑动平均滤波
用Excel就可以实现的数据处理方法!代码也非常简单直观。其实就是设定一个窗口,将相邻的几个点做平均计算,用这个窗口的平均值代替对应点的值。
比如下面的图是1X500的原始数据数组data[500],由Excel绘制出来的散点图。比如设定窗口大小为11,那就把data[0]到data[10]的平均值放到原来的data[5]的位置,以此类推到data[494],data[0] ~ data[4]改成和data[5]一样,data[495] ~ data[499]改成和data[494]一样。
当滑动平均窗口选取的刚好是噪声的一个周期的整数倍时,滤波效果极好,为什么呢?
看下图sin(t)一个周期内是不是正半轴部分和负半轴部分面积是一样的,把一个周期内的所有点相加就是把面积相加,正负刚好抵消。噪声正是这样的周期信号,求平均后刚好为0,这样就把噪声滤掉了。
这个方法要注意窗口大小不能大于采样点数的一半。并且滑动平均后会变平滑,有效信号也会被变平滑,一定程度上属于失真。
还有个问题就是不知道如何设置平均窗口的大小,盲目试很费时间。
如果知道了噪声周期可以快速设置窗口大小,但想知道周期就需要知道噪声频率,要傅里叶变换时域转成频域才能看出来。但都用上傅里叶变换了,可以直接从频域层面入手解决。
所以滑动平均用在低端单片机上比较多,比如ARM Cortex-M3内核就不含浮点运算单元(FPU),滑动平均滤波只需要简单的四则运算,不需要用到矩阵变换,非常适合。
B.陷波滤波
陷波滤波器简介
陷波滤波其实是一种滤波器的分类。以滤波频率对滤波器进行划分,可以分为高通/低通/带通/带阻滤波器,而陷波滤波器是一种带阻滤波器,用于衰减非常窄的频带。当您想要消除或减少特定频率的干扰(例如电力线噪声、50Hz 或 60Hz 嗡嗡声)时,可以使用这些滤波器。
FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器
滤波器的另一种分类方法FIR和IIR。
FIR 滤波器:这些滤波器具有有限数量的抽头(系数),并且其脉冲响应在一定数量的样本后结束。FIR 滤波器本质上是非递归的,这意味着它们的输出仅取决于当前和过去的输入值(没有来自输出的反馈)。它们通常是稳定的并且可以提供线性相位响应。
IIR 滤波器:这些滤波器具有无限数量的抽头,因为它们的脉冲响应在理论上是永久的。IIR 滤波器是递归的,这意味着输出不仅取决于当前和过去的输入,还取决于过去的输出。对于相同的规格,它们通常比 FIR 滤波器更高效,但可能会引入非线性相位响应,并且如果设计不当,容易不稳定。
上面的看不懂也没关系,记住IIR速度快,工程上常用就好了。
基于IIR实现陷波滤波
陷波滤波和IIR上面都介绍过了。展开说就是用无限脉冲响应的方法实现抑制某个频段的噪声。
当然在这之前需要会用傅里叶变换查看噪声频率分量。【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
滤波原理讲解
IIR有很多实现方式,比如基于双二阶滤波器结构的滤波器,对衰减特定频率的效果显著。它的QT C++代码上一篇已经展示过:【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
为什么滤波器的代码长这样,如果学过《数字信号处理》或者《自动控制原理》等课程,会学到Z变换,将输入输出变换到Z域进行频率响应相关分析。
Z变换是拉普拉斯变换的离散形式,而拉普拉斯变换又是傅里叶变换的扩展形式。这部分原理讲清楚篇幅比较多,后续会单开一篇说明。
上面代码中配置的双二阶滤波器具有以下传递函数:
H
(
z
)
=
b
0
+
b
1
z
−
1
+
b
2
z
−
2
1
+
a
1
z
−
1
+
a
2
z
−
2
H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}}
H(z)=1+a1z−1+a2z−2b0+b1z−1+b2z−2
其中
b
0
,
b
1
,
b
2
b_0, b_1, b_2
b0,b1,b2是分子系数(影响滤波器的零点,决定抑制频率大小)。
a
1
,
a
2
a_1, a_2
a1,a2是分母系数(影响滤波器的极点,决定稳定性和频率响应)。
上面这些系数的计算方式如下:
- 陷波频率 ( f 0 f_0 f0) 是需要衰减的频率,也就是这个频率下信号衰减达到最大值。
- 品质因子 ( Q Q Q) 是滤波带宽, Q Q Q越高,滤波的带宽越窄。
- 角频率 ω 0 = 2 π f 0 / f s \omega_0 = 2 \pi f_0 / f_s ω0=2πf0/fs, 其中 f s f_s fs 是采样频率。
滤波器的零点在 Z 域的单位圆上
e
j
ω
0
e^{j\omega_0}
ejω0和
e
−
j
ω
0
e^{-j\omega_0}
e−jω0两个位置,这两个零点可以使目标频率
ω
0
\omega_0
ω0完全衰减
滤波器的极点位于单位圆内,靠近零点,可以使滤波迅速变化,并且稳定。
滤波器的频率响应在目标频率
f
0
f_0
f0处有较大的衰减,而其他频率不受影响。
双二阶滤波器计算过程
首先计算需要滤波频率的角频率:
ω
0
=
2
π
f
0
f
s
\omega_0 = 2 \pi \frac{f_0}{f_s}
ω0=2πfsf0
然后基于 ω 0 \omega_0 ω0和品质因子 Q Q Q计算系数。
控制陷波的带宽的α
α
=
sin
(
ω
0
)
2
Q
\alpha = \frac{\sin(\omega_0)}{2Q}
α=2Qsin(ω0)
其他系数如下:
b
0
=
1
b_0 = 1
b0=1
b
1
=
−
2
cos
(
ω
0
)
b_1 = -2 \cos(\omega_0)
b1=−2cos(ω0)
b
2
=
1
b_2 = 1
b2=1
a
0
=
1
+
α
a_0 = 1 + \alpha
a0=1+α
a
1
=
−
2
cos
(
ω
0
)
a_1 = -2 \cos(\omega_0)
a1=−2cos(ω0)
a
2
=
1
−
α
a_2 = 1 - \alpha
a2=1−α
然后要归一化处理:
b
0
=
b
0
a
0
,
b
1
=
b
1
a
0
,
b
2
=
b
2
a
0
b_0 = \frac{b_0}{a_0}, \quad b_1 = \frac{b_1}{a_0}, \quad b_2 = \frac{b_2}{a_0}
b0=a0b0,b1=a0b1,b2=a0b2
a
1
=
a
1
a
0
,
a
2
=
a
2
a
0
a_1 = \frac{a_1}{a_0}, \quad a_2 = \frac{a_2}{a_0}
a1=a0a1,a2=a0a2
最后带入传递函数计算:
H
(
z
)
=
b
0
+
b
1
z
−
1
+
b
2
z
−
2
1
+
a
1
z
−
1
+
a
2
z
−
2
H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}}
H(z)=1+a1z−1+a2z−2b0+b1z−1+b2z−2
陷波滤波优势
相比滑动平均,陷波滤波在得知噪声频率后可以直接设置双二阶滤波器的传递函数来衰减目标频率,不用一个个试过去。对于频率较高的噪声,滑动平均的窗口大小不能再小下去了,但陷波滤波可以,对于高频噪声的滤波效果显著。
原文地址:https://blog.csdn.net/silent_dusbin/article/details/144669362
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!