实现了这辈子的第一个滤波器,而学习《信号与系统》这门课,已经是5年前的事情了。
这次实现的是一个最最简单的“低通滤波器”,所谓低通滤波器,就是让低频通过,阻住高频。更简单的说,就是消除毛刺。。。
滤波器算法如下:
float lowpass = 0.0f;
private float low_pass (float input)
{
lowpass = input * 0.1f + lowpass * 0.9f;
return lowpass;
}
简单得不能再简单,不过,真心很好用。。。
为什么滤波器理论中会有“频率”这个概念呢?明明不就是一个带有毛刺的,随着时间变化的高高低低的曲线么,哪里有什么频率概念?
根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成。当在某个dT时间内信号的变化十分剧烈,其分解得到的正弦波中高频率为主要成分,通过低通滤波器可以过滤掉高频部分,剩余没有被过滤掉的部分重新叠加成一个信号的时候,这个信号很微弱(主分量都被过滤掉了),因此,低通滤波器使得这个剧烈的变化变得“很不剧烈”。
那么,如何设计滤波器才能使得“低通”呢?下面这个算法,符合频域上的低通概念吗?还是一种山寨货而已?
lowpass = input* 0.1f + lowpass * 0.9f;
当input >> lowpass的时候,计算结果会偏离lowpass很远,例如:
lowpassorg =
10
input = 1000
那么
lowpass
new =
1000 * 0.1 + 10 * 0.9 = 109
显然,lowpassnew >> lowpassorg
因此,这个滤波器并不能很好地过滤掉突然的、极大的干扰信号。为什么呢?两种原因:一种是这个滤波器根本就不是低通滤波器,是个山寨货。一种是这种突发的极大的干扰信号进行分解后,其低频部分依然
“很显著”,足以拉高输出结果。通过调整因子0.1,将其调整为0.0001,可以更好地消除这种突发干扰,但是带来的副作用则是让滤波器变得非常不灵敏。放在频域上理解,上述因子的调整使得滤波器的带宽变窄,可以通过的低频成分进一步减小。
求下述公式的频率表示:
lowpass = input* 0.1f + lowpass * 0.9f;