1. 程式人生 > >LimeSDR 中文教程 (五)

LimeSDR 中文教程 (五)

這是本教程的第五篇,我們上一次看了軟體無線電的軟體部分,使用了一個相對簡單的流圖開發環境Pothos。從理論的角度比再之前的幾篇文章簡單些。

這次我們要稍微深入看一下,我們這次的例子用程式碼來寫。

快速複習

根據維基百科的定義,軟體無線電是:

把以往用硬體實現的元件(混頻器、濾波器、放大器、調製/解調器、檢波器)用軟體方式實現的無線電通訊系統

現在是時候複習下前面學到的東西了:

第一篇:介紹第二篇:匹配和LMS7002M

這兩篇文章我們講了軟體無線電的射頻部分,是用硬體實現的。

第三篇:一個實際的例子

我們開始調整一些與SDR硬體有關的引數,這是資料在純硬體中處理的最後階段了,其它地方的資料全部在軟體中處理(有一些特殊情況也會用到

FPGA)

第四篇:Pothos使用

從這裡開始靈活性更高了。之前我們還在物理世界中,受到硬體模組的限制。雖然可以從100kHz調諧到3.8GHz,很神奇,但是硬體還是要用矽實現,受限於它的設計,它還是隻能做有限的事情。而從這一篇文章開始,我們著手研究軟體:我們在FM例子里加入了濾波器、解調器、檢波器,這些都是用軟體實現的。

有一段漏了

第三篇和第四篇文章中間有一些不連貫,我們先講了用LimeSuiteGUI,然後直接跳到Pothos,後者是一個很上層的軟體開發環境,因此大多數底層引數都做了抽象。我們怎麼知道哪些設定開啟了?是否有東西在它們之間呢?為了回答這些問題,我們現在深入看一下LMS7002M的控制。

進入深水區

我們現在想要深入瞭解,那麼就會進入一些比較複雜的領域。如果你把之前文章的公式都理解透徹了,還想來學點東西,也許我們下面講的就是你需要的。那麼我們現在來介紹另一個軟體GNU OctaveOcatave是一個類似Matlab的開源軟體,支援數學計算,也可以當作一個軟體開發環境。如果你需要做一些複雜的數學實驗,octave很適合你。而其他不怎麼研究數學的人也不用臺擔心,因為有很多現成的例子,而且用的程式語言也很好懂。

如果你想要真正使用Octave,可以看看這裡的安裝教程,安裝起來比PothosLimeSuite麻煩些。我們會用ASK的例子,這個例子更接近一個試驗品,而不是一個商用軟體。

在寫這些例子的時候,我用的環境是Windows。我沒有測試過Linux下的情況,可能會有些小問題,但是應該還是可以解決的。

如果你要用Linux,你要確保安裝了所需的軟體包,包括訊號和通訊軟體包,還有Lime的軟體包。除此以外,還要安裝gnuplot,你可以輸入sudo apt-get install gnuplot,如果沒有它你可能會碰到錯誤。這是對全新安裝的Ubuntu來說的。

如果你直接從上面的連結裡下載了這些檔案,你要注意:只有ASKFSK例子可以直接執行。其他人的例子都是蜂窩網路頻段的,你需要有使用許可才可以在那些頻段發射。

GNU Octave

我們安裝這些應用就是為了探索SDR的軟體部分,Octave應該能滿足需要。在說SDR的引數之前,我們先來看看這個軟體包的介紹。MatlabOctave本來都是為了解決數學問題的。這樣用它們來實現的混頻器、濾波器、放大器、調變解調器、檢波器的原型就很合適。因為我們需要很多數學工具。

簡單舉個例子,要用軟體實現增益,我們只需要在數字部分做一個簡單的乘法實現增益或者除法實現衰減就行。儘管概念很簡單,但是實現比較難,因為取樣點太多,我們會得到一個很大規模的複數矩陣。用Python或者C語言來做處理很麻煩,因為這樣會產生一個多維陣列。

