GNU RADIO 探秘

2026/4/26 16:45:36

GNU Radio 探密 作者:Eric Blossom

http://www.gnu.org/software/gnuradio/doc/exploring-gnuradio.html

简介:

软件无线电是一门让软件代码尽可能靠近接收天线的技术。它把无线电的硬件问题放到软件中来解决。软件无线电最基本的特征是软件定义(调制)无线电传输的波形,软件解调接收到的波形。这个和目前大多数的由模拟电路或者由模拟数字组合电路组成的无线电有鲜明的区别。GNU Radio是一个开源的可以构建软件无线电平台的软件包。

软件无线电是无线电设计领域的一次革命,使得建立无线电设备更加灵活,给用户带来更多的机遇。软件无线电能够很好的实现传统无线电所能实现的功能,另外,软件无线电最精彩的特性是由软件提供给我们的灵活性,一些年以后,我们将会看到传统的由很多固定元件组成的无线电设备将会被通用的通信设备来取代。可以想像,一个软件无线电设备能够变体成为蜂窝电话,能够灵活的使用GPRS,802.11 Wi-Fi,802.16 WiMax,卫星链路,或者将出现的其他通讯标准进行通讯,而硬件设备无需改动,只需要软件设置。你能够决定使用GPS,GLONASS或者两个一起使用来给自己定位。

也许,最令人激动的是使用软件无线电来建立一个分布式个人通讯系统。当今的通讯系统,大多数是采用自上而下的结构,广播和电视系统提供一个单向链路,内容被严格控制在一小部分人的手里。蜂窝电话系统给人们带来极大的便利,但是你的手机提供的功能是由运营商来控制的,而不是你自己。这种集中控制的系统限制了人们的创新,代替做蜂窝电话系统的二等公民,我们可以建造一个智能设备,这些设备能够自组织的,在使用者之间建成一个网络。

处理流程图

图一,表示一个典型的软件无线电处理流程图。为了理解无线电的软件模块,首先需要理解和其关联的硬件。在这个图中的接收路径上,能够看到一个天线,一个神奇的RF前端,一个模拟数字转换器ADC和一堆代码。ADC是一个连接连续模拟的自然世界和离散的数字世界的桥梁。

ADC有两个主要特性,抽样率和动态范围。抽样率是ADC测量模拟信号的速度,动态范围是ADC区别最低信号值和最大信号值的精度,这决定ADC数字信号输出的比特数(位数)。例如,8位的AD转换器最多能代表256个信号层次,而一个16位的转换器能够代表65536

个层次信号。总的来说,ADC的物理特性和价格决定了抽样率和动态范围。

在我们深入研究软件之前,先来了解一些理论知识,在1927年,出生于瑞典的物理和电子学家 Harry Nyquist提出了如果AD转换想没有混叠现象发生,那么抽样率至少是目标信号带宽的2倍。

混叠现象就像是车子重复的碾在过去的车轮印迹上一样,让你分不清楚是本次的还是以前碾过的车轮印迹。假设我们要处理一个低通信号,我们感兴趣的信号带宽是 0到fmax,按照Nyquist理论,抽样率必须至少是2*fmax。如果我们的ADC工作在20MHZ,但是我们想收听92.1MHZ的FM电台,我们该怎么办呢?答案是使用RF前端,接收机的RF前端能够把它接收到的高频段信号下变频到一个低频段信号后输出。例如,我们能让RF前端把90- 100MHZ频段内的信号下变频到0-10MHZ的低频范围内,那么我们的20MHZ的ADC就能够派上用场了。

大多数情况下,我们把RF前端当作一个信号控制的黑盒子,负责处理输入信号的中心频率。举一个具体例子,一个调制解调器的调制模块能够把50M到800M 之间的6M带宽的中心频率下变频到一个中心频率是5.75MHZ的输出。这个输出的中心频率通常称作中频(IF)。

按照越简单越易用的原则,RF前端最好也能够被去掉,有一个GNU Radio用户已经成功的使用一个100英尺(译注:等于12英寸,合0.305米)的天线直接连接到一个20M抽样率的ADC上收听到了AM和短波广播。

