CSV振荡数据,简单的峰值查找与excel

时间:2016-11-15 14:12:27

标签: excel csv

目标:从复合摆中找出传感器数据的峰值(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)?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

假设您有多个MAX和Mins,则无法使用简单的电子表格公式。你需要做一些VBA:

  1. 计算频率/期间

  2. 使用结果设置查找最大/分钟范围的大小,

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

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

如果我避免使用活动细胞可能会更快,但我稍后会对此进行处理。它为我节省了很多时间。