目标:从复合摆中找出传感器数据的峰值(v,t)。
使用的传感器每秒提供1024个数据脉冲。测试需要15秒到1分钟,所以很多行都写入文件。我有一个打开excel 48000行。绘制时,这会产生一个经过0的阻尼振荡图(有+ v和-v)。我想自动找到峰值(v,t)并将它们写在彼此之下
所有数据分为两列,左边是时间,右边是速度。有时候有很长的峰值,最多速度在几行之前保持不变,然后再次下降。我想绝对的高峰,所以时间的平均值。 Capture from excel
我试过了:
在右边的单元格中
= IF(AA6&LT = AA5; 1; 0)
右边的细胞
= IF((OR(AND(AB5 = 1; AB6 = 0);以及(AB5 = 0; AB6 = 1))); 1; 0)
这里的想法是它产生一个0或1.当两个单元格都是1时,那应该是峰值,但这不起作用,因为速度在峰值处保持一段时间。
有没有一种简单的方法可以在Excel中执行此操作,还是应该考虑其他方法(VBA)?
提前谢谢!
答案 0 :(得分:2)
假设您有多个MAX和Mins,则无法使用简单的电子表格公式。你需要做一些VBA:
计算频率/期间
使用结果设置查找最大/分钟范围的大小,
扫描您的数据以查找最大值和分钟数。
最好的方法是实现一个Ki-Square拟合,提取频率和相位,并使用得到的参数来提供一个能够为你提供最大值和分钟数的函数。
答案 1 :(得分:1)
感谢您的快速回答。
我最终在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
End Sub
如果我避免使用活动细胞可能会更快,但我稍后会对此进行处理。它为我节省了很多时间。