深入软件内部

GNU Radio提供一个信号处理模块的库,并且有个机制可以把单个的处理模块连接在一起形成一个系统。编程者通过建立一个流向图(flow graph)就能搭建成一个无线电系统。信号处理模块是使用C++来实现的,理论上说,信号数据流不停的从输入端口流入从输出端口流出。信号处理块 (blocks)的属性包括输入和输出的端口数,流过它们的数据的类型,经常使用的数据流的类型是短整型(short),浮点型(float),和复数(complex)类型。一些处理模块仅仅有输入端口或者输出端口,它们分别成为信号源(data source)和信号接收器(sink)。有的信号源从文件或者ADC读入数据,信号接收器写入文件或者DAC或者PC的多媒体接口。GNU Radio提供了超过100个信号处理块,并且扩展新的处理模块也是非常容易的。软件图形化接口和信号处理模块的链接机制是通过python脚本语言来进行的,例1,是一个GNURadio “Hello World”的例子。它产生两个sine波形并且把他们输出到声卡,一个输出到声卡的左声道,一个输出到右声道。

例子1.输出拨号音

#!/usr/bin/env python

from gnuradio import gr from gnuradio import audio

def build_graph ():

sampling_freq = 48000 ampl = 0.1

fg = gr.flow_graph ()

src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl) src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl) dst = audio.sink (sampling_freq) fg.connect ((src0, 0), (dst, 0)) fg.connect ((src1, 0), (dst, 1))

return fg

if __name__ == '__main__': fg = build_graph () fg.start ()

raw_input ('Press Enter to quit: ') fg.stop ()

我们开始建立一个流向图(flow graph)把所有的信号处理模块连接到一起,调用gr_sig_source_f产生两个sine波形,后缀f表面这个信号源的数据类型是浮点型的,一个波形是350HZ,另外一个是440HZ,合在一起他们听起来像一个美国电话拨号音。audio_sink是一个接收器,它把接收到的信号输入到声卡中,我们把3个信号处理模块用流向图的connect方法连接到一起。connect方法有两个参数,源端点和目的端点,用来建立一个从源到目的处理模块的链路。每个端点(endpoint)有两个成员:一个信号处理模块和一个端口号。端口号表示哪个输入或者输出端口应该被连接的。通常端点使用 python语言的tuple来表示,像:(block,port_number)。当端口号是0时,portt_number可以被省略的。

下面的两个表示方法是一样的:

fg.connect ((src1, 0), (dst, 1))

fg.connect (src1, (dst, 1))

一旦流向图被建立了,我们调用start生成一个或者多个线程去运行它,按下任意

键程序控制权就会返回给调用者。

一个完整的FM接收机

例2是一个简单化的但是是一个完整的FM广播接收机,它包括对RF前端的控制和所有FM信号的处理。这个例子的RF前端是使用一个cable调制解调器和一个20M抽样率的ADC来实现的。

例2.FM广播接收机

#!/usr/bin/env python

from gnuradio import gr from gnuradio import audio from gnuradio import mc4020 import sys

def high_speed_adc (fg, input_rate):

# return gr.file_source (gr.sizeof_short, \

return mc4020.source (input_rate, mc4020.MCC_CH3_EN | mc4020.MCC_ALL_1V) #

# return a gr.flow_graph #

def build_graph (freq1, freq2): input_rate = 20e6 cfir_decimation = 125 audio_decimation = 5

quad_rate = input_rate / cfir_decimation audio_rate = quad_rate / audio_decimation

fg = gr.flow_graph ()

# use high speed ADC as input source src = high_speed_adc (fg, input_rate)

# compute FIR filter taps for channel selection channel_coeffs = \\

gr.firdes.low_pass (1.0, # gain

input_rate, # sampling rate

250e3, # low pass cutoff freq 8*100e3, # width of trans. band gr.firdes.WIN_HAMMING)


GNU RADIO 探秘.doc 将本文的Word文档下载到电脑
搜索更多关于: GNU RADIO 探秘 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219