2011-09-19 27 views
6

我目前正在研究一些使用音頻轉換在激光器上傳輸消息/文件/和其他數據的代碼。我當前的代碼使用Python中binascii模塊的hexlify函數將數據轉換爲二進制,然後爲1發出一個音調,爲0發出一個不同的音調。這在理論上是有效的,儘管不是編碼/解碼的最快方式,但在測試中證明存在一些錯誤。Python中的二進制相移鍵控

  1. 產生未發現對音調,即:發射在150Hz可以變成是145-155Hz在接收端,這不是一個大問題,因爲我可以只設置在接收端的邊界更低或更高。

  2. 真正的問題是,如果我發出一個音並且它被播放,接收端的計算機可能會多次讀取它,或根本不會根據它對採樣音頻進行採樣的速率來讀取它。我試圖以它採樣的速度播放這些音調,但這非常不方便。

總之,我已經有幾次使用短消息的成功運行,但由於上述問題,這是非常不可靠和不準確的。

我已經進一步研究了這個問題,對此的解決方案看起來可能涉及BPSK或二進制相移鍵控,儘管我不知道如何實現這一點。任何建議或代碼示例將不勝感激!

我的項目代碼可以找到here但我正在處理的主要文件是二進制解碼和編碼,它是herehere。我不是python的專家,所以請原諒我,如果我說的是錯誤的,我的代碼不是最好的,或者如果我忽略了一些基本的東西。

謝謝! :-)

回答

7

看看GNU Radio!

http://gnuradio.org/redmine/projects/gnuradio/wiki

GNU Radio是一個項目做,軟件,無線信號傳輸或接收的儘可能多的可能。因爲廣播已經使用了相移鍵控,所以GNU Radio的人已經爲你解決了這個問題,而GNU Radio已經是一個Python項目!而複雜的DSP是用C++編寫的,因爲它的速度很快,但是爲了在Python中使用而封裝起來。

這是一個討論使用差分二進制相移鍵控(DBPSK)/差分正交相移鍵控(DQPSK)傳輸二進制數據(在本例中爲JPEG圖像)的項目的頁面。 Python源代碼可供下載。

http://www.wu.ece.ufl.edu/projects/softwareRadio/

我看你的項目是在MIT許可下。 GNU Radio在GPL3下,這對你來說可能是個問題。您需要弄清楚您是否可以使用GNU Radio,而無需將您的項目變爲派生工作,從而迫使您更改許可證。應該可以創建一個獨立的「發送守護程序」和一個獨立的「接收守護程序」,它們的源代碼都是GPL3,然後讓你的MIT代碼通過套接字或其他東西連接到它們。

順便說一句,我搜索一個發現的BPSK如何運作這個解釋得很清楚:

http://cnx.org/content/m10280/latest/

祝你好運!

+0

謝謝,這會有很大幫助! – sbrichards

4

在回答關於頻率的第一個問題:

看你的解碼器,我看你的採樣率是44100,你的塊大小爲2048。如果我讀這一權利,這意味着你的FFT的大小2048.這會使你的FFT bin大小在〜21hz。你有沒有試圖填充你的FFT?零填充FFT不會改變頻率,但會給您更好的分辨率。我確實看到你正在使用二次插值來改善你的頻率估計。我沒有使用過這種技術,所以我不熟悉你從中獲得的改進。也許在零填充和做二次插值之間的平衡會讓你獲得更好的頻率精度。另外,根據硬件進行發送和接收,頻率誤差可能是不同時鐘驅動A/D的結果 - 一個或兩個時鐘都不是精確的44100Hz。類似的東西可能會影響你在FFT輸出中看到的頻率。

+0

用於零填充。如果你能提高塊大小並處理更多數據,那更好。 http://zone.ni.com/devzone/cda/tut/p/id/4880 – steveha

+0

非常感謝!不能接受兩個答案:/ – sbrichards