计算相邻两个点的乘积看是否小于0,若小于0,则过零点。
比如有10个数据
1 2 3 2 1 -1 -2 -3 -1 1
第五个数据是1,第六个数据是-1,相乘小于0,因此数据点在五和六之间跨过零点。
类似的第九个数据-1,第十个是1,相乘小于0,因此数据点在九和十之间跨过零点。
基于这些跨过零点的位置,做差*2就是周期。
如果原始数据震荡强烈,反复越过零点,有几种方法进阶方法。
- 按照上面的方法计算,如果在某个值附近找到了多个零点,则对这些接近的值求平均。
- 不要计算相邻两个数据点的乘积,而是计算比如i*(i+2)或者i*(i+3)。比如若i*(i+2)<0,则认为零点是i+1;若i*(i+2)<0,则认为零点是i+2。
- 对原始数据做移动平均(Moving Average)。比如有10个数据1 2 3 2 1 -1 -2 -3 -1 1 ,如果对相邻2个数据做滑动平均,会得到9个数据点,第一个是(1+2)/2=1.5,第二个是(2+3)/2=2.5,…,第九个是(-1+1)/2=0。如果对相邻2个点做平均还是有多个零点,则可以对相邻3个做平均,相邻4个做平均,直到只有1个零点。你的原始数据有512个点,所以滑动平均之后少了几个点并不太影响。
这三种方法都可以解决上述问题,您可以试试看。
