[英]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:
計算頻率/周期,
使用結果設置查找最大/分鍾的范圍大小,
掃描您的數據以查找最大值和分鍾數。
最好的方法是實現一個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.