写过软件滤波算法的请进 点击:6776 | 回复:12



microtomato

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:85帖 | 1476回
  • 年度积分:0
  • 历史总积分:2078
  • 注册:2001年11月02日
发表于:2006-08-11 18:16:00
楼主
由于现场干扰非常严重,从而导致PLC采集到的模拟量信号非常不稳定。其表现为数值无规律变化,而且幅度非常大。我现在自己做了个软件滤波程序,但是效果不佳(我的缓冲区长度为100个字,应该不算小),虽然比没有滤波要有所改善,但还是会经常出现错误的数值。 其基本算法为: 1.首先做个FIFO缓冲区,每次采样时将新的数据放入缓冲区,同时将最老的数据丢弃。 2.将整个缓冲区复制1份,然后对该缓冲区副本内数值按从大到小进行排序。 3.对排序结果中各数值的出现次数进行计数,将出现次数最多的数值作为滤波结果。 现在放上在某1时刻FIFO缓冲区内数值: 1448,1433,1433,1621,1621,1621,1665,1665,1500,1500, 1500,1777,1509,1509,1509,1454,1454,1437,1437,1437, 1772,1772,1815,1815,1815,1507,1507,1507,1457,1457, 1438,1438,1438,1758,1758,1758,1804,1804,1507,1507, 1507,1457,1457,1457,1436,1436,1436,1722,1722,1722, 1769,1769,1468,1422,1422,1422,1768,1768,1825,1825, 1519,1519,1519,1459,1459,1430,1430,1430,1768,1768, 1818,1818,1818,1511,1511,1511,1511,1511,1428,1428, 1428,1766,1766,1766,1813,1813,1813,1506,1506,1506, 1449,1449,1425,1425,1425,1759,1759,1759,1807,1807 经过排序后的数值: 1825,1825,1818,1818,1818,1815,1815,1815,1813,1813, 1813,1807,1804,1804,1777,1772,1772,1769,1769,1768, 1768,1768,1768,1766,1766,1766,1759,1759,1759,1758, 1758,1758,1722,1722,1722,1665,1665,1621,1621,1621, 1519,1519,1519,1511,1511,1511,1511,1511,1509,1509, 1509,1507,1507,1507,1507,1507,1507,1506,1506,1506, 1500,1500,1500,1468,1459,1459,1457,1457,1457,1457, 1457,1454,1454,1449,1449,1448,1438,1438,1438,1437, 1437,1437,1436,1436,1436,1433,1433,1430,1430,1430, 1428,1428,1428,1425,1425,1425,1422,1422,1422 这个仪表是压力式液位计,量程是0~140mm,此时串在其中的显示表显示数值是49.6mm,万用表显示的数值是9.7mA,液位计本身没有显示。PLC此时算出的最佳值是1507,换算过来就是52mm,PLC的模拟量输入模块分辨率是1/4000。液位变化非常缓慢(因为我们要求水位控制在正负3mm),超过了就要控制设备动作了,所以对信号的稳定度要求比较高。 现在的问题就是:在这种情况下,表头显示的数值一直在1mm以内变化,不知道他们是怎么做的。



如火

  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2006-08-14 09:08:00
1楼
笔者编写过,资料库中有类似案例可以供您参考。
滤波的效果还是非常明显的。

Legoooooooooooooo

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 135回
  • 年度积分:0
  • 历史总积分:922
  • 注册:2006年7月08日
发表于:2006-08-15 11:23:00
2楼
建议采用一阶RC滤波:
y(k)=(1-a)*X(k)+a*y(k-1)
取a=0-1,a越大滤波效果越好。
你可以自己写个程序,选取合适的频率的噪声信号进行测试,最好绘图比较,以得到合适的a值。

如火

  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2006-08-15 15:39:00
3楼
楼上的一阶RC滤波实现比较简单一些,效果也不错。

hfutman

  • 精华:0帖
  • 求助:0帖
  • 帖子:15帖 | 76回
  • 年度积分:0
  • 历史总积分:138
  • 注册:2005年1月07日
发表于:2006-08-15 16:15:00
4楼
楼上的,RC滤波是否对采样时间有一定的要求?

Legoooooooooooooo

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 135回
  • 年度积分:0
  • 历史总积分:922
  • 注册:2006年7月08日
发表于:2006-08-16 14:01:00
5楼
RC滤波有一定的滞后,参数a越大滞后越严重。 比如,对于y = 1000 * Sin(2 * pi * f * x)这样的正弦波,为方便观察,取f=4。 当a=0.9时,波形如下(绿色为原始信号,红色为滤波后的信号):
当a=0.98时,波形如下(绿色为原始信号,红色为滤波后的信号):
当a=0.999,波形如下(绿色为原始信号,红色为滤波后的信号):
可以看出,最大滞后T/4!

Legoooooooooooooo

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 135回
  • 年度积分:0
  • 历史总积分:922
  • 注册:2006年7月08日
发表于:2006-08-16 14:16:00
6楼
为了说明RC滤波的效果,我们来处理一下有噪声的信号,波形如下: y = 1000 * Sin(2 * pi * f * x) - 500 * Rnd * Sin(2 * pi * 10 * x) + 400 * Rnd * Sin(2 * pi * 20 * x) - 300 * Rnd * Sin(2 * pi * 30 * x) + 200 * Rnd * Sin(2 * pi * 40 * x) 还是取f=4,a=0.9,滤波结果如下图:
我的观点是,如果你对模拟量的实时性要求不是KHZ级的,用RC滤波足矣! 如果是高速模拟量处理,有更复杂的数字滤波算法,如巴特沃斯等。