Octave/Matlab(矩陣實驗室)就是為矩陣處理設計的,這樣就會簡單好多。為了驗證這一點,我們來生成一個帶有IQ分量的正弦波。這些程式碼可以直接寫成一個完整的程式,也可以在命令列裡輸入。

這段程式碼就可以生成任何頻率的正弦波。很簡單,但是這還不是IQ資料,我們還要做點修改,注意用j表示複數:

輸入如下命令來繪製圖形:

我們要繪製一半的波形可以輸入:iqsinehalf = iqsine/2。這就是數學語言的力量。儘管自己生成訊號很有趣,ocatave還可以用於幫助你調製波形。比如,在通訊軟體包裡有一個命令fmmod,你可以通過名字猜到,這是FM調製。

訊號軟體包裡提供了濾波器和測量工具,比如FFT和頻譜圖。如果你想要研究SDR,你可能很難找到一個更強大的軟體。

如果你還沒認可Octave的能力,你可以邊看ASK例子,邊考慮,我們如何生成併發射這個波形。

調幅鍵控(ASK

ASK是一個很常見的編碼方式,在簡易無線電裝置中經常使用,比如你的車庫門鑰匙。技術很簡單,你可以直接讀波形來理解,下圖的資料是1101 0010編碼後產生的,用一個單音來表示1,當單音不存在時表示0.

這是一個非常簡單的技術。除此之外,而且這種技術一般都用於開放頻段,所以我們打算把這個例子作為基礎。

重要:儘管在英國866MHz是開放的,但是其它國家可能不是,你可能要根據當地法規修改引數。在歐洲,這個頻段有最大的發射功率限制。所以和別的例子一樣,你不能用高增益天線發射,如果你不確定,可以考慮用內部環路或者電纜代替。

現在載入ASK.m檔案,根據你的安裝環境不同你可能要在你的程式碼里加入一行:在pkg load communications下面加上pkg load limesdr

接下來執行例子,你就能發射波形了。你也可以設定useLimeSDR=false,這樣你就不需要LimeSDR也能測試。

還是個黑盒

你可能還會有疑惑,到底在做什麼?我們現在來講講在做什麼。你可以看到資料夾下有一個類似第三篇文章裡講的ini檔案。我們開啟.m檔案,可以看到裡面呼叫了這個.ini檔案並傳入了LimeLoadConfig變數。

那麼我們如何更改設定呢?很簡單,用LimeSuiteGUI開啟.ini檔案,像之前我們改self_test.ini裡的引數一樣更改引數。更改發射頻率、取樣率、濾波器,參照之前的方法就行,這就是為什麼我們先講了那些背景知識。

直到現在,這個例子都在Windows環境執行。octave還是實驗性質的,可能會碰到些小問題。在Linux下我們發現只能接收不能發射。

注意在執行例子時會產生大量的變數。觀察這些變數很有趣。比如iqDataTxiqDataTxo,後者是前者過取樣後的變數。過取樣可以減少混疊的可能性,因為它把可能可能混疊的訊號隔遠了,這樣TX通道里的濾波要求就降低了。

觀察octave的例子,我們可以把程式碼分為幾部分:

變數和波形產生

Lime啟動命令

接收波形

Lime關閉命令

其它程式碼都是為了繪圖和增加可讀性。關鍵點在於啟動命令,裡面包括了一個發射函式,接收也很重要,你可以學習如何接收。注意,如果你只要發射一個單一波形,有一個LimeTransmitSamples命令,看上去和接收命令有點像。

最後

我們測試了另一種用LimeSDR接收和發射訊號的方法。我們介紹了一個很強大的DSP軟體,以及SDR的軟體部分。使用這個方法,我們建立了無線電通訊中軟硬體的橋樑,我們看到ini檔案是如何輸入給硬體的。下一篇文章我們會講到更多的LimeSDR發射訊號的內容,但願我們不會講到太多程式碼和數學公式。