2010-05-29 18 views
3

我正在嘗試編寫一個程序來自動執行一個更無聊和重複的工作任務。我有一些編程經驗,但沒有處理或解釋大量數據,所以我正在尋求你的建議(包括技巧嘗試的建議以及閱讀內容以瞭解更多關於做這些事情的內容)。科學數據處理(圖形比較和解釋)

我有一臺設備通過重複採樣並在屏幕上以圖形形式顯示讀數來監視實驗。實驗的輸入可以改變,其中一個改變應該在圖中我目前確定的部分產生變化,這是我在實驗中尋找的。我想將其自動化,以便計算機查看一組結果並找出引起變化的實驗輸入。

我已經可以從機器中提取結果。目前,它們的運行結果是整數數組,其索引是樣本編號,相應的值是度量值。

對於每次實驗運行,圖形的整體形狀將是相似的。我正在尋找的變化將大致相同,並且每次都會發生在大致相同的地方,以便進行正確的實驗輸入。不幸的是,有一些陷阱讓這個問題更加困難。

  1. 測量過程中存在一些噪聲,這意味着測量值在不同運行之間存在一些隨機變化。雖然圖形的整體形狀保持不變。

  2. 實驗所花費的時間在每次運行時會稍有不同,從而導致兩種效應。首先,整個圖可能會在x軸上相對於另一個運行圖略微偏移。其次,單個特徵在不同運行中可能會稍微更寬或更窄。

在這兩種情況下,變化不是特別大,您可以假設唯一的非隨機變化是由正確的輸入引起的。

回答

2

我想你在尋找關於Digital Signal Processing的信息。它可以從非常簡單到非常難以理解的範圍。例如,如果你的事件前信號爲0,並且相關信號之後的每個信號都是1,那麼你可以只查找第一個信號,找出它發生的時間,然後你就完成了。這基本上是簡單性的限制,它可能是一個開始的好地方。實現這一點,你已經開始瞭解如何回答你的問題。那麼,現在,你有噪音。所以說,事件前的範圍可能從-10到10,事後的範圍可能從90到110.仍然很簡單;注意第一個大於10的值。但是,它當然不是那麼簡單。您可能需要平均一個讀數窗口,可能會尋找一些前一次測量的變化閾值等。在高級情況下,您可以使用轉換到其他空間,應用濾波器,模式匹配等。但從你的描述來看,這聽起來像是相當簡單的方法應該爲你做這項工作。不要被像FFT這樣的概念嚇倒 - 你可能不需要它們。至少現在,假設它可以簡單地解決。從一個簡單的(但不夠)解決方案開始,並朝着可行的解決方案邁進。

+0

嗨卡爾,感謝您的建議,數字信號處理絕對是該領域,我已經修改了標籤以包含它。我目前正在通過一本關於DSP的在線書籍,但還沒有遇到任何與此問題相關的技術,但我認爲它只是時間問題。 – PinkyNoBrain 2010-05-31 16:05:15

1

一種值得關注的技術,如果卡爾建議的那種過濾器和閾值方法是不夠的Cross Correlation。其實質非常簡單:如果兩個數據集合理相似,則它們的點積將在對齊時最大化(因爲最高值將相乘)。因此,您可以通過在每個偏移量上計算該產品並選擇能夠產生最高結果的產品來獲得如何排列它們的良好估計。

在像你這樣的情況下,這個想法應該是讓您尋找一個「理想」的曲線形狀 - 從理論/模擬或者通過對許多良好實驗曲線的結果進行平均通過眼睛識別並對齊 - 並將其與實驗數據進行比較。

爲簡單起見,我們假設數據集比理想的要長,並且在兩端都有足夠的空白空間,我們可以忽略任何邊界問題。既然你正在尋找一個特定的事件,那麼削減你的理想來遵守這個假設應該是微不足道的。在Java中粗略地編碼,然後,該過程可能會去是這樣的:

int offset (double[] data, double[] ideal) 
{ 
    double cMax = -Double.MAX_VALUE; 
    int tMax = 0; 

    for (int t = 0; t < data.length - ideal.length; ++t) 
    { 
     double c = 0; 
     for (int i = 0; i < ideal.length; ++i) 
     { 
      c += data[t + i] * ideal[i]; 
     } 

     if (c > cMax) 
     { 
      cMax = c; 
      tMax = t; 
     } 
    } 

    return tMax; 
} 

顯然,有很多的情況,即這種方法可能失敗,尤其是如果有非獨立的噪音或者如果一個顯著量信號的週期性會產生aliasing。而且,這個例子拋棄了大量的信息,只關注絕對最大值,如果互相關中沒有大的,窄的峯值,這可能是容易出錯的。但從您的描述看來,您的問題似乎可以順應這些方面。