打印
[C语言]

有空的进来讨论一下,怎么快速有效获得数据串最大数据偏差

[复制链接]
719|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序里面,对于数据串处理,会因为某些偶发干扰,导致数据串无效,那么有效识别出数据串波动,则是我们一个经常可能碰到的需求了。
这里先起一个头,最直接想到的肯定是,数据串排序,然后直接首尾相减,就可以获得,当然我们也会知道,当数据串长度比较长,而哪种排序方法,都经过多次迭代,运算量比较大,内存占用比较高,所以肯定不是最佳方法。
这里我先说一个我对于此类问题采用的方法(16位为例):
1、开2个寄存器,一个初值0,一个初值满位1。
2、0的寄存器和数据串元素比较大,大的则赋值给该寄存器。
3、FFFF的寄存器和数据串元素比较小,小的则赋值给该寄存器。
4、遍历数据串
5、2寄存器减法,结果就是数据波动值
这个方法,每元素做2次比较并可能执行赋值,动作可以在每个数据采集后即时完成。所以代码少,运行效率高。
这里发这个帖子,我当然不是认为我这个方法已经最优了,是想着大家能七嘴八舌的闲聊一下,是不是有更少的计算,更有效的获取该目标。
顺便这里提一个思考题,典型的我们另外一种是数据串需要去掉一个最大值,去掉一个最小值,是不是通过上面方法,扩展一下实现,代码效率如何?或者还是排序更有效?



使用特权

评论回复

相关帖子

沙发
R2D2| | 2019-9-18 19:32 | 只看该作者
最有效的办法就是把偶发干扰拍死在硬件处理上,不让软件看到,我一直都是这么做的。

使用特权

评论回复
板凳
叶春勇| | 2019-11-23 11:02 | 只看该作者
排序的方法的算法复杂度:  O(N*LOG(N))
查找最大值 O(N)
查找最小值 O(N)
你的问题是要获取数据串的最大偏差。
用排序的方法肯定开销大, O(N*LOG(N))  是肯定大于O(N)算法的。
至于找最大最小数:
1、有快速排序的,分块算法,就是用一个值,把大于某一值放在一边,小于某一值放一边,从两个小数组去找。
2、堆排序里的,最大堆,最小堆。
都是O(N),且还有移动数据的不必要操作。肯定比查找要慢些
至于还要快,估计是空间换时间。
桶排序。
用O(N)级别的速度排序,然后取最大值和最小值。这种单片机实现起来代价太大。
推测求最大值最小值得偏差,是不是交流电流测量之类的。
至于你的思考题:
我现在基本不会用,采集多少次,然后去最大,去最小,求平均值。在sop8单片机基本用了,代码很长。
后来用iir数字滤波,典型的是一阶rc滤波,效果还行。
单片机优化如下:



使用特权

评论回复
地板
tianxj01|  楼主 | 2019-11-23 15:31 | 只看该作者
叶春勇 发表于 2019-11-23 11:02
排序的方法的算法复杂度:  O(N*LOG(N))
查找最大值 O(N)
查找最小值 O(N)

IIR数字滤波,还是很实用的,我在有些连续平均值系统上也常用。

使用特权

评论回复
5
叶春勇| | 2019-11-23 15:57 | 只看该作者
tianxj01 发表于 2019-11-23 15:31
IIR数字滤波,还是很实用的,我在有些连续平均值系统上也常用。

单片机论坛冷清,还是模拟版块人气旺

使用特权

评论回复
6
tianxj01|  楼主 | 2019-11-23 16:01 | 只看该作者
叶春勇 发表于 2019-11-23 15:57
单片机论坛冷清,还是模拟版块人气旺


差不多可以用门可罗雀来形容了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

3210

帖子

87

粉丝