2014-07-19 77 views
9

我目前正在編寫一個可用作互聯網收音機的Android應用程序。該應用程序的部分功能是通過紅外遙控器進行控制。紅外遙控代碼通過麥克風端口以模擬音頻形式輸入。如果我記錄一些信號並在Audacity中查看它們,我很容易看到每個代碼是什麼。例如,以下是0111111010011001011111101000001或0x3F4CBF41。 enter image description here 我的問題是我怎樣才能以編程方式檢測這些信號,當他們進來,並將其轉換爲整數代碼數字。我已經研究過一些打包的解決方案,比如LIRC,但是它們都是用C編寫的,很難整合。在我看來,像土生土長的人會爲了做這樣簡單的分析而殺人太多。我還研究了諸如musicg之類的圖書館,但我找不到任何實時轉換代碼的簡單方法。通過音頻輸入解碼遠程控制代碼

+1

我不確定我明白這裏缺少哪些信息。我應該附加一個包含數據的聲音文件嗎?到目前爲止我的應用程序不記錄和保存數據。它通過麥克風端口作爲模擬信號進入。經過處理後,我期望的唯一輸出是一個代表遠程代碼的整數,正如我在問題中提到的那樣。你能更具體地瞭解什麼是缺失?至於複雜性,我花了很多時間編寫計算機視覺應用程序。我認爲這種複雜性會相似。我錯了嗎? – krispy

+2

@Xaver作爲爲類似需求開發專有解決方案的人,我必須同意海報,已提供必要的信息。你的問題只是與帖子問題相關的好奇心。 –

回答

5

從您的問題中可以清楚地看到您熟悉PWM和讀取從IR接收器接收到的信號的方法。因此,我研究瞭如何使用java將數據存儲在一個方法中,您可以像您的大膽窗口一樣輕鬆地解釋這些數據。

有幾個方法javax.sound.sampled.spi我認爲會有所幫助。

第一個是getAudioStream()AudioFileReader。這會返回一個AudioStream,它有幾個可能證明有用的方法。我認爲最適合你使用的那個是read(),它返回流中的下一個字節。如果更方便,可以提供一個字節數組來讀取部分甚至整個流。

所以現在你有一個字節的列表或數組,你可以定期地將它們解釋爲高或低(因爲這是採樣音頻,每個字節之間的時間是恆定的),這就是PWM解碼所需要的!

通過找到一個近似的端點,您可以隨時間變換一個字節模式爲高/低持續時間模式。因爲我知道你可以閱讀(在你的問題中演示),我將跳過迂腐轉換,但將hhhlhllhhhhhhlllhh轉換爲代碼的十六進制表示很簡單。

TL; DR:捕獲流,讀取每個字節,通過時間轉換,轉換爲二進制。

+0

謝謝你的回覆。我遵循你的建議,我肯定會取得進展。現在我所瞭解的是框架的方式似乎比Audacity中的波動更多。它們在一個脈衝中多次在正數和負數之間來回反彈。你能想到一個解釋嗎? – krispy

+0

嘗試更改您的採樣率。 –

+0

您可能需要後處理紅外傳感器數據。以非常高的速率採樣,然後對樣本進行時間平均以獲得平滑的信號。例如t = 9/10 * t + 1/10 * t0 –