技术论坛

中值滤波库(不排序,已验证)

作者 主题
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
主题:中值滤波库(不排序,已验证)
精华帖精华帖星级4级 推荐帖


只看楼主 只看精华 楼主 2010-11-15 13:57:17
本程序适用于PID回路反馈控制信号的滤波处理,可以减少或防止受控设备抖动。
占用存储器数量=表长*2+16B。(数据区长度最小为4,最大为64)
表长=64的情况下耗时24.4mS,表长=4时,耗时3.3mS。
设计该库,是我一直以来的一个梦想。以前用数组滤波,稳定有了,偏差又来了。
面对调节阀的抖动,我十分心痛,不知道它这一生做了多少无用功。
如果因此而延长了调节阀寿命,不说省钱,少一次故障、少一次维修,也算是为低碳经济做贡献。

密码自己找1718
滤波效果图(下载)
量程&滤波(下载)

(2011-6-12增补:库中参数及说明请看5楼)
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=761108&b_id=3&s_id=0&num=78

版主

经验值: 25993
发帖数: 11808
精华帖: 43
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 1楼 2010-11-15 14:41:33
1、你发给我,帮你上传。
2、不排序?是不是在数据进/出队列时,预先记录最大/最小值?
 
以下网友喜欢您的帖子:

  
侠士

经验值: 1093
发帖数: 351
精华帖: 0
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 2楼 2010-11-15 14:54:06
这是我的邮箱。gzc633@126.com.
让斑竹帮你传上来~大家一同分享。
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 楼主 3楼 2010-11-15 15:01:39
quote:以下是引用yanxiao在2010-11-15 14:41:33的发言:
1、你发给我,帮你上传。
2、不排序?是不是在数据进/出队列时,预先记录最大/最小值?

在累加时找到最大、最小值。然后记入表头。数据表是环形结构,环长即为表长。当前指针总是指向即将被覆盖的最早的数据存储单元。
另外库程序已经发至您的邮箱。
优化后的程序采用块传递方式,比初稿耗时减少了30%。

请您验证一下,如果确认了滤波库的价值,我为此申请加精。
同时感谢芳季给予的提示、感谢鼠老爹前面发过的中值滤波的启示。

制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 4楼 2010-11-15 15:28:35
我先确认一个事情,
你程序当最大值去掉之后,能找到次大值吗?
还有一个问题:什么叫做最大值?最小值?这里我的理解有点矛盾。
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 楼主 5楼 2010-11-15 15:36:58
程序运行步骤详解

读数--需要滤波的数据(整型,取值范围-32000~32000)
表长--参与滤波计算数据区数据个数(长整型,取值范围4~64)
最大值--存储在数据区内的最大值
最小值--存储在数据区内的最小值
输出--数据区内去除最大值和最小值后的平均值
输出=(总和-最大值-最小值)/(表长-2)
前值--前一次的输出值


读入存储区特征单元16B。
读数大于数据区最大值时,如果最大值标志位=0,直接舍弃,令最大值标志位=1,直接输出前值。
读数大于数据区最大值时,如果最大值标志位=1,记入数据区。
读数小于数据区最小值时,如果最小值标志位=0,直接舍弃,令最小值标志位=1,直接输出前值。
读数大于数据区最小值时,如果最小值标志位=1,记入数据区。
记入数据:
读数写入当前指针指向的数据单元。
最小值标志位、最大值标志位复位。
将前值传递给最大值、最小值寄存器(实现最大值、最小值寄存器的初始化,该值在下面将要进行的比较、替换操作结束后得到数据区的最大值和最小值)。
当前指针如果已经是表尾,令当前指针指向数据区开始单元,否则下移。
累加数据区数据,同时与最大值、最小值寄存器比较,找出最大值、最小值。
从累加器减掉当前最大值,减掉当前最小值之后,用(数据个数-2)去除,得到平均值。
刷新存储区的特征单元16B。
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
版主

经验值: 25993
发帖数: 11808
精华帖: 43
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 6楼 2010-11-15 16:14:14
去掉两个最大(小)值,一个是直接丢掉的,一个是从队列中比较出来再丢的。丢两个是在两极振荡时才发生,一般只会丢一个。是不是这样?
已上传附件,程序我稍后再看。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 7楼 2010-11-15 16:14:50
当前读数大于数据区最大值时,舍弃,并置位最大值标志位,直接输出前值。
(这时是否刷新最大值记录)
当前读数大于数据区最大值时,最大值标志位已置位,记入数据区。
(?)(这个是不是应该是小字)
当前读数小于数据区最小值时,舍弃,并置位最小值标志位,直接输出前值。

