gnu radio是乙個通過最小程度地結合硬體,用軟體來定義無線電波發射和接收的方式,搭建無線電通訊系統的開源軟體系統。其應用程式用python語言來編寫,真實的資訊處理過程是由c++浮點擴充套件庫來實現。因此開發者可以獲得實時高效的可復用的應用開發環境。gnu radio不僅可以用於**,也可以在不用真實硬體,而使用預先記錄或生成的資料來開發訊號處理演算法。
gnu radio
提供了所有通用軟體無線電需要的庫,包括各種調製方式(gmsk、psk、qam等)、訊號處理模組(fft、濾波器等)等。開發者通過呼叫需要的模組,建立相應的流向圖,就能夠搭建乙個無線電系統。其靈活性和高效性使得複雜的資料生成過程變得簡單,並被廣泛地應用射頻通訊方面。
通常在專案的設計過程中,我們有時需要將幾個現有模組級聯生成乙個新的模組,有時也需要生成乙個全新的數字訊號處理模組。前者比較簡單,可以通過python強大的粘合功能實現。對於後者,很多資料上介紹需要自己編寫c++語言的原始碼程式,最後翻譯成可以呼叫的python模組,但是這樣做非常繁瑣,而且耗時。那如何才能快速便捷的擴充套件新模組呢?
我們知道python的程式設計效率很高,如果僅用python就能夠擴充套件新模組,那問題就變得簡單多了。gnu radio3.6.3以上的版本都提供了相應的模組擴充套件庫,存放在gnu radio的安裝目錄下面。例如開啟d:\gnuradio\lib\site-packages\gnuradio\gr資料夾下的gateway.py檔案就能夠檢視相應的庫函式,裡面包含了四種不同型別的python模組:synchronous block、decimation block
、interpolation block和basic block。
建立新模組時,首先依據需求,在程式入口處匯入相應型別的python模組;然後根據模組型別,選擇訊號處理函式(general_work ()或work());最後在函式內部編寫想要實現的功能。我們不禁會問:「四種不同型別的python模組應如何選擇?general_work ()和work()這兩個函式分別在哪種模組型別下使用?」下面將對上述問題進行詳細闡述。
synchronous block(同步模組),應用於輸入埠資料數量與輸出埠資料數量相等的情況,例如單埠常數乘法器;decimation block(抽取模組),應用於輸入埠資料數量是輸出埠資料數量固定倍數的情況,例如抽取濾波器;interpolation block(插值模組),應用於輸出埠資料數量是輸入埠資料數量固定倍數的情況,例如插值濾波器;basic block(基本模組),其輸入埠資料數量與輸出埠資料數量的比值是m:n,配置合理的比值,就可以轉換為前三個模組中的一種,但是在gateway.py檔案中預設設定basic block的比值為1:1。
需要注意的是訊號處理函式的選擇與模組的選定與是一一對應的,選擇basic block時呼叫general_work ()函式,而選擇另外三個模組時呼叫work()函式。
了解清楚了模組型別和訊號處理函式的使用情況後,就可以使用python語言來編寫新模組了。資料夾中附帶了module_test.py檔案,內含四種不同型別的python模組的簡單測試,僅供參考。下面以basic block建立加法器的例項進行說明。擴充套件程式如下:
import numpy
from gnuradio import gr, blocks
from gnuradio.gr import gateway
class add(gateway.basic_block):
def __init__(self):
super(add, self).__init__(name="add",
in_sig=[numpy.float32, numpy.float32],
out_sig=[numpy.float32])
def general_work(self, input_items, output_items):
in0 = input_items[0][:len(output_items[0])]
in1 = input_items[1][:len(output_items[0])]
out = output_items[0]
out[:] = in0 + in1
return len(out)
def test_add():
tb = gr.top_block()
src0 = blocks.vector_source_f((1.25, 3.56, 5.75, 7, 9, 10), true, 1, )
src1 = blocks.vector_source_f((2.75, 2.44, 2.25, 3.5, 1.5), true, 1, )
head = blocks.head(gr.sizeof_float, 10)
sink = blocks.vector_sink_f(1)
adder = add()
tb.connect((src0, 0), (adder, 0))
tb.connect((src1, 0), (adder, 1))
tb.connect(adder, head, sink)
tb.run()
result_data = sink.data()
return result_data
建立模組,需要考慮輸入埠的數量,輸出埠的數量,以及每個埠資料型別的大小這三個因素。這裡定義加法器模組有兩個輸入端和乙個輸出端,資料型別是numpy.float32。
函式general_work()內部用來實現加法器的功能。為了保證輸入埠資料數量與輸出埠資料數量的比值是1:1,利用切片符([:])擷取與輸出埠相同數量的輸入資料進行算術處理。
nginx擴充套件模組
url 輸出內容為我自定義的字串,比如 i try to nginx 這裡介紹以下步驟 第一步 建立任意乙個目錄,比如 ngx hello 第二步 在這個資料夾中建立乙個config檔案,內容如下 ngx addon name ngx xtest 這裡指定模組名稱 http modules http...
rsyslog imfile 模組說明
stop d 30 exec retval echo retval eq 0 rm f lockfile return retval prog rsyslog exec sbin rsyslogd lockfile var lock subsys prog imfile text file inpu...
rsyslog imfile 模組說明
服務端rsyslog版本 vsftp root cat etc issue centos release 6.5 final kernel r on an m vsftp root rsyslogd v rsyslogd 8.22.0,compiled with platform x86 64 re...