如何判断用户选择的一段曲线的周期数(100分)

C

ctx62

Unregistered / Unconfirmed
GUEST, unregistred user!
我用单片机通过串口采集的数据,用chart的fastLine画出的曲线(有点类似于正弦曲线),用户可以在chart上任意的选择一段曲线,现需要知道用户选择了几个周期,
Y轴是电压,X轴是时间,数据都是已知的,曲线是不平滑的,因是从单片机采集的
数据,曲线有锯齿。
开始我想用求两个点的斜率,当斜率由正变为负再由负变为正就认为它是一个周期
可是因为曲线是不平滑的,所以这样不行。请各位大侠指点,谢谢
 
你可以对数据进行滑动窗口平滑处理,比如3点、5点算术平均,先消掉锯齿。
可以寻找一个阀值,最好在他们的总平均值附近。数据上由大于->小于就视为周期
开始,数据上由小于->大于就视为周期结束。把数据遍历一遍就是。
 
lujun兄:
能否给出具体代码,我这方面很笨,望指教。谢谢
 
无法的周期不固定吗?
如果因定的话,算一下两个点的横坐标的距离就可以了。
 
具体代码?我使用C++写的,考虑到具体需求有10多个子程序,而且遍历的不是
内存数组而是数据库,我看对你参考意义不大。这个流程(称不上算法)并不复杂,
需要的是你的一点点细心加耐心而已:
在全部数据的算术平均值附近寻找一个阀值(或者让它在运行时可以设置改变),
这个值对判断结果很重要。之后的事情就简单了,从起始数据开始,循环向后,数据平
滑之后的结果如果由大于阀值变为小于阀值,那么...如果由小于阀值变为大于阀值,那
么...你还要考虑好如果出现短暂波动的情况:就是在很短的间隔里出现波形反复,这个
可能是干扰,只要判断一下周期间隔就可以过滤掉。
这还不简单吗?这个思路已经实际系统验证通过。
 
贴出来吧,谢谢
 
和我的差不多啊,只不过我从单片机采集的数据是电流,
我是想判断曲线的走势是否和标准曲线一致,一个多月了,还没弄出结果呢,
 
我按lujun的方法试了一下,如果是一个很理想的曲线(比如正弦曲线)很容易做
算一下Y轴的平均值,然后用X轴的最小值到最大值(你选择的那一段)循环比较Y轴的
值,从大于平均值到小于平均值,再从小于平均值到大于平均值,就可以知道是
几个周期,但不知一个采集来的非理想的曲线如何去除哪些干扰的杂波(算法)
还忘lujun指教,
与子筠兄探讨,我的ctx62@msn.com
 
采集来的非理想的曲线去除干扰的杂波(算法)最简单的就是移动平均,前面已经讲
过了。还有曲线在绘制时要判断一下数据的有效性,去掉明显不正常的值(或用最接近的)
上下限值代替)。任何过滤都是去掉曲线的干扰数据,如果典型数据不是正弦波,而是其他
一些比如方波、多种波形的有规律的合成等等,就得靠你自己找波形的特征,判断算法自然
就有了(当然很复杂的波形可能不适用,这个大家多多探讨)。
平均值对周期单调的曲线进行周期判断比较关键,我的做法是留给操作员根据实际情况
自行设置,有最大的灵活性。可能会是经验值,而没有用什么平均值。
我的经验是,干扰自然会有,而且也不可能完全消除,但是只要你做足过滤等功夫,丢
失、多计几个周期还是可以接受的,能做得出一个可用的软件。
祝你好运!
 
顶部