Legoooooooooooooo

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 135回
  • 年度积分:0
  • 历史总积分:922
  • 注册:2006年7月08日
发表于:2006-08-16 14:26:00
7楼
补一张f=4,a=0.98时的滤波效果:滤波结果明显失真,a太大。

Legoooooooooooooo

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 135回
  • 年度积分:0
  • 历史总积分:922
  • 注册:2006年7月08日
发表于:2006-08-16 14:26:00
8楼
补一张f=4,a=0.98时的滤波效果:滤波结果明显失真,a太大。

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:85帖 | 1476回
  • 年度积分:0
  • 历史总积分:2078
  • 注册:2001年11月02日
发表于:2006-08-16 20:45:00
9楼
非常感谢Legoo及各位朋友的帮助。我现在把所有模拟量通道的线全部拆掉,然后1个个的接上进行测试。最终发现其中有1个模拟量信号有问题。当把这根线接上,则问题出现,拆除则一切正常。现在这个有问题的线路上装了个信号隔离器,把这个仪表隔离掉,问题基本解决了。

andytaoyongl

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2009年1月11日
发表于:2009-12-10 15:55:51
10楼
学习了,,,,,。。。

andytaoyongl

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2009年1月11日
发表于:2009-12-10 15:57:39
11楼
怎样取它的采样时间。。。

高渐飞

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 101回
  • 年度积分:0
  • 历史总积分:426
  • 注册:2002年4月07日
发表于:2009-12-10 16:46:43
12楼
软件滤波方法及其优缺点

1、限幅滤波法(又称程序判断滤波法)
A、方法:
根据经验判断,确定两次采样允许的最大偏差值(设为A)
每次检测到新值时判断:
如果本次值与上次值之差<=A,则本次值有效
如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
B、优点:
能有效克服因偶然因素引起的脉冲干扰
C、缺点
无法抑制那种周期性的干扰
平滑度差

2、中位值滤波法
A、方法:
连续采样N次(N取奇数)
把N次采样值按大小排列
取中间值为本次有效值
B、优点:
能有效克服因偶然因素引起的波动干扰
对温度、液位的变化缓慢的被测参数有良好的滤波效果
C、缺点:
对流量、速度等快速变化的参数不宜





3、算术平均滤波法
A、方法:
连续取N个采样值进行算术平均运算
N值较大时:信号平滑度较高,但灵敏度较低
N值较小时:信号平滑度较低,但灵敏度较高
N值的选取:一般流量,N=12;压力:N=4
B、优点:
适用于对一般具有随机干扰的信号进行滤波
这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
C、缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适用
比较浪费RAM

4、递推平均滤波法(又称滑动平均滤波法)
A、方法:
把连续取N个采样值看成一个队列
队列的长度固定为N
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
B、优点:
对周期性干扰有良好的抑制作用,平滑度高
适用于高频振荡的系统
C、缺点:
灵敏度低
对偶然出现的脉冲性干扰的抑制作用较差
不易消除由于脉冲干扰所引起的采样值偏差
不适用于脉冲干扰比较严重的场合
比较浪费RAM

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
A、方法:
相当于“中位值滤波法”+“算术平均滤波法”
连续采样N个数据,去掉一个最大值和一个最小值
然后计算N-2个数据的算术平均值
N值的选取:3~14
B、优点:
融合了两种滤波法的优点
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
C、缺点:
测量速度较慢,和算术平均滤波法一样
比较浪费RAM





6、限幅平均滤波法
A、方法:
相当于“限幅滤波法”+“递推平均滤波法”
每次采样到的新数据先进行限幅处理,
再送入队列进行递推平均滤波处理
B、优点:
融合了两种滤波法的优点
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
C、缺点:
比较浪费RAM




7、一阶滞后滤波法
A、方法:
取a=0~1
本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
B、优点:
对周期性干扰具有良好的抑制作用
适用于波动频率较高的场合
C、缺点:
相位滞后,灵敏度低
滞后程度取决于a值大小
不能消除滤波频率高于采样频率的1/2的干扰信号

8、加权递推平均滤波法
A、方法:
是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
通常是,越接近现时刻的数据,权取得越大。
给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
B、优点:
适用于有较大纯滞后时间常数的对象
和采样周期较短的系统
C、缺点:
对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
不能迅速反应系统当前所受干扰的严重程度,滤波效果差




9、消抖滤波法
A、方法:
设置一个滤波计数器
将每次采样值与当前有效值比较:
如果采样值=当前有效值,则计数器清零
如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
如果计数器溢出,则将本次值替换当前有效值,并清计数器
B、优点:
对于变化缓慢的被测参数有较好的滤波效果,
可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
C、缺点:
对于快速变化的参数不宜
如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统




10、限幅消抖滤波法
A、方法:
相当于“限幅滤波法”+“消抖滤波法”
先限幅,后消抖
B、优点:
继承了“限幅”和“消抖”的优点
改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
C、缺点:
对于快速变化的参数不宜

热门招聘
相关主题

官方公众号

智造工程师