簡體   English   中英

CSV振盪數據,簡單的峰值查找與excel

[英]CSV oscillating data, simple peak find with excel

目標:從復合擺中找出傳感器數據的峰值(v,t)。

使用的傳感器每秒提供1024個數據脈沖。 測試需要15秒到1分鍾,所以很多行都寫入文件。 我有一個打開excel 48000行。 繪制時,這會產生一個經過0的阻尼振盪圖(有+ v和-v)。 我想自動找到峰值(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)?

先感謝您!

假設你有幾個MAX和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

結束子

如果我避免使用活動單元格可能會更快,但我會稍后再努力。 它為我節省了很多時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM