2012-05-12 81 views
0

背景:我有一個IOIO用於測量光電二極管的輸出,這是轉換成數字輸出。我需要找到信號在1和0之間變化的頻率。到目前爲止,我嘗試過的所有內容都會掛起我的測試應用程序,有什麼建議嗎?來自二進制輸入的頻率

當前代碼:

if(diode == 1 && frequencyFound == false){ 
    startTime = System.currentTimeMillis(); 
    while((frequencyFound == false)){ 
    if(diode == 0){ 
     while(frequencyFound == false){ 
      if(diode == 1){ 
       double endTime = System.currentTimeMillis(); 
       time = endTime - startTime; 
       frequency = (long) (1.0/time); 
       frequencyFound = true; 
      } 
      Thread.sleep(100); 
     } 
    } 
    Thread.sleep(100); 
    } 
} 
+0

難道你不需要做一些事情來真正地採樣二極管的值嗎? –

+0

上面的代碼在UI線程中執行(=沒有創建'AsyncTask'或其他類型的'Thread'來執行該代碼)?這將解釋你的應用程序掛起。 – zapl

回答

1

有幾個問題在這裏。首先,Android是一個多任務系統,你可以發現你的定時線程睡眠時間足夠長,以致錯過一些信號轉換。是否沒有辦法通知領先(或結尾)邊緣過渡而不是採樣循環中的輸入?

你在看什麼頻率? 100毫秒採樣間隔是否足夠好?

不要指望Thread.sleep()在您指定的時間內進入睡眠狀態。如果時間間隔太短,系統可能會決定立即返回,或者可能會將睡眠時間調整爲較大的值。

你的定時循環不會記錄任何精度超過100ms(最好)的時間,所以你對頻率的估計將會很差。

Zapl是正確的,你必須從你的UI線程的一個單獨的線程運行這個。

觀察單個轉換會給你一個非常不準確的頻率估計。嘗試這樣的事情,而不是:

// Find frequency to the nearest hz (+/- 10%) 
// It's assumed that some other process is responsible for updating the "diode" 
// variable. "diode" must be declared volatile. 
long duration = 1000; // 1 second 
final int interval = 100; // sampling inteval = .1 second 
int oldState = diode; 
int count = 0; 
final long startTime = System.currentTimeMillis(); 
final long endtime = startTime + duration; 
while (System.currentTimeMillis() < endtime) { 
    // count all transitions, both leading and trailing 
    if (diode != oldState) { 
    ++count; 
    oldState = diode; 
    } 
    Thread.sleep(interval); 
} 
// find the actual duration 
duration = System.currentTimeMillis() - startTime; 
// Compute frequency. The 0.5 term is because we were counting both leading and 
// trailing edges. 
float frequency = 0.5 * count/(duration/1000); 
1

兩個比較極端的建議,爲周圍的一些定時精度的工作涉及愛德華提出:

  • 做的間隔時間測量上IOIO板下中斷,其中你大概可以完成(至少接近)實時操作。將這些時間測量值報告給Android設備。

  • 跳過ioio板,並建立一些簡單的信號路由到耳機連接器作爲打開或關閉的音調。使用音頻系統的內置時間保證記錄音頻,然後分析音頻緩衝區(不再需要實時),以確定從中間音頻樣本數量的時間間隔(以相對可靠的相對於任何您可以在Android應用程序中完成)音頻採樣率。您還可以通過使用光傳感器來改變音頻振盪器的頻率,從而輕鬆獲得模擬輸入。

+0

我得在這裏給克里斯·斯特拉頓一個滿意的答卷。他是對的;如果IOIO板是可編程的,那麼這就是你應該進行頻率測量的地方。 –