USRP调研及学习(GNU Radio)

USRP(Universal Software Radio Peripheral,通用软件无线电外设)可以使普通计算机能像高带宽的软件无线电设备一样工作。从本质上讲,USRP充当一个无线电通讯系统的数字基带和中频部分。
GNU Radio 是一个开源的软件定义无线电(SDR)平台。USRP通常与GNU Radio软件套件一起使用,以创建复杂的软件定义无线电系统。它提供了一个完整的开发环境,以创建您自己的无线电,为您处理所有的硬件接口、多线程、可移植性的问题。GNU Radio提供所有通用软件无线电需要的库,包括各种调制方式(GMSK、PSK、QAM、OFDM 等)、纠错码(R‐S 码、维特比码、Turbo 码)、信号处理模块(最优滤波器、FFT、均衡器、定时恢复)和调度。
USRP背后的基本设计理念是在主机 CPU 上使用诸如 GNURadio完成所有波形相关方面的处理,比如调制和解调 。所有诸如数字上下变频、抽样和内插等高速通用操作都在 FPGA 上。灵活的硬件、开源的软件和拥有经验丰富用户社区群的强强联合,使它成为您软件无线电开发的理想外设。
USRP组成:USRP由 USRP母板、连同各种子板以及相应的天线组成。一个典型的 USRP 产品系列包括两部分:一个带有高速信号处理的 FPGA 母板,和一个或者多个覆盖不同频率范围的可调换的子板。它们共同实现把比特流数据从天线传到主机电脑(即接收),或者从主机电脑传送到天线(即发送)。在各种子板中,USRP 系列涵盖从直流到 5.9GHz 的整个范围,这包括了从调幅广播到超过 Wi‐Fi 的所有频率。
USRP设备包括母板,和通信子板,USB接口电路(usrp1) / 以太网卡(usrp2) 其功能分别为:
子板:实现模拟信号的滤波,下变频,主要是将需要接收的信号转移到基带,模拟基带信号的最大可达44MHz
母版:将子板获得的模拟基带信号进行采样,数字滤波,抽取得到上层需带宽和采样率的采样值,封装成数据包,交于接口电路
USB接口电路 / 以太网卡:将封装好的采样值数据包传输于PC处
通信接收机

移动通信接收机的主要功能之一是对接收信号实现解调。与发射机相对应,接收机也可以在合适的频率下采用DSP技术实现解调和其他基带处理。由于对不同的调制方式只要在数字信号处理部分采用不同的解调算法,因此具有较强的灵活性。采用DSP技术实现解调的常用方案有两种。
(1)中频加DSP技术方案
这种方案是把接收信号的载频频率转换到一个适合进行A/D变换的中频频率上,然后在中频上进行宽带A/D变换,再送到DSP电路,用数字信号处理方法进行解调和其他基带处理。其原理方框图如图3所示。
(2)零中频加DSP技术方案
这种方案是把接收信号经低噪声放大后直接送到混频器或相乘器,而本振频率与接收频率相等,使输出频谱是零频为中心的两个边带接收信号分量。零中频加DSP方案的原理方框图如图4所示。零中频接收技术由于不用中放和中频滤波器,可使电路大大简化,功耗和体积减小,成本降低。
SDR软件无线电的结构图

软件无线电(Software Defined Radio,SDR)是一种实现无线通信的新概念和体制。其中已在硬件被典型地实现的组件(例如混频器,滤波器,放大器,调制器 / 解调器,检测器等),也可以通过软件手段的个人计算机上或代替实施嵌入式系统,基本的SDR系统可以由装备有声卡或其他模数转换器的个人计算机组成,之前是某种形式的RF前端。大量的信号处理被交给通用处理器,而不是在专用硬件(电子电路)中完成。这种设计产生一种无线电装置,它可以仅仅基于所使用的软件来接收和发送广泛不同的无线电协议(有时也称为波形)。
USRP内部结构

UHD(USRP Hardware Driver)框图 硬件驱动

Oskernel 操作系统内核

