我目前正在編寫一個可用作互聯網收音機的Android應用程序。該應用程序的部分功能是通過紅外遙控器進行控制。紅外遙控代碼通過麥克風端口以模擬音頻形式輸入。如果我記錄一些信號並在Audacity中查看它們,我很容易看到每個代碼是什麼。例如,以下是0111111010011001011111101000001或0x3F4CBF41。 我的問題是我怎樣才能以編程方式檢測這些信號,當他們進來,並將其轉換爲整數代碼數字。我已經研究過一些打包的解決方案,比如LIRC,但是它們都是用C編寫的,很難整合。在我看來,像土生土長的人會爲了做這樣簡單的分析而殺人太多。我還研究了諸如musicg之類的圖書館,但我找不到任何實時轉換代碼的簡單方法。通過音頻輸入解碼遠程控制代碼
回答
從您的問題中可以清楚地看到您熟悉PWM和讀取從IR接收器接收到的信號的方法。因此,我研究瞭如何使用java將數據存儲在一個方法中,您可以像您的大膽窗口一樣輕鬆地解釋這些數據。
有幾個方法javax.sound.sampled.spi我認爲會有所幫助。
第一個是getAudioStream()的AudioFileReader
。這會返回一個AudioStream
,它有幾個可能證明有用的方法。我認爲最適合你使用的那個是read(),它返回流中的下一個字節。如果更方便,可以提供一個字節數組來讀取部分甚至整個流。
所以現在你有一個字節的列表或數組,你可以定期地將它們解釋爲高或低(因爲這是採樣音頻,每個字節之間的時間是恆定的),這就是PWM解碼所需要的!
通過找到一個近似的端點,您可以隨時間變換一個字節模式爲高/低持續時間模式。因爲我知道你可以閱讀(在你的問題中演示),我將跳過迂腐轉換,但將hhhlhllhhhhhhlllhh
轉換爲代碼的十六進制表示很簡單。
TL; DR:捕獲流,讀取每個字節,通過時間轉換,轉換爲二進制。
謝謝你的回覆。我遵循你的建議,我肯定會取得進展。現在我所瞭解的是框架的方式似乎比Audacity中的波動更多。它們在一個脈衝中多次在正數和負數之間來回反彈。你能想到一個解釋嗎? – krispy
嘗試更改您的採樣率。 –
您可能需要後處理紅外傳感器數據。以非常高的速率採樣,然後對樣本進行時間平均以獲得平滑的信號。例如t = 9/10 * t + 1/10 * t0 –
- 1. Portaudio + Opus編碼/解碼音頻輸入
- 2. 音頻輸入和輸出(Android代碼)
- 3. 通過控制檯輸入密碼
- 4. 通過HTML代碼控制python代碼
- 5. 通過解碼Base64播放音頻
- 6. 使用FFMpeg解碼音頻通過Android
- 7. 通過HTML5輸入音頻?
- 8. 如何通過ASCII控制代碼與Progress 4GL分割輸入?
- 9. 如何從通過遠程桌面訪問的PC的音頻輸入錄製?
- 10. FFMPEG音頻解碼
- 11. 視頻/音頻編碼/解碼/播放
- 12. 如何通過代碼控制android設備的音量?
- 13. 如何通過C#代碼控制語音平衡
- 14. C/C++ - 瞭解音頻插值代碼
- 15. 解碼音頻/音頻播放(AS3)
- 16. Mirc控制代碼到html,通過php
- 17. WireframeSketcher通過源代碼控制共享
- 18. 無法通過代碼訪問控制
- 19. HTML音頻控制通過腳本
- 20. 如何通過代碼遠程解鎖android手機
- 21. 瞭解淺複製通過代碼
- 22. 使用NSURLSession播放遠程音頻,代碼批評
- 23. 源代碼控制誤解
- 24. 通過IIS的音頻編碼mvc4
- 25. C++多線程解碼音頻數據
- 26. 哪個線程用於音頻解碼?
- 27. 遠程I/0輸出寫入和編碼到文件 - 核心音頻
- 28. 控制檯輸入掩碼
- 29. 通過代碼解決彈道方程
- 30. Symfony過程吃終端控制代碼
我不確定我明白這裏缺少哪些信息。我應該附加一個包含數據的聲音文件嗎?到目前爲止我的應用程序不記錄和保存數據。它通過麥克風端口作爲模擬信號進入。經過處理後,我期望的唯一輸出是一個代表遠程代碼的整數,正如我在問題中提到的那樣。你能更具體地瞭解什麼是缺失?至於複雜性,我花了很多時間編寫計算機視覺應用程序。我認爲這種複雜性會相似。我錯了嗎? – krispy
@Xaver作爲爲類似需求開發專有解決方案的人,我必須同意海報,已提供必要的信息。你的問題只是與帖子問題相關的好奇心。 –