CSV摆动数据,简单的峰值查找与excel
目标:查找复摆的传感器数据的峰值(v,t)。
所使用的传感器每秒提供1024个脉冲数据。 testing需要从15秒到1分钟,所以很多行被写入到一个文件。 我有一个在Excel中打开的是48000行。 当绘制时,这会产生一个经过0的阻尼振荡图(有+ v和-v)。 我想自动find峰值(V,T),并把它们写在对方下面
所有的数据都在两列,时间在左边,速度在右边。 有时会出现长峰,最高速度在再次下降之前保持不变。 我想绝对的高峰,所以时间的意思。 从excel中捕获
我努力了:
在右边的单元格中
= IF(AA6 <= AA5; 1; 0)
并在右边的单元格
= IF((OR(AND(AB5 = 1; AB6 = 0);以及(AB5 = 0; AB6 = 1))); 1; 0)
这里的想法是,它产生一个0或1.当两个单元格都是1那么这应该是峰值,但这是行不通的,因为速度在峰值保持相同的一段时间。
有没有一种简单的方法来做到这一点在Excel中,或者应该考虑其他方法(VBA)?
先谢谢你!
假设你将有几个MAXes和Mins,你不能用简单的电子表格公式来做。 你需要做一些VBA来:
-
计算频率/周期,
-
使用结果来设置你寻找最大/最小的范围的大小,
-
扫描您的数据以查找最大值和最小值。
最好的方法是实现一个Ki-Square拟合,提取频率和相位,并使用结果参数来提供一个函数,这个函数会给你最大值和最小值。
谢谢你们的快速响应。
我最终做了VBA,但不是你的方法。 我使用了基本的逻辑,对我的应用程序来说工作得很好。 代码可能不是最优的,但我相当满意。
这里是代码:
Private Sub peak_find()
Dim j, k As Integer Dim t As Double j = 0 Do While Not IsEmpty(ActiveCell.Value) If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then k = 0 Do While ActiveCell.Value = ActiveCell.Offset(k, 0).Value k = k + 1 Loop If ActiveCell.Value > ActiveCell.Offset(k, 0).Value And ActiveCell.Value > ActiveCell.Offset(-1, 0).Value And ActiveCell.Value > 0 Then k = k - 1 Range("E1").Offset(j, 0).Value = ActiveCell.Value t = (ActiveCell.Offset(0, -1).Value + ActiveCell.Offset(k, -1)) / 2 Range("D1").Offset(j, 0).Value = t j = j + 1 ElseIf ActiveCell.Value < ActiveCell.Offset(k, 0).Value And ActiveCell.Value < ActiveCell.Offset(-1, 0).Value And ActiveCell.Value < 0 Then k = k - 1 Range("G1").Offset(j, 0).Value = ActiveCell.Value t = (ActiveCell.Offset(0, -1).Value + ActiveCell.Offset(k, -1).Value) / 2 Range("F1").Offset(j, 0).Value = t ElseIf ActiveCell.Value > ActiveCell.Offset(k, 0).Value And ActiveCell.Value < ActiveCell.Offset(-1, 0).Value Then End If ElseIf ActiveCell.Value > ActiveCell.Offset(1, 0).Value And ActiveCell.Value > ActiveCell.Offset(-1, 0).Value Then Range("E1").Offset(j, 0).Value = ActiveCell.Value Range("D1").Offset(j, 0).Value = ActiveCell.Offset(0, -1).Value j = j + 1 ElseIf ActiveCell.Value < ActiveCell.Offset(1, 0).Value And ActiveCell.Value < ActiveCell.Offset(-1, 0).Value Then Range("G1").Offset(j, 0).Value = ActiveCell.Value Range("F1").Offset(j, 0).Value = ActiveCell.Offset(0, -1).Value End If ActiveCell.Offset(1, 0).Activate Loop Range("D1").Activate
结束小组
如果我避免使用活动单元格,这可能会更快,但我会在稍后处理。 这节省了我很多时间。