2011-09-30 115 views
5

我目前正在開展一個比較簡單的項目,直到現在。基礎項目是使用音頻轉換在激光器上傳輸數據/消息。 簡而言之過程目前是這樣通過激光器進行Python音頻傳輸

  1. 用戶輸入一個消息
  2. 消息變成二進制
  3. 對於每個1和0的二進制消息中,它起着對應音調的信號,其在我的情況下,250赫茲爲1和450赫茲爲0.
  4. 輸出音頻通過立體聲電纜發送到音頻變壓器,使用鐳射裝置
  5. 太陽能電池板充當麥克風並記錄傳入「聲音」作爲文件
  6. 它們播放文件並讀取音調,並嘗試將每個250和450赫茲與1或0(這是我的問題所在)匹配。

直到聲音的實際處理很好,我目前的問題如下。

我在x時間播放每個音調,在接收端記錄y個時間,y時間被削減多次採樣,然後通過樣本分析樣本,然後記錄每個頻率。這是低效和不準確的。無論何時播放音調,我都有過許多問題,因爲它經常聽到兩次音,或根本聽不到它,這完全拋棄了整個信息。
我試圖將它的採樣率與每個音調播放的時間相匹配,但除非相應對齊,否則不起作用。我只對「測試」和「嗨」等消息進行過一些成功的測試。我已經看過bpsk和fsk,但我感覺好像我已經在做類似的事情,但是我有一個糟糕的接收端來破譯它。

這是全部用Python編寫的,我非常感謝您提供的任何提示,建議或可能的實現。另外對於音調發射,我使用pyaudiere和錄音我使用pyaudio

謝謝!

-Steve

+3

好問題 - 這是更多的DSP相關的不是編程有關,但這樣你可能會想嘗試http://DSP.stackexchange.com –

+0

多久的是什麼方法您目前使用的檢測每個音調和? –

+0

可能重複[Binary Phase Shift Keying in Python](http://stackoverflow.com/questions/7466715/binary-phase-shift-keying-in-python) –

回答

2

這聽起來像一個硬件問題。我很確定它 FSK的工作。大多數現代FSK型系統使用PLL(鎖相環芯片)進行實際檢測。頻率 - 電壓或頻率 - 電流電路也可用。

我已經在幾十個愛好者書籍,數據表和網站上看到了實用電路。這裏有幾個:

Circuit for demodulating an FSK signal

PLL Tutorial

我希望這不只是一個行程下來的兔子洞,你 - 祝你好運!

0

使用自計時信號表示諸如Manchester code。這樣你的時間只需要「足夠好」,而且你主要擔心在這種情況下檢測頻率的變化。在鏈接的文章中,高電平和低電平指的是電壓,但沒有必要的理由。您可以輕鬆使用高頻和低頻,或打開/關閉單個激光。

+0

曼徹斯特碼是一個很好的建議,但仍然存在實際音頻檢測的問題。 –

+0

你可以在這個問題上拋出一個神經網絡,給它一個樣本的滑動窗口,並在每個時鐘週期詢問它在那個時刻的性質。您必須在訓練數據上手動作出這些決定。 – wberry

1

你做通過聽聲音文件完整性檢查(發送和接收),或與音頻編輯器中查看波形,看他們是否大致聲音或看起來是一樣的?這樣,您可以將問題縮小到通道引發的錯誤與您的軟件分析。

你的解碼/解調軟件將需要能夠確定並跟蹤時間,從調製的一個頻率到另一個音頻信號的變化,那麼你將需要單獨測試此同步方法爲偏移誤差的同步方法。

1

我會解決使用兩個FIR濾波器,一個用於您正試圖檢測每個頻率的接收端。濾波器的係數只是您正在查找的信號的副本(即一種情況下爲250Hz,另一種情況下爲450Hz)。您必須查看太陽能電池板的輸出,以確定它是方波,正弦波還是其他類型的波形。過濾器的長度對應於音調的持續時間(即問題中的'x')。樣品並行饋入兩個濾波器。需要

每個濾波器的輸出進行整流(即取絕對值)和平滑。可以使用簡單的移動平均在大約一半的時間內完成平滑(您可以嘗試查找最佳值)。然後,如果比較平滑值(即a> b或b> a),則應該得到0和1的流。

事情要意識到:這是假設該通道表現爲兩個頻率相同(即你得到類似SNR和衰減)。您可能需要調整一下您的頻率,因爲450Hz非常接近500Hz,這是250Hz的諧波。