GNU Radio 的各个部分使用

典型的软件无线电处理流程
上图表示一个典型的软件无线电处理流程图。为了理解无线电的软件模块,首先需要理解和其关联的硬件。在这个图中的接收路径上,能够看到一个天线,一个神奇的 RF 前端,一个模拟数字转换器 ADC 和一堆代码。ADC 是一个连接连续模拟的自然世界和离散的数字世界的桥梁。物理量(电压)转换成数字样本的采样方法,由模拟/数字转换器(ADC)来完成,当然也有反向的数字/模拟转换器(DAC),可以将数字信号转换成模拟信号。
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 是一个 GNU Radio 的“Hello World”的例子。它产生两个 sine 波形并且把他们输出到声卡,一个输出到声卡的左声道,一个输出到右声道。
例子 1.输出拨号音


#!/usr/bin/env python 
# 
# Copyright 2004,2005,2007 Free Software Foundation, Inc. 
# 
# This file is part of GNU Radio 
# 
# GNU Radio is free software; you can redistribute it and/or modify 
# it under the terms of the GNU General Public License as published 
by 
# the Free Software Foundation; either version 3, or (at your option) 
# any later version. 
# 
# GNU Radio is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with GNU Radio; see the file COPYING. If not, write to 
# the Free Software Foundation, Inc., 51 Franklin Street, 
# Boston, MA 02110-1301, USA. 
# 
from gnuradio import gr 
from gnuradio import audio 
from gnuradio.eng_option import eng_option 
from optparse import OptionParser 
class my_top_block(gr.top_block): 
 def __init__(self): 
 gr.top_block.__init__(self) 
 parser = OptionParser(option_class=eng_option) 
 parser.add_option("-O", "--audio-output", type="string", 
default="", help="pcm output device name. E.g., hw:0,0or /dev/dsp") 
 parser.add_option("-r", "--sample-rate", type="eng_float", 
default=48000, 
 help="set sample rate to RATE (48000)") 
 (options, args) = parser.parse_args () 
 if len(args) != 0: 
 parser.print_help() 
 raise SystemExit, 1 
 sample_rate = int(options.sample_rate) 
 ampl = 0.1 
 src0 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 350, ampl) 
 src1 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 440, ampl) 
 dst = audio.sink (sample_rate, options.audio_output) 
 self.connect (src0, (dst, 0)) 
 self.connect (src1, (dst, 1)) 
if __name__ == '__main__': 
 try: 
 my_top_block().run() 
 except KeyboardInterrupt: 
 pass 
在这个例子中,我们首先调用 gr_sig_source_f 产生两个 sine 波形模块,src0 和src1。后缀 f 表面这个信号源的数据类型是浮点型的,一个波形是 350HZ,另外一个是 440HZ,合在一起他们听起来像一个美国电话拨号音。audio_sink 是一个接收器,它把接收到的信号输入到声卡中。我们把 3 个信号处理模块用流向图的 connect 方法连接到一起。connect 方法有两个参数,源端点和目的端点,用来建立一个从源到目的处理模块的链路。每个端点(endpoint)有两个成员:一个信号处理模块和一个端口号。端口号表示哪个输入或者输出端口应该被连接的。通常端点使用 python 语言的 tuple 来表示,像:(block,port_number)。当端口号是 0 时,port_number 可以被省略。例如下面的两个表示方法是一样的:
fg.connect ((src1, 0), (dst, 1)) 
fg.connect (src1, (dst, 1)) 
一旦流向图被建立了,我们调用 start 生成一个或者多个线程去运行它,按下任意键这个程序就会退出。

、




from gnuradio import MODULENAME

常用模块由如下及个

gr               gnuradio 的主要库,基本上每个程序都需要用到

analog        和模拟信号和模拟信号调制有关的功能

audio          声卡控制,可以用来向声卡发送信息 或者通过声卡接收信息

blocks        所有不属于其他模块的东西,可能就放在这

channels    仿真所用的信号模型

digital         与analog, 所用和数字信号调制有关的功能在这

