Board logo

標題: [發問] 如何判斷週期訊號? [打印本頁]

作者: acdx    時間: 2013-6-6 10:34     標題: 如何判斷週期訊號?

我有一組數字fm1=32.2, fm2=44.3, fm3=63.0, fm4=79.1, fm5=95.2, fm6=111.3
我以陣列的型式將它寫入成
fm(0)=32.2
fm(1)=44.3
fm(2)=63.0
fm(3)=79.1
fm(4)=95.2
fm(5)=111.3
我要判斷這幾個數之間是否有一固定週期(間隔),並排除其中個別週期 例如:
fm(1)-fm(0)=12.1
fm(2)-fm(1)=18.7
fm(3)-fm(2)=16.1
fm(4)-fm(3)=16.1
fm(5)-fm(4)=16.1
所以固定週期(間隔)應為16.1, 而fm(1)=44.3這個數顯然有偏差故將它排除
以上的例子直接看很容易判斷 但是該如何讓成是來做判斷呢?
請板上的高手給個建議 謝謝
作者: stillfish00    時間: 2013-6-6 12:11

回復 1# acdx
例子怪怪的 若固定周期16.1,則 fm(1) 應為 46.9;fm(0) 應為 30.8
這樣兩個都有偏差都要排除?
作者: acdx    時間: 2013-6-6 12:29

回復 2# stillfish00


原始數據為量測結果 我的程式是為了協助分析
所以有些許誤差是可接受的(+/- 1.5以內可視為相同) 但是要排除個別的雜訊
作者: Hsieh    時間: 2013-6-6 15:06

回復 3# acdx
  1. Sub nn()
  2. Dim Ar()
  3. k = 1.5 '容許誤差
  4. fm = Array(32.2, 44.3, 63, 79.1, 95.2, 111.3) '常數陣列
  5. Set d = CreateObject("Scripting.Dictionary")
  6. For i = 0 To UBound(fm)
  7. If i > 0 Then
  8. ReDim Preserve Ar(s)
  9. Ar(s) = fm(i) - fm(i - 1)
  10. s = s + 1
  11. End If
  12.    d(i) = fm(i)
  13. Next
  14. n = Application.Mode(Ar) '最常出現差值
  15. For i = LBound(fm) + 1 To UBound(fm) - 1
  16.    If d(i) - d(i - 1) < n - k Or d(i + 1) - d(i) > n + k Then
  17.    d.Remove i
  18.    End If
  19. Next
  20. MsgBox Join(d.items, Chr(10))
  21. End Sub
複製代碼

作者: acdx    時間: 2013-6-19 17:51

回復 4# Hsieh
我利用 n = Application.Mode(Ar) 來判斷最常出現的值
若是遇到整組數字無重複的值(無週期訊號時)程式則會出現error
這該如何修正呢?
作者: stillfish00    時間: 2013-6-20 14:56

回復 5# acdx
用回歸直線的方法排除差異過大的值,看看是否有幫助,
須注意這裡用的回歸直線是包含偏差值的資料所推出的直線,
所以deltaY值請自行斟酌
  1. Sub Test()
  2.     Dim d, fm
  3.     Dim a, b, it
  4.     Dim deltaY
  5.    
  6.     fm = Array(32.2, 44.3, 63, 79.1, 95.2, 111.3)
  7.     Set d = CreateObject("scripting.dictionary")
  8.     For i = 0 To UBound(fm)
  9.         d(i) = fm(i)
  10.     Next
  11.    
  12.     '回歸直線  fm=ax+b
  13.     a = WorksheetFunction.Index(WorksheetFunction.LinEst(d.items, d.keys), 1)
  14.     b = WorksheetFunction.Index(WorksheetFunction.LinEst(d.items, d.keys), 2)
  15.    
  16.     deltaY = 1.5  '與回歸線Y軸上的容許誤差
  17.     For Each it In d.keys
  18.         '排除誤差過大的值
  19.         If Abs((it * a + b) - d(it)) > deltaY Then d.Remove it
  20.     Next
  21.    
  22.     MsgBox Join(d.items, ",")
  23.     Set d = Nothing
  24. End Sub
複製代碼

作者: acdx    時間: 2013-6-26 15:37

回復 6# stillfish00
後來我把它改成這樣也可以

Sub nn()
Dim Ar()
k = 1.5 '容許誤差
fm = Array(32.2, 44.3, 63, 79.1, 95.2, 111.3) '常數陣列
Set d = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(fm)
If i > 0 Then
ReDim Preserve Ar(s)
Ar(s) = fm(i) - fm(i - 1)
s = s + 1
End If
   d(i) = fm(i)
Next
n = Application.Mode(Ar) '最常出現差值
If IsNumeric(n) = False Then
    n = 0
    MsgBox "無週期訊號"
   Exit sub
End If
For i = LBound(fm) + 1 To UBound(fm) - 1
   If d(i) - d(i - 1) < n - k Or d(i + 1) - d(i) > n + k Then
   d.Remove i
   End If
Next
MsgBox Join(d.items, Chr(10))
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)