limesdr中文教程made simple有足夠的信心自己寫SDR程序_第1頁
limesdr中文教程made simple有足夠的信心自己寫SDR程序_第2頁
limesdr中文教程made simple有足夠的信心自己寫SDR程序_第3頁
limesdr中文教程made simple有足夠的信心自己寫SDR程序_第4頁
limesdr中文教程made simple有足夠的信心自己寫SDR程序_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

LimeSDRMadeSimple系 什么是 也許這樣你還不能理解。那么可以參考百科的定義 目前實際用途在 我本人在機頂盒領域工作多年,我了解到目前的趨勢是固定的調(diào)諧?/解調(diào)?都被“全頻段捕獲”前端盡管有多種選擇,目前市場上性價比最高的還是LimeSDR。LimeSDR支持100kHz~3.8GHz我們可以通過應用來了 下其靈活性蜂窩、WiFi、藍牙、IoT協(xié)議(LoRa/SigFox等)、導航、氣象信息、航空信息、?事信息、空間通信、還有廣播和電視。這只是LimeSDR支持的 部分通信方式,你還可以用于其他你想得到的領域。我們現(xiàn)在了解了LimeSDR是低價、開源、支持現(xiàn)成APP的軟件無線電平臺,它能支持幾乎所有通信標準。這意味著由于LimeSDR的開源特性,所有軟硬件都可以研究和修改。原理圖、布局、零件清單(BOM)和軟件都可以根據(jù)ativeCommons和Apace2.0協(xié)議使用。LimeSDR的部分是7002,它是可編程的射頻集成電路。簡單說來,7002是有點像射頻領域的FPGA。這個后期我們會進步探索7002,會研究它的詳細功能。RFLimeSDR有兩對接收/發(fā)射通道,可以只用于接收,也可以實現(xiàn)2x2MIO,你可以看到共有10個F接口,但是只支持2個接收和2個發(fā)射,這是為什么?因為我們的接收和發(fā)射口都分別對低頻段和高頻段做了優(yōu)化(所以這樣就用到了8個口),然后剩余的2個口是接收通道的寬頻段接口。要把每個通道的接口合并為個是很的。我們目前的設計既可以保證靈活性又可以保證性能。RX1_1/RX2_1=低頻段<1.5GHzRX1_2/RX2_2=高頻段RX1_3/RX2_3=寬頻段 DannyWebster寫的針對短波的修改。 頭是USB3.1接口和可選的電源口。大多數(shù)情況下LimeSDR可以只用USB供電,只是要記住,板子的需求比USB2.0500mA的標準高。盡管大部分USB2.0設備能提供足夠的功率,但是限制帶寬,所以推薦USB3.x口。說到功率,對于某些應用你可能還要加功放,但是低功率的無線電應用可以不需要額外硬件對于2.4GHz頻段的應用,USB3.x可能造成很多諧波干擾。有些線纜和電腦的電磁不好,可能可以考慮使用USB2.x(帶寬降低)或者想辦法做。USBCypressUSB3.0CYUSB3014-BZXC(EZ-USBFX3)。這個設備寫入了VID/PID,會被LimeSDR驅動識別。這個里的代碼都是開源的,如果你有需要可以自己做修改。J19可能在 些應用中很有用。它是8個GIO口,可以用API調(diào)用,作為輸入和輸出。注意它們是被板載FPGA驅動的,它們電流較低,并且只支持3.3V的電壓。 板子上還有兩個JTAG口,但是大多數(shù)人不會去用,只有高級應用才會用 CycloneIV,它支持定程度上的后端處理,波形生成,和EZFX3樣,F(xiàn)PGA內(nèi)的代碼也是根據(jù)Apache2.0協(xié)議免費提供的,你可以自己修改,設計從哪里你可以先個LimeSDR接下去的會講LimeSuite和Pothos的安裝(Windows用戶需要PothosSDR安裝包)。注意安裝可能會有更新,所以和我們的會有少許區(qū)別。 專家(底層開發(fā)需要你對7002M深入了解。這個系列會幫你 篇文章,我們會講到RF輸入,以 7002,我們會了解到 Suite里的控制選項這是LimeSDR系列的第二篇,用來幫助你實際使用SDR,并且寫自己的程序。上次我們探討了LimeSDR是什么以及它的功能。這篇文章我們會講解7002M和射頻輸入輸出,這是許多神奇需要再次觀察這些輸入輸出口,了解它們的區(qū)別。最好先看下板子的原理圖。為了簡單起見,我們只看條射頻通道(Lime的7002M有2條完全相同的射頻通道,比如TX1_2和TX2_2是模如果你對原理圖不熟悉,或者只是大概看過原理圖,但是不熟悉F,那么F電路嚇到你,因為有很多分立的?件。然而,掌握 定方法后就可以方便地理解它們的原理了。大多數(shù)電子學,甚至是大學里教的電子學課程, 般都只考慮原理圖中電路在靜態(tài)條件下的情況(要不就是開著,要不就是關著),這些資料可能會考慮 些模擬條件。大多數(shù)設計中,這些知識就足夠了,因為我們可以忽略頻率效應的影這樣理解起來會更容但是在射頻電路其它因素可能會變得更重。頻率的介紹(這里會講到物理知識接下來的東西可能會講 些數(shù)學。須記 些甚至是很小的塊導線,它們通常都被看作寄生現(xiàn)象(也就是說我們不想要它們出現(xiàn))。從這里你就可以看出為什么輸入端要覆蓋超寬的頻率會那么,就是這些寄生現(xiàn)象造成的。反這個圖像來自百科上的Oleg我們還需要了解另個概念,也就是傳輸線理論。如果和目的地的阻抗不匹配,那么部分的些規(guī)則是不同的。比如說3GHz的四分之波長很?。ㄐ∮?.5cm),那么電氣短線就要小于這個距這些小知識可以用在很多地現(xiàn)在數(shù)學和物理知識已經(jīng)講完了,我們可以 下3個輸和2個輸出口的區(qū)別了 如果我們忽略這個回環(huán),你可以發(fā)現(xiàn)3個輸基本上是差不多的,你可以看到RX1_L和RX1_W之間只是有幾個值不樣。RX1_H也差不多,只不過使用了非中心零點倫(這樣我們可以加入偏置),并且去掉了電感(取而代之的是MN22的電容)。簡單說,這些(T1~T5)把單邊信號轉換 這些網(wǎng)絡的阻抗受到頻率影 了,它原本會把低頻率的信號反彈回去,取走后就不會了(類似的,個較小的電感也會產(chǎn)生類似7002M上篇文章,我們說這個類似于FPGA。但是這個并沒有FPGA內(nèi)部的門陣列。它是個射頻,可以在使用中調(diào)整為100kHz到3.8GHz之間的任何頻率。這種類型的?件被稱作FPRF(現(xiàn)場可編程射頻),因為它可以高度定制,因此它擁有很多類似FPGA的優(yōu)點。上面的展示了7002的模塊圖,我們可以看到內(nèi)部有很多東西。那么這些東西到底做了射頻輸入(主要是 了使得這個信號在后期放大過程中對噪聲更免疫。如果我們在放大?前加入了噪聲(中到處會有噪聲),噪聲也會被放大,因此大多數(shù)射頻電路中LNA般都在最前面級。混頻 是7002M的重要組成部分。我們下搬移到基帶后,就會碰到第二級的低噪放,同時也 個電流電壓轉換?這個LNA/TIA的作用如對于基帶信號提 個初級低通濾 旦信號經(jīng)過RXTIA后,它會被送入低頻率的低通濾波?或者高頻率的低通濾波?(RXLPFLRXLPFH),它們是可配置的。在LimeSuite的RFE選項卡中最 級增益(RXPGA)和 簡單起見,我們假設我們的ADC只有位,也就是說對應了4層C值(V=0.V.66V。如果我們想要用上整個范圍,那么我們的信號必須在0~1V整個范圍內(nèi)變化。如果我們的信號值只在0,那么我們只有1位的有效ADC值,而不是我們本來想要用到的2位。因此,我們需要加 個增益。如果增益太大也會碰到類似問題,如果我們給ADC的信號在0.66V到1范圍內(nèi)變化,也會有類似問題。但是為什么前面提到的組件都正好有2個?I和Q代表什么 多。如果你想要了解更多知識,可以查看NI發(fā)生成的信號的大小,輸出時只需要最后級增益。濾波在發(fā)射中更為重要,因為我們需要發(fā)射出更從哪里你可以先個LimeSDR接下去的會講LimeSuite和Pothos的安裝(Windows用戶需要PothosSDR安裝包)。注意安裝可能會有更新,所以和我們的會有少許區(qū)別。 最后的些想法期的軟件講解中進步深入?,F(xiàn)在我們大概知道7002M的工作方式了,我們可以在下篇學習LimeSuite軟件了,我們后期還會講如何在些應用中做修改,來提升應用的性能。這是這個系列的第三篇。我們會以之前的為基礎,如果你沒看可以點這里上次我們詳細看了RX部分,這樣就能更好理解LimeSuite程序里的設置選項。上篇文章理論比較多,這篇文章理論會少些,我們會做更多實際操作。開我們會使用“selftest”例子作為本文的基礎。原因是只要你有LimeSDR,你不需要額外的硬件(比如 這個例子中使用的頻率是2100MHz,在英國是3G蜂窩網(wǎng)絡的頻段,你大多數(shù)情況下都沒有在這個頻段發(fā)射的。我們使用了內(nèi)部環(huán)路,這樣就不會真正發(fā)射出信號,但是任然會有 小部分射頻能量從我們接著天線的口上漏出來。因此做這個測試時最好移除天線(或者你也可以換到你有權使用的頻段上去),這樣你就不會不地在這個頻段發(fā)射出信號了。我們的內(nèi)部環(huán)路加在高頻率的通道上,因此你選擇的頻段也必須在這個范圍內(nèi)。在7002M內(nèi)部有上千個寄存?,因此要手動設置會非常麻煩。我們使用ini文件來解決這個問題,它里面包含了7002M的寄存?設置,可以自動設置它們,我們不需要關心。如果你對這個感,這個文檔。下面是self_test.ini中的部分,我們提取出來作為 0x0020=0xFFFD<ResetandPWRsettings0x0021=0x0E9F<SPI/I2Ccontrol0x0022=0x07DF<PadDrivecontrolsettingsSXT是用來控制TXPLL(發(fā)射部分的鎖相環(huán))和時鐘發(fā)生?的,它和SXR非常類似,所以我們可以同時觀察。我們暫時不需要調(diào)整參數(shù),只需要點擊calculate和tune按鈕,但是最好還是理解下到底接下來要說的東西需要更多的知識之前的文章我們講過RXPLL(鎖相環(huán)),以及如何合成 個時鐘源是由參考時鐘和乘法?、除法?起生成的。PLL保我們可以 下下面的PLL結構圖,可以發(fā)現(xiàn)PLL由3部分組成Inputs(Nint,Nfract&PLLCLK(refAVCO壓控振蕩了。你可以試試改變頻率,然后看看那幾個參數(shù)會對應變化(記得看完了要改回來,然后按下這個時鐘發(fā)生?部分和前面說的有點相似,它用來控制2的數(shù)字部分,因此有些參數(shù)需要優(yōu)化 下。我們的主要目標是在發(fā)射部分的A(數(shù)模轉換)中做過采樣,以此提升SNR(信噪比),更高的時鐘 般來說效果都會更好。這個顧名思義就能知道是什么,它控制了SKY13323射頻,把它選為了環(huán)路模式加載WCDMA波FPGA 部分功能是波形回放功能,它能夠按照正確的格式給7002M提供已知的波形數(shù)據(jù)先要保證你能做到selftest中的兩個波形看上去差不多的樣子。波形的IQ圖像應該和我們的截圖 們之前看過7002M的結構了,從中我們可以看到這些細枝末節(jié)。在我們前面看到的資料里,可我們暫時不更改發(fā)射參數(shù),先更改接收部分的參數(shù),改下上篇文章提到過的參數(shù)。我們現(xiàn)在看到的I/Q圖像,可以注意到這個形狀是大塊點(理論上應該填滿這塊)。如果我們用的是別的信號,它能幫助你更改參數(shù),你可以先隨意調(diào)整下,最終再做優(yōu)化。我們知道7002M的最前面級是LNA,那么我們先來調(diào)整它,它現(xiàn)在的設置應該是GMAX,也我們試試。先把RX的LNA改回GMAX,然后到TXPADgaincontrol處改為16,它是TXLNA的部你可以看到,結果和之前的類似。另外,TBB選項卡里還有個frontendgain,它調(diào)整的是基帶增益。我們現(xiàn)在調(diào)整組參數(shù),先把TXPAD調(diào)整為12(TRF選項卡),然后再把frontendgain調(diào)整為我們看到增益確實增加了,但是信號出現(xiàn)了失真。不止是星座圖變成了很大的個點,而且對出現(xiàn)了毛刺。顯然這個設置是不對的,這可以作為錯誤的設置的例子。來說,在調(diào)整完大多數(shù)設濾波TBB(發(fā)射部分濾波?設置幸運的是,下面還有個Tune按鈕會自動計算濾波?系數(shù)。輸入100MHz,然后點擊Tune按鈕,你會得到個稍微小點的IQ圖,因為我們發(fā)出了更多的噪聲(這里不理解?噪聲多了不是應該更大座圖。我們對頻率造成了很大的干擾,因為我們沒有濾波?了,無法過濾高階諧波。你最好不RBB(接收部分濾波?設置手動調(diào)整輸入濾波?參數(shù)可能會比較容易理解,這些濾波?是C濾波?。再次選上,并把電容值增加到1200,我們可以看到,波形嚴重失真了,因為我們把高頻率的信息過濾掉了。雖然我們可以手動調(diào)整濾波?,但是我還是推薦你自動選擇這些值,這就和TX里面 樣。點擊ue按鈕會原原本的設置。最 但是它還是與前面的所有文章都有關系,如果你沒有看前三篇文章,我推薦你看下。上篇文章我們看了self_test.ini,把這個例子里大多數(shù)有關內(nèi)容都講了。這次我們會使用之前學到的知識來提高信號質量,并創(chuàng)建我們第個應用。開到這里,我們假設LimeSuite已經(jīng)在你電腦上裝好了,并且運行正常如果你沒有裝好,你可以去裝下Pothos,同時裝好GQRX或者SDRConsole(你不是定要裝這然后我們還需要些額外的硬件,比如FM天線。如果沒有也不要緊,你可以用根75cm長的沒有還有,我們現(xiàn)在的工作頻率還是需要的,因此記得發(fā)射端不要接高增益天線。值得的是,可以用LimeSDR來發(fā)射這種信號,但是最好還是不要。GQRX/SDR大多數(shù)人第次用SDR都會使用GQRX或者SDRConsole。我們不會講太多小細節(jié),但是還會講幾里,BBC3頻道的信號最強,頻率是90.9MHz。SDRConsole只支持Windows,它支持LimeSDR,并且支持硬件加速功能。沒有太多地方要設置,信號在100MHz附近。你第篇文章,你就知道怎么接線了。GQRX的輸入控制頁面的設置方式也是類似的。通過前幾篇文章你應該能過自己做設Pothos 個可以運行的程序,你可以JoshBlum寫的。 雙擊這個模塊,打開SDRSource的屬性,把它們改為如下設置。注意DeviceArgs,有很多參數(shù),你只要直接點下拉框,然后選擇你的LimeSDR就可 點擊commit,并加入2個模塊,分別是Audiosink和FreqDemod。這些都做好后,點擊go按鈕。記白噪個SDR設備(LimeSDR)輸出IQ信號采樣率1MSps/s我們設置了默認的增益和濾波信號強度。旦達到足夠增益后,信號會從白噪聲,變成個奇怪,這個聲音還是聽不清在說 plexFloat32改為Float32。這是因為解調(diào)后我們的信號就不是IQ 多Pothos模塊意義,它有widget,別忘了把它加入graphwidget。 是時候 些濾波FIRFilter。這些控件內(nèi)部有變量,連起來后會有些不同,所以暫時先別連起來。在FIRDesigner屬性里,把頻率上限設置為16kHz(16e3或者16000),剩下的設置都用默認的 些taps。把FIRDesigner輸出拖到FIRFilter上,這樣就會出現(xiàn)Connection控制面板,在里這樣我們聽到的音頻信號更好了。但是等下,好像我們聽到像是藍精靈的在說話。聲音還出的音頻頻率會變化。你可以玩下這個參數(shù),聽上去會很有趣。最我們現(xiàn)在有了個非常簡單的FM了。你還可以加入些調(diào)諧頻率和增益的控制。在用于降采樣的FIR濾波?上再加入個filterdesigner,也會提高音頻質量,還有采樣率和帶寬也可以調(diào)整。這個我們的的理論知識都比較少。我們以后會通 些實用的例子 些理論,這樣就更能發(fā)揮LimeSDR的潛力 根據(jù)百科的定義,軟件無線電是現(xiàn)在是時候復習下前面學到的 篇:介紹第二篇:匹配和這兩篇文章我們講了軟件無線電的射頻部分,是用硬件實現(xiàn)的第三篇 個實際的例 第四篇:Pothos使從這里開始靈活性更高了。之前我們還在物理世界中,受到硬件模塊的限制。雖然可以從z調(diào)諧到z,很神奇,但是硬件還是要用硅實現(xiàn),受限于它的設計,它還是只能做有限的事情。而從這篇文章開始,我們著手研究軟件:我們在FM例子里加入了濾波?、解調(diào)?、檢波?,這些都有段漏第三篇和第四篇文章中間有些不連貫,我們先講了用LimeSuiteGUI,然后直接跳到Pothos,后者很上層的軟件開發(fā)環(huán)境,因此大多數(shù)底層參數(shù)都做了抽象。我們怎么知道哪些設置開啟了?是否有東西在它們之間呢?為了回答這些問題,我們現(xiàn)在深入看下7002M的控制。進入深 Octave。Ocatave是個類似的開源軟件,支持數(shù)學計算,也可以當作個軟件開發(fā)環(huán)境。如果你需要做些復雜的數(shù)學實驗,octave很適合你。而其他不怎么研究數(shù)學的人也不用臺擔心,如如果你想要真正使用們會用ASK的例子,這個例子這里的安 ,安裝起來比Pothos和LimeSuite麻煩些。個試驗品,而不 此以外,還要安裝gnuplot,你可以輸入sudoapt-getinstallgnuplot,如果沒有它你可能會碰到錯人的例子都是蜂窩網(wǎng)絡頻段的,你需要有使用才可以在那些頻段發(fā)射。GNU我們安裝這些應用就是為了探索SDR的軟件部分,Octave應該能滿足需要。在說R的參數(shù)之前,我們先來看看這個軟件包的介紹。和Octave本來都是為了解決數(shù)學問題的。這樣用它們來實簡單舉個例子,要用軟件實現(xiàn)增益,我們只需要在數(shù)字部分做個簡單的乘法實現(xiàn)增益或者除法實現(xiàn)衰減就行。盡管概念很簡單,但是實現(xiàn)比較難,因為采樣點太多,我們會得到個很大規(guī)模的復數(shù)矩陣。用Python或者C語言來做處理很麻煩,因為這樣會產(chǎn)生個數(shù)組。Octave/(矩陣)就是為矩陣處理設計的,這樣就會簡單好多。為了驗證這 入輸入如下命令來 半的波形可以輸入:iqsinehalf=iqsine/2。這就是數(shù)學語言的力量。盡管自己生成信 如果你還沒認可Octave的能力,你可以邊看ASK例子,邊考慮,我們?nèi)绾紊刹l(fā)射調(diào)幅鍵控 你可以直接讀波形來理解,下圖的數(shù)據(jù)是11010010編碼后產(chǎn)生的,用 communications下面加上pkgloadlimesdr。接下來運行例子,你就能發(fā)射波形了。你也可以設置useLimeSDR=false,這樣你就不需LimeSDR也能測試還是個 數(shù)樣更改參數(shù)。更改發(fā)射頻率、采樣率、濾波?,參照之前的方法就行,這就是為什么我們先講直到現(xiàn)在,這個例子都在Windows環(huán)境運行。octave還是實驗性質的,可能會碰到些小問題。Linux下我們發(fā)現(xiàn)只能接收不能發(fā)射注意在運行例子時會產(chǎn)生大量的變量。觀察這些變量很有趣。比如iqDataTx和iqDataTxo,后者是前者過采樣后的變量。過采樣可以減少混疊的可能性,因為它把可能可能混疊的信號隔遠了,這樣TXLime接收波Lime其它代碼都是為了繪圖和增加可讀性。關鍵點在于啟動命令,里面包括了個發(fā)射函數(shù),接收也很重要,你可以學習如何接收。注意,如果你只要發(fā)射個單波形,有個LimeTransmitSamples命最 在Pothos和GNURadio中接收ASK/OOK信 我們還是要警告你,把天線從不用的TX口處取走,這樣就不會不發(fā)射出信號了。要些,深入學習接下來我們會講到些通信理論。前面,ASK是最簡單的調(diào)制方式。ASK的實現(xiàn)方式里最簡單的種是用單音來表示1,然后沒有單音表示0。這也是OOK,2個等級:開和關。這個單音般來我們這個協(xié)議很簡單,所以我們可以用個足夠好的示波?觀察,并直接用眼睛看出數(shù)據(jù)和很多簡單的概念樣,我們還需要了解些其它知識。在實際的無線電接收中,我們的電路需要時間去調(diào)整和鎖定頻率和增益。對于SDR和傳統(tǒng)電路都樣。比如:它們的發(fā)射頻率經(jīng)常會在模擬電路里,我們使用受控環(huán)路鎖定載波,并調(diào)整接收電路達到匹配。PLL或者 個簡單的路就可以完成,原理都比較類似。在R里,我們也能用同樣的方法來解決,或者直接忽略掉這個問題,而是用后期的數(shù)字濾波來解決。這需要假設我們有足夠的帶寬來捕捉信號。正確的ASK接收機對于頻率偏移和相位變化能過很好的免疫,所以我們 般不需要擔心這些。增信號振幅對于傳統(tǒng)電路和SDR都是要注意的事項。最終都需要用某種增益控制來解決。比如(自動增益控制)是最好的,但是手動 完成鎖定,鎖定后才接收真正的數(shù)據(jù)。這個技術不但在射頻通信里用到。你現(xiàn)在使用的電腦或者機可能也在做這樣的操作,而 秒要做幾百萬次。因為DDR內(nèi)存里就需要用鎖相環(huán)來鎖定時(就跟RF樣) 射出的頻率。把SXR頻率改為433MHz,我們就能看到FFT圖了,然后按下上的按鈕,會出現(xiàn)個新的尖峰。然后重新調(diào)整中心頻率,直到尖峰在中間,這時我們就找到了的頻率。我們的鑰設設 個迄今為止,我們用的都是現(xiàn)成的設計,比如Josh的。接下來我們要自己設計了 我們之前用過Pothos,所以這次還是用它。加入個SDRSource(包含頻率控制)和個Wave 以用DCremoval模塊來去掉它。把圖像上的增益 點,但是沒必要這樣。wavemonitor有 我們把前面說的幾點實現(xiàn)下。為了實現(xiàn)增益,我們乘以個數(shù)字,這樣可以把信號放大20倍(很簡單)。然后用個簡單的解調(diào)算法,叫做EnvelopeDetector。這樣就能檢測載波的包絡線了(對應我們可以加入個WaveTrigger,并設置為normal模式,這樣就能捕捉信號了(類似于個示波?上的功能)。點的數(shù)量可以在WaveTrigger和WaveMonitor里設置,這樣你就能觀察到整個過程。如果這個數(shù)據(jù)時靜態(tài)的,那可以手動解調(diào),并保存為文件。這樣我們就搞定了:個簡單但是有效重量級程序:GNU迄今為止,我們都沒說GNURadio。Pothos和GNURadio很接近,而且可以支持與GNURadio的協(xié)同使用。你用過PothosGUI后GNURadiocompanion應該也會很熟悉了。如果你沒安裝,可以現(xiàn)在裝下和Pothos樣,我們的流圖也類似:無線電接收->增益->解調(diào)->分析。要在GNURadio里使用 Source,并且在devicearguments里填入driver=lime,soapy=0。 我們可以在GNURadio用各種方式實現(xiàn)前面在Poths里做的工作。我們使用了下列模塊(但是這不唯 :FreqXlatingFIRAM解調(diào)ClockRecovery 個wavemonitor,這里的采樣ClockRecovery模塊在消除載波后表現(xiàn)得更好,因為載波的存在會影響很多事情。我們使用AM模塊來實現(xiàn)。另種方式是使用RMS模塊,實現(xiàn)個包絡線檢波?。要把它與ClockRecovery模塊結合使用,波形需要加上個負常數(shù),然后移到0點附近。最后加上個binaryslicer和filesink就完成了等下,這個設備還沒那么好,因為輸出的格式還需要翻譯。改變數(shù)據(jù)格式是另個話題了,現(xiàn)在有些程序可以自動完成這個任務,比如grc_bit_converter。我們把前面生成的數(shù)據(jù)經(jīng)過這個程序轉從這個數(shù)據(jù)可以發(fā)現(xiàn),我們每個符號對應的采樣太多,因此說明我們的omega值是錯的。我們omega值增加到25,這樣每個符號對應的二進制位輸出就少 些,但是還是有問題 最許多其它的實現(xiàn)方案。寫程序就這樣,要實現(xiàn)個目標會有多種方法,有些方法比另些好。如果我們只是要看波形,Pothos和WaveTrigger模塊就夠了。如果我們要所有ASK數(shù)據(jù),并且要實時,那么ClockRecovery模塊就會更好。還有點:記錄ASK數(shù)據(jù)可能很有趣,但是用于不如果你還沒盡興,我們下次還會深入講ASK在GNURadio中接收和發(fā)射ASK信這是第七篇。我們繼續(xù)上次的內(nèi)容,我們會仿制出個最簡單的無線電設備。上篇文章我們可以接收比特流,但是每個符號對應的比特數(shù)是錯誤的。這篇文章,我們計劃改進ASK,并且設計個發(fā)射機,重放數(shù)據(jù)。要實現(xiàn)這個目標我們需要同時有發(fā)射機(類似?)和接收設備。我們手頭正好有BrennenstuhlPrimera-Line插座。出于好奇,我們看了它的?信號,它們也是ASK而且還是OOK,因此我們上 source對應于DCblocker用來對接收到的信號去除直流分量,這個模塊使得示波?不會顯示出大的直流分Multiplyconst模塊產(chǎn)生了 RMS模塊把信號從正弦波的形式轉換為二進制形式Addconst增加了直流偏置,把信號移動下來,使其穿過零點,這是Clockrecovery模塊要求的Clockrecovery模塊和Binaryslicer模塊把數(shù)據(jù)恢復出來并記錄到文件中AM解我們現(xiàn)在用RMS做AM解調(diào),做得還不錯,但是原理是什么 下RMS模塊內(nèi)部,它很簡單:Out=sqrt(Avg),其中Avg=(1-Alpha)*Avg+Alpha*abs(in)^2,我們這里設置Alpha=1,那么Avg=abs(in)^2。 正弦波Abs(正弦波 ClockRecovery模 在正確的時間點采樣,并出比特流。我們使用了clockrecovery模塊,我們上次用幾個字節(jié)來表 我們?nèi)绾沃烂總€比特對應多少采樣點到?;蛘哂肬RH程序可以幫助我們做這個事情,但是只用GNURadio也可以實現(xiàn)。 Brennenstuhl電源開關就沒有這個問題。我們只需要在RMS模塊后接個示波?,然后計算最小的我們的采樣率是1MSps/s,因此每1x10^-6秒就有個采樣點。那么我們可以得到0.51ms對應于510在我們把510輸入到clockrecovery模塊中前,我們要知道,把這么大的數(shù)字作為Omega不太好。最好先做降采樣,然后再做clockrecovery。我們增加個RationalResampler,然后降采樣率設置為比特流每次傳輸(包含重復傳輸)都會有這個前導碼 關閉按鈕的載荷打開按鈕的載荷

構建發(fā) 為了方便,我們這里使用了VectorSrouce,而不是文件或者messagebox。把我們的數(shù)據(jù)編碼這個vectrsource會不停循環(huán)比特流,但是的速率是流圖設置的采樣率,在我們這里是Ss,這樣它的速度會比我們需要的快510倍。我們可以用 個超大的vector代替,每個比特都重復510次,比如替換為1中間502個…。但是這樣的實現(xiàn)方式不優(yōu)雅。更好的方式是使用tInterlin模塊。這樣它會根據(jù)差值長度來重復每個比特(在我們這里就是重復510個采樣點),這樣的效果實際上是 樣的。接下來,我們可以使用Throttle模塊來設置比特率為1ss。這個模塊會對流過的采樣點的數(shù)量進行限制,把我們的輸入速度降下來,達到目標波特率。這樣我們就有了 個,波特率符合我們的要求。然而這是 個數(shù)字信號,沒有載波,無法傳輸。 個433.91MHz的正弦波應該夠了。我們用SignalSource來創(chuàng)建。 個門,我們可以用GUIChooser來選擇0和1,這樣用這個來控制另 最 級 Sink,我們設置為正確的參數(shù)后就好了DeviceArguments:Frequency:Bandwidth:5.1e6須這樣設置,否則GNURadio會自動填寫 最我們希望這篇文章展現(xiàn)了GNURadio和LimeSDR的強大之處,我們自己實現(xiàn)了 制我們的電源開關,只需要這 個簡單的流圖就能實現(xiàn)。這個對于所有OOK設備都是如此,包里了,但是來可能還會回來講FSK和PSK,我們可能會嘗試些別的設備。這是第八篇。我們在第篇就,我們會從SDR新手開始步步教你,直到你學會調(diào)用API編程。前幾篇說完后,現(xiàn)在是時候開始寫程序了。如果你已經(jīng)讀完了前面的文章,會用GNUOctave,也熟悉Pothos和GNURadio了,那么直接調(diào)用API只需要再前進小步。在Linux下開發(fā)(Ubuntu系統(tǒng) 沒有,可以運行sudoapt-getinstallgcc來安裝版本。搞定后,我們來試試 oWorld程序創(chuàng) o_world.c,用你最喜歡的編輯?打開文件,加入下面的代碼#include//sowecanuseprintfintmain(){ oworld\n”);//“\n”meansnew}保存并關閉。接下來我們需要使用gcc編譯它,我們運行這個命令:gcc-std=c99o_world.c-o這個命令會生成oworld.bin,它是 運運 oworld.bin會得到如下輸出SoapySDR接口方便起見,我們可以把SopaySDRAPI看作 API文檔在Device.h這個頭文件里SoapySDR的上也有例子,C語言的例子在這里你可以C語言的例子,并且保存為example.c文件然后就想編 樣,只不過這次gcc命令要這樣寫$gcc-std=c99example.c-lSoapySDR-lm-o這次我們需要加入命令-lm,這是因為要用到 然后運 下,會報錯:SoapySDRDevice_makefail:RTL-SDRdevicenot但是這個例子并不要用RTL-SDR不要害怕,只需要做些修改,這個代碼就適合LimeSDR了,把如下文字 下改為編譯,再次運行,你就會看到如下顯示SoapySDRDevice_listGains(sdr,SOAPY_SDR_RX,0,我們可以 下API對這個函數(shù)的描述ListavailableamplificationElementsshouldbeinorderRFto\paramdeviceapointertoadevice\paramdirectionthechanneldirectionRXor\paramchannelanavailable\param[out]lengththenumberofgain\returnalistofgainstringSOAPY_SDR_APIchar**SoapySDRDevice_listGains(const*device,constintdirection,constsize_tchannel,size_t了,你可以看到它與listGainAPI很接近,那么仿照前面的代碼來設置增益應該很簡單。Settheoverallamplificationina*Thegainwillbedistributedautomaticallyacrossavailable*\paramdeviceapointertoadevice*\paramdirectionthechanneldirectionRXor*\paramchannelanavailablechannelonthe*\paramvaluethenewamplificationvaluein*\returnanerrorcodeor0forSOAPY_SDR_APIintSoapySDRDevice_setGain(SoapySDRDevice*device,constintdirection,constsize_tchannel,constdoublevalue);通過上述信息,我們可以這樣調(diào)用API來設置增intsuccess=SoapySDRDevice_setGain(sdr,SOAPY_SDR_RX,0, 先整理下我們現(xiàn)在要實現(xiàn)個新的工具。我們要從小程序起步,比如實現(xiàn)個頻譜檢測程序。我們可以對于例子分解開來,這樣我們的主循環(huán)可以小點,代碼也方便。我們需要用到函數(shù)和指針,所以你最好先學習點C語言基礎(我們自己也需要做點練習)。我們會寫些函數(shù)(這些可以看作是原型structSoapySDRDevice*Setup(void);voidDeviceInfo();voidRead_1024_samples(structSoapySDRDevice*sdr,doublefreq,complexfloat*buffer);void 這個函數(shù)可以像這樣調(diào)用structSoapySDRDevice*sdr=structSoapySDRDevice{//enumerateSoapySDRKwargs*results=SoapySDRDevice_enumerate(NULL,&length);for(size_ti=0;i<length;i++){printf("Founddevice#%d:",for(size_tj=0;j<results[i].size;{printf("%s=%s,printf("%s=%s,",results[i].keys[j],}}SoapySDRKwargsList_clear(results,//createdevice//argscanbeuserdefinedorfromtheenumerationresultSoapySDRKwargsargs={};SoapySDRKwargs_set(&args,"driver","lime");SoapySDRDevice*sdr=SoapySDRDevice_make(&args);if(sdr=={printf("SoapySDRDevice_makefail:%s\n",//return}return這 個簡單的函數(shù),返回信息數(shù)據(jù),在調(diào)用時需要傳入SDR設備voidDeviceInfo(structSoapySDRDevice{//querydevicechar**names=SoapySDRDevice_listAntennas(sdr,SOAPY_SDR_RX,0,printf("Rxantennas:for(size_ti=0;i<length;i++)printf("%s,",names[i]);names=SoapySDRDevice_listGains(sdr,SOAPY_SDR_RX,0,&length);printf("Rxgains:");for(size_ti=0;i<length;i++)printf("%s,",names[i]);SoapySDRStrings_clear(&names,SoapySDRRange*ranges=SoapySDRDevice_getFrequencyRange(sdr,SOAPY_SDR_RX,0,&length);printf("Rxfreqranges:for(size_ti=0;i<length;i++)printf("[%gHz->%gHz],",ranges[i].minimum,ranges[i]. 開始這個函數(shù)看上去有點可怕。你可以像這樣調(diào)用它Read_1024_samples(sdr,frequency,sdr是Setup()函數(shù)創(chuàng)建的,frequency是要調(diào)諧到的頻率值,最后的buffn是用來接收的采樣點buffer。這些值會到buffn變量的指針中 voidRead_1024_samples(structSoapySDRDevice*sdr,doublefreq,complexfloat*buffer){//checkfreqiswithinrangeif(freq<10e3){freq=printf("Frequencyoutofrangesettingmin:}if(freq{freq=printf("Frequencyoutofrangesettingmax:}//applyif(SoapySDRDevice_setSampleRate(sdr,SOAPY_SDR_RX,0,1e6)!={printf("setSampleRatefail:%s\n",}if(SoapySDRDevice_setAntenna(sdr,SOAPY_SDR_RX,0,"LNAL")!={printf("setAntennafail:%s\n",}if(SoapySDRDevice_setGain(sdr,SOAPY_SDR_RX,0,20)!={printf("setAntennafail:%s\n",}if(SoapySDRDevice_setFrequency(sdr,SOAPY_SDR_RX,0,freq,NULL)!={printf("setFrequencyfail:%s\n",}//setupastream(complexfloats)SoapySDRStream*rxStream;if(SoapySDRDevice_setupStream(sdr,&rxStream,SOAPY_SDR_RX,SOAPY_SDR_CF32,NULL,0,NULL)!=0){printf("setupStreamfail:%s\n",}SoapySDRDevice_activateStream(sdr,rxStream,0,0,0);//startstreamingvoid*buffs[]={buffer};//arrayofbuffersintflags;//flagssetbyreceiveoperationlonglongtimeNs;//timestampforreceivebufferintret=SoapySDRDevice_readStream(sdr,rxStream,buffs,1024,&flags,&timeNs,100000);//shutdowntheSoapySDRDevice_deactivateStream(sdr,rxStream,0,0);//stopstreamingSoapySDRDevice_closeStream(sdr,rxStream);}最終我們需要關閉之前用Setup函數(shù)打開的SDR設備,我們只voidClose(structSoapySDRDevice{//cleanupdevice//return最小的我們的程序大概已經(jīng)寫了90%了,我們現(xiàn)在 個最小型的例子。我們需要include下面這些文件#include<SoapySDR/Device.h>#include<stdio.h>//printf#include<stdlib.h>//#include<complex.h>這是 的全局變size_t主函數(shù)只有這3structSoapySDRDevice*sdr=Setup();個頻率工接下來只需要加 小部分代碼就可以開始創(chuàng)建很多應用程序了。這就是我們的頻率例子我們在命令行傳入3個參數(shù):開始頻率、結束頻率、間隔。這個代碼就會設置好LimeSDR,計算需要做多少次。根據(jù)這個結果,程序會在每個頻率上1024個采樣點,然后計算RMS值。RMS intmain(intargc,char{{}structSoapySDRDevice*sdr=Setup();//HEREWECANDO//LetsdoasitesurveymeasuringeveryxxxHzanddis yingthepowerdoubleStartFreq=strtod(argv[1],NULL);doubleEndFreq=strtod(argv[2],NULL);doubleIntervaldoubleNumberOfScanPoints=(EndFreq-StartFreq)/Interval;printf("StartingRMSscan,Startis:%f,Endis:%f,Intervalis:printf("Thisgivesatotalof:%fSamplepoints",NumberOfScanPoints);while(NumberOfScanPoints!=0){//createare-usablebufferforrxsamplescomplexfloatbuffn[1024];doublefrequency=StartFreq+(Interval*((EndFreq/Interval)-Read_1024_sample

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論