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来:

  1. 计算频率/周期,

  2. 使用结果来设置你寻找最大/最小的范围的大小,

  3. 扫描您的数据以查找最大值和最小值。

最好的方法是实现一个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 

结束小组

如果我避免使用活动单元格,这可能会更快,但我会在稍后处理。 这节省了我很多时间。