fft                和ffts 有关的功能

fec              和fex有关的贡呢

filter            过滤器模块

plotdata      绘制数据

qtgui           和表示数据有关的图形界面(使用QT库)

wxgui          包含快速创建流图的用户界面的一些实体

vocoder       和声音编码有关的一些功能

wavelet       和微波有关的一些功能

gru              各种各样和数学及其他有关的一些功能实体



新代码
#!/usr/bin/env python
#
# Copyright 2004,2007,2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#

from __future__ import unicode_literals
from gnuradio import gr
from gnuradio import audio
from gnuradio import analog

def build_graph():
    sampling_freq = 32000
    ampl = 0.1

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

    return tb

if __name__ == '__main__':
    tb = build_graph()
    tb.start()
    input('Press Enter to quit: ')
tb.stop()


旧代码
 #!/usr/bin/env python
 
 from gnuradio import gr
 from gnuradio import audio 
 class my_top_block(gr.top_block):
     def __init__(self):
         gr.top_block.__init__(self)
 
         sample_rate = 32000
         ampl = 0.1
 
         src0 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 350, ampl)
         src1 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 440, ampl)
         dst = audio.sink (sample_rate, "")
         self.connect (src0, (dst, 0))
         self.connect (src1, (dst, 1))
 
 if __name__ == '__main__':
     try:
       my_top_block().run()
     except KeyboardInterrupt:
         Pass

Tip:run() 方法并不启动一个新线程,就是在主线程中调用了一个普通函数而已。
start() 方法是启动一个子线程,线程名就是自己定义的name。
采样频率,也称为采样速度或者采样率,定义了单位时间内从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔。通俗的讲采样频率是指计算机单位时间内能够采集多少个信号样本。

无线电电传打字机(RadioTeleTYpe,RTTY)的码元长度(Symbol Time)是22ms,即波特率约为45(1/0.022=45)。为了能够得到一个整数的samples per symbol(每个符号的采样点数),在本例中,选定了500作为采样率。(具体计算方法为,0.022s是一个码元长度,假设以500采样率,可以在每个码元长度内得到X个采样值,则X=0.022500=11,即每个码元长度时间周期内,以500采样率进行采样,可以得到11个采样值。)
“Quadrature Demod”模块的输出信号采样率是960Hz,我们需要的采样率是500Hz,因此,我们使用“Rational Resample”模块来完成采样率的变化,例如,该例子中,“Rational Resample”模块通过内插(Interpolation)500,抽取(Decimation)960的方式实现。960Hz
500/960=500Hz。
在该例中,信号接收器(即电脑的扬声器)“Audio Sink”的采样率是48KHz,在“Audio Sink”模块之前的“Rational Resampler”模块中,内插(Interpolation)为4,抽取(Decimation)为1,则“Rational Resample”模块的输入采样率必须为12KHz。
“Repeat”模块将输入该模块的数据按照其参数Interpolation来重复,例如这里Interpolation是1.2K即1200,则是重复1200次。由于该例子中的“Multiply”、“IIRFilter”和“Uchar to Float”模块都没有修改采样率。因此,为了满足“Rational Resampler”模块对输入数据采样率的要求(12KHz),“Repeat”模块的数据数据采样率必须为10,(10*1200=12000=12KHz)。

在该例子中,“Speed”参数是可以由用户指定的,可选数值为,2, 3, 4, 6, 8, 12, 16, or 24 (48的所有因数)。

“baud”=“Speed”/1.2

“repeat”参数固定为1200

“samp_rate”=“baud”*“repeat”

当我们不使用任何硬件,只是做GNU Radio的纯仿真程序时,我们需要使用“Throttle”模块来进行“限流”,目的是避免GRC流图程序消耗过多的CPU资源。
AM载波的振幅按照所需传送信号的变化规律而变化,但频率保持不变的调制方法。调幅在有线电或无线电通信和广播中应用甚广。调幅使高频载波的振幅随信号改变的调制(AM)。其中,载波信号的振幅随着调制信号的某种特征的变换而变化。例如,0或1分别对应于无载波或有载波输出,电视的图像信号使用调幅。调频的抗干扰能力强,失真小,但服务半径小。