当前读数大于数据区最小值时,最小值标志位已置位,记入数据区。
(最大最小标志什么时候复位)
将前值传递给最大值、最小值寄存器。
(前值是指采样前值?)(什么条件传递最大最小值)
累加数据区数据,同时与最大值、最小值寄存器比较,找出最大值、最小值。

从累加器减掉当前最大值,减掉当前最小值之后,用(数据个数-2)去除,得到平均值。
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 楼主 8楼 2010-11-15 16:26:14
quote:以下是引用yanxiao在2010-11-15 16:14:14的发言:
去掉两个最大(小)值,一个是直接丢掉的,一个是从队列中比较出来再丢的。丢两个是在两极振荡时才发生,一般只会丢一个。是不是这样?
已上传附件,程序我稍后再看。

可以这样理解。

谢谢帮忙上传。

制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(已经完成测试)


只看楼主 只看精华 楼主 9楼 2010-11-15 16:28:22
引用(这时是否刷新最大值记录)

我已经修改原帖,写出了所有步骤。
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
至圣

经验值: 17408
发帖数: 6225
精华帖: 18
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 10楼 2010-11-16 20:33:33
读数和表长是什么意思?
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 楼主 11楼 2010-11-17 08:28:06
quote:以下是引用LaoHuai在2010-11-16 20:33:33的发言:
读数和表长是什么意思?

已经增加了这部分解释,请看5楼。
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 12楼 2010-11-17 09:37:37
引用5楼<将前值传递给最大值、最小值寄存器。>
为何要传前值。前值是不是上一次采样的值?
最大值最小值是指多大的一个范围里的最最值。这个范围怎么定义?这个最不明白。
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 楼主 13楼 2010-11-17 10:29:59
quote:以下是引用芳季在2010-11-17 09:37:37的发言:
引用5楼<将前值传递给最大值、最小值寄存器。>
为何要传前值。前值是不是上一次采样的值?
最大值最小值是指多大的一个范围里的最最值。这个范围怎么定义?这个最不明白。

已经写在5楼。如果有再有问题需要澄清,我继续在五楼增补。
谢谢您的支持与关注。
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
至圣

经验值: 17408
发帖数: 6225
精华帖: 18
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 14楼 2010-11-17 11:27:30
假如有n个数,去掉一个最大再去掉一个最小,其余做平均是不是这样?
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 楼主 15楼 2010-11-17 11:38:45
quote:以下是引用LaoHuai在2010-11-17 11:27:30的发言:
假如有n个数,去掉一个最大再去掉一个最小,其余做平均是不是这样?

是的!
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
至圣

经验值: 17408
发帖数: 6225
精华帖: 18
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 16楼 2010-11-17 15:33:14
那你的程序写复杂了。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 17楼 2010-11-17 16:33:13
我始终解开不了一个疑惑。次大值和次小值会不会成为最大值最小值。
一批数据输入后,一次性确认最大值最小值,去掉,然后平均;
还是逐一推移遇见最值就去掉并即时平均。
比如连续输入12个数
10;10;10;10;11;10;10;12;10;10;10;10
当遇到11的时候丢弃不?当遇到12的时候丢弃不?如果表长是8的话。那输入这12个数之后会有几次计算结果。并且值是多少?
可否模拟一下?
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 18楼 2010-11-17 16:36:37
第一个10的时候,结果是:
第二个10的时候,结果是:
第三个10的时候,结果是:
第四个10的时候,结果是:
第五个11的时候,结果是:
第六个10的时候,结果是:
第七个10的时候,结果是:
第八个12的时候,结果是:
第九个10的时候,结果是:
第十个10的时候,结果是:
第十一个10的时候,结果是:
第十二个10的时候,结果是:
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7092
发帖数: 3450
精华帖: 26
回复:不排序中值滤波库(共享,可下载)


只看楼主 只看精华 楼主 19楼 2010-11-17 16:59:14
“当遇到11的时候丢弃不?当遇到12的时候丢弃不?如果表长是8的话。那输入这12个数之后会有几次计算结果。并且值是多少? ”

第一个10就会丢弃,最大值标志位置位,第二个10记入,同时复位最大值标志位,遇到11再丢,最大值标志位置位,记入后面两个10,在记入12时,复位最大值标志位,记入后面的10,此时数据区填满8个有效数,输出我们要的平均值10。这个10=(82-10-12)/(8-2)

空表填满后的程序执行过程就可参照5楼的说明了。
制冷、热工-许可证试验室承建,给了我深究测量与控制的绝好机会。分享-值得期待!
以下网友喜欢您的帖子:

  
收起
中值滤波库(不排序,已验证)
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。