Am调制公式

m(t)为调制信号,Ac为载波幅度
当|m(t)|<=1时,调制后的信号S(t)的包络直接对应着调制信号m(t)的变化规律
当|m(t)|>=1时,由于m(t)的幅度过大造成相位180度的反转,使得包络与调制信号不一致,产生过调幅失真
常规AM的本质:通过包络反映调制信号的变化规律

调幅指数:反映信号在载波幅度上的调制程度

带宽:调制后的信号带宽是基带带宽的2倍
AM的调制效率

调制效<=50%,是一种低效率的调制。这意味着占用较多的带宽资源,传输较少的数据
AM信号的接收:包络检波器。
包络检波器可以直接提取调制后的信号的实包络(即信号的幅度)。
包络检波器不需要产生于载波同频同相的本地载波,成为非相干载波

(1)“Option”模块:注明了GRC流图文件名称,标题和作者等信息。

(2)“ZMQ PUB Source”模块:该模块接收来自“ZMQ PUB Sink”模块(该模块可以用来将数据通过Socket方式传递给AM接收器)的数据,“Address”值为tcp://127.0.0.1:50001。

(3)“Sample_rate”参数:采样率是768KHz。

(4)“Frequency Xlating FIR Filter”模块:该模块实现三个功能,信号频率转化、滤波、采样率转化。由于计算机扬声器处理声音信号的采样率是48KHz,因此我们需要将“Frequency Xlating FIR Filter”模块的Decimation抽取参数值设定为16,即采样率768KHz/16=48KHz。此外,其他几个参数的值为,

Type: Float->Complex (Real Taps)

Decimation: decim

Taps: firdes.low_pass(1,samp_rate,samp_rate/(2*decim), 2000)

Center Frequency: 48000

Sample Rate: samp_rate

其中,decim的值由id为decim的参数模块来设定。samp_rate的值由id为samp_rate的参数模块来设定

(5)“AGC”模块:自动增益控制模块,用于调节输入信号的信号强度,用默认值即可。

(6)“Complex to Mag”模块,计算复数信号的大小。

(7)“Band Pass Filter”模块,带通滤波器,滤除不需要频段的信号,只留下有用信号。

FIR Type: Float->Float (Real Taps)(Decim)

Decimation: 1

Gain: 1

Sample Rate: int(samp_rate/decim)

Low Cutoff Freq: 500
在物理学和电机工程学中,一个系统的输出信号的能量通常随输入信号的频率发生变化(频率响应)。截止频率(英语:Cutofffrequency[1])是指一个系统的输出信号能量开始大幅下降(在带阻滤波器中为大幅上升)的边界频率。
概述
电子滤波器等信号传输通道中的诸如低通、高通、带通、带阻等频带特性都应用了截止频率的概念。截止频率有时被定义为电子滤波器的导通频带和截止频带的交点,例如电路标称输出信号减3分贝的位置的频率。在带阻滤波器中,截止频率则被定义在输出信号能量大幅上升(或大幅下降)、失去“阻止”(或失去“通过”)信号效果的位置。在波导管或者天线的例子中,截止频率通常包括上限频率和下限频率。

High Cutoff Freq: 6000

Transition Width: 400

(8)“QT GUI Range”参数:为了实现对声音信号增益的动态调节控制,设定一个id为volume的“QT GUI Range”参数,默认值为0.3,start开始值为0,stop结束值为1.0,step步长为0.05。volume数值被“Multiply Const”模块使用。

(9)“QT GUI Time Sink”模块,给出了接收到的AM信号的时域波形。

Number of Points: 256

Sample Rate: int(samp_rate/decim)

Number of Inputs: 1

(10)“Audio Sink”模块:该模块是使用计算机的扬声器来发出声音。采样率数值为48KHz,“Device Name”栏不用填写。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值