GNURadio入门教程-(2)新手入门

2、 新手入门教程

(本教程实验环境GNURadio3.10,DragonOS R28)

2.1 GRC中的常用术语

Block

A functional processing unit with inputs and outputs

Port

A single input or output of a block

Source

A producer of data

Sink

A consumer of data

Connection

A flow of data from output port to input port

Flow graph

A collection of blocks and connections

Item

A unit of data. Ex: baseband sample, fft vector, matrix...

Stream

A continuous flow of consecutive items

IO signature

A description of a blocks input and output ports

 

2.2 GNU Radio已有的通信模块

GNU Radio已经包括了大量的通信模块,这里列举常见的模块分类及其典型模块。

1、信号波形生成器(WaveformGenerators)

(1) 常数信源(ConstantSource)

(2) 噪声信源(NoiseSource)

(3) 信号源(SignalSource)例如正弦信号、方波信号等

2、调制器(Modulators)

 

(1) AM解调(AM Demod)

(2) 连续相位调制(ContinuousPhase Modulation)

(3) 相位偏移调制与解调(PSKMod / Demod)

(4) 高斯频移键控调制与解调(GFSKMod / Demod)

(5) 高斯最小频移键控调制与解调(GMSKMod / Demod)

(6) 正交振幅调制调制与解调(QAMMod / Demod)

(7) 宽带调频接收(WBFMReceive)

(8) 窄带调频接收(NBFMReceive)

3、界面(GUI)

(1) 星座图(ConstellationSink)

(2) 频域图(FrequencySink)

(3) 时域图(Time Sink)

(4) 直方图(HistogramSink)

(5) 瀑布图(WaterfallSink)

4、数学运算(MathOperators)

(1) 绝对值(Abs)

(2) 相加(Add)

(3) 复数共轭(ComplexConjugate)

(4) 相除(Divide)

(5) 积分(Integrate)

(6) 取对数(Log10)

(7) 相乘(Multiply)

(8) 均方根(RMS)

(9) 相减(Subtract)

5、信道模型

(1) 衰落信道模型(FadingModel)

(2) 动态信道模型(DynamicChannel Model)

(3) 频率选择性衰落模型(FrequencySelective Fading Model)

6、滤波器(Filters)

(1) 带通/带阻滤波器(Band Pass / Reject Filter)

(2) 低通/高通滤波器(Low / High Pass Filter)

(3) 无限冲激响应滤波器(IIRFilter)

(4) 均方根余弦滤波器(RootRaised Cosine Filter)

(5) 抽取有限冲激响应滤波器(DecimatingFIR Filter)

7、傅里叶分析

(1) 快速傅里叶变换(FFT)

(2) 克斯塔斯环(Costas Loop)

2.3 GRC中的属性颜色

GRC 在编辑块属性时使用配色方案来表示数据类型。QT GUI Frequency Sink频率接收器模块的属性如下所示:

 

 

 

 

 

 

 QT GUI 频率接收器属性有多种颜色:橙色绿色紫色。每种属性颜色对应于不同的数据类型:

  • 浮点数:橙色
  • 整数:绿色
  • 字符串:紫色

例如,bandwidth为橙色,因为bandwidth可以是任何浮点数。FFT Size必须是整数,因此颜色为绿色Y Label是一个字符串,因为它包含用于描述绘图垂直轴的单词,因此它的颜色为紫色

Variable块没有颜色,因为它们可用于表示任何数据类型或对象。

选中blocks时,按上下箭头键可以直接更改block的数据类型

 

2.4 信号的数据类型

block上的每个输入和输出端口都将具有与之关联的数据类型。数据类型由输入和输出端口的颜色标识。GNU Radio 数据类型可以通过打开 GNU Radio Companion (GRC) 并单击 Help->Types:

 

 

 

 

窗口显示数据类型及其关联的颜色,这些颜色对应于 GRC 中块的输入和输出端口

GNU Radio块中最常见的数据类型是蓝色的32位复浮点数和橙色的32位浮点数 。其他颜色包括黄色的16位整数(或short)数据类型和紫色的8位整数(或char或byte)数据类型。

 

 

 

 

PMT数据类型放在中级教程中介绍。

2.4.1 复数据类型

以图使用 Complex Float 32 数据类型,该数据类型使用一对 32 位浮点数来表示复杂样本的实部和虚部。

 

 

 

 

运行流程图显示了在时域中绘制的复数信号,其中signal1是实分量,signal2是复数信号的虚部分量:

 

 

 

 

因此,每个复数样本都是 64 位:实部为 32 位浮点数,虚部为 32 位浮点数。

2.4.2 浮点数据类型

许多 GNU Radio块支持多种数据类型。可以通过双击信号源块并从Output Type下拉菜单中进行选择来更改Signal Source块的数据类型:

 

 

 

 

选择float数据类型将使Signal Source块创建一个真正的正弦波,由橙色输出端口表示。请注意,将Signal Source连接到Throttle的箭头为红色,表示数据类型不匹配错误:

 

 

 

 通过将所有其他块转换为橙色 Float 数据类型来解决此错误。单击该块将其选中,并以浅蓝色突出显示。数据类型可以通过按键盘上的向上向下来更改:

 

 

 

 在所有数据类型转换为float后,流程图完成:

 

 

 

 Signal Source模块创建一个实输出,该输出显示为时域中的唯一信号:

 

 

 

 

2.5 数据类型转换块

数据类型转换要么通过设置block属性中的数据类型,更方便的可以使用数据类型转换器(Type Converters)

搜索Random Source block并将其拖到工作区中:

 

 

 

 

块默认为绿色 32位int类型。双击块以打开属性并将数据类型修改为byte:

 

 

 

 

Random Source现在转换为紫色charbyte数据类型。

 

 

 

 

将byte转换为 32位float

Random Source的默认参数将随机生成 0 和 1 的值。将 QT GUI Time SinkThrottle块添加到工作区中并连接这些块:

 

 

 

 

Random SourceThrottle块之间的红色箭头显示需要修复的数据类型错误。双击Throttle并将数据类型更改为byte

 一个新的红色箭头现在显示Throttle块和 QT GUI Time Sink之间存在数据类型连接:

 

 

 QT GUI Time Sink没有char数据类型,选择float

 

GNU Radio Block Library附带了在类型转换器下列出的各种数据类型Type Converters转换器。搜索“char到float”块,将其拖到工作区中,然后将其连接到流程图中:

所有的红色错误都消失了。

2.6 GRC中的python变量

2.6.1 GRC中的浮点数和整数

GNU Radio Companion(GRC)使用Python数据类型来表示变量。最简单的数据类型描述数字。Python 中的数字可以是浮点数或整数:

floatNumber = 3.14
integerNumber = 2

整数可以使用 float() 转换为浮点数,浮点数可以使用 int() 转换为整数:

floatNumber = float(2)
integerNumber = int(3.14)

类型转换可以在variable块内完成:

 

 

 

 

结果显示为:

 

 

 注意:GRC中数字显示以SI标准为单位,如32000显示为32k,0.25显示为250m

2.6.2 GRC中的字符串

Python 使用单引号 ' 和双引号 “ 来包含字符串:

singleQuoteString = 'string1'
doubleQuoteString = "string2"

字符串可以用作 GRC 中的变量:

 

字符串显示在 GRC 中:

 

 

 

 

2.6.3 GRC中的列表和元组

GRC 中的变量可以使用 Python 列表、元组:

 

该列表显示在 GRC 中:

 

GRC 中的变量可以使用 Python 元组:

 

元组显示在 GRC 中:

 

列表推导在GRC中的使用:(Variable 块中的Id相当于变量名)

listVariable = [0, 1, 2, 3]
listComprehensionExample = [(i + 1) * 2 for i in listVariable]

这个列表推导示例在GNU Radio中使用,方法是使用两个变量,listVariablelistComprehensionExample,并输入它们的关联

 

 

 

列表显示在 GRC 中:

 

 

 

2.7 流程图中的变量

GRC 允许用户与 GNURadio 流程图进行交互,无论是他们从头开始交互式创建的流程图,还是从 .grc 文件中读取的流程图。

当点击运行按钮执行流程图时,GRC 会创建一个包含流程图代码的 .py Python 文件。

Python 代码可以有变量,GNURadio 流程图可以有由Variable block块创建的变量

每个新的流程图都以samp_rate变量开头:

 

GNURadio 块是作为函数实现的。GNU Radio块采用修改行为的参数。上面流程图中的所有块都使用 samp_rate 作为参数。通过从右侧的块库中拖放来创建新的Variable块:

 

双击Variable block修改参数,id是变量名,将其设为frequency,val=4000

                                                                                                           

当然,频率变量也可以依赖于另一个变量。编辑频率以输入值 samp_rate/3,对于 samp_rate = 32000,该值将为频率 10.667。

 

将Signal Source 块的频率参数设为变量frequency:

 

运行该流程图:(可见频响峰值在4kHz处)

 

2.8 运行时更新变量

GNU Radio block library附带 QT GUI widgets。这些小部件允许在运行时对流程图进行交互和修改。

2.8.1 QT GUI Range

QT GUI Range小组件创建一个滑块,可用于更新变量。

 

QT GUI Range的工作方式类似于Variable块。需要设置 QT GUI Range的默认参数。QT GUI Range块将替换频率变量,因此首先将 Id 字段更改为frequency,此时提示Id名不唯一,将频率变量右键禁用即可。Label 为显示在运行窗口上滑动条的标签指示信息(如,音量大小)。

Default Value是流程图启动时的值。将默认值设置为 0。“开始”和“停止”是滑块的开始停止值。输入 -samp_rate/2 作为起始值,输入 samp_rate/2 作为停止值。Step值是滑块的步长。在本例中,设置为 100 :

 

 

运行后可以通过以下方式更新频率参数:

1、 拖动滑块

2、 输入值

3、 单击向上或向下箭头

 

频率已更新为 -5000,在频谱图中以橙色反映。

2.8.2 QT GUI Chooser

QT GUI Chooser为变量创建一个选项下拉菜单。导航块库:Core -> GUI widgets -> QT  ->  QT GUI Chooser拖放到工作区中。

 

Option字段是变量的值,Label是在下拉菜单中显示的文本描述。

运行结果如下:

 

2.9 Pack/Unpack K Bits 打包/解包 块

(实验 A02_pack_K_Bits.grc)

使用Pack K Bits块将位打包到字节中,以及如何使用Unpack K Bits块将字节解压缩为位。(双击块以修改K的值)

Random Source生成的字节最小值为Minimum,最大值为 Maximum-1。当Minimum= 0 和Maximum = 2,可用来创建二进制 0 和 1Pack K Bits块用于将多个位并行化或打包到单个字节中,以表示更大的二进制值。

ThrottlePack K BitsChar To Float和 QT GUI Histogram Sink块添加到流程图并连接它们:(Random Source块数据类型先设为8位复整型QT GUI Histogram Sink块统计数据)

 

2.9.1 打包过程解释

Pack K Bits块获取 K 位数据,并通过首先填充最低有效 (LSB) 将它们放入一个字节中。

在本例中,K=4Random Source将首先生成位 B0。这将由 Pack K Bits 接收,然后存储在 LSB 中:

[0 0 0 0 0 0 0 B0]

Pack K Bits块生成的第二个位是 B1,然后由Pack K Bits块存储为:

[0 0 0 0 0 0 B1 B0]

照此规律,接下来的位 B2 和 B3 将存储为:

[0 0 0 0 B3 B2 B 1 B0]

下图演示了块的工作原理:

 

由于 K=4 位已打包,因此将生成字节 0000B3B2B1B0 作为输出,并将启动一个新字节。以十进制(以 10 为基数)的字节的输出值为:

= ( B 3*2 3 ) + ( B 2*2 2 ) + ( B 1*2 1 ) +  ( B 0* 2  0)      = ( B 3*8 ) + ( B 2*4 ) + ( B 1* 2 ) + ( B 0)

例如,如果:

B 0 =0
B 1 =1
B 2 =0
B 3 =1

字节由00001010表示,十进制值为:

8 + 0 + 2 + 0 = 10

K=4,4个位产生从 20=1 到 24-1=15 的数字。编辑顶部 QT GUI Histogram Sink属性并更改以下内容:

  • Title: 4 Bits
  • Number of Bins: 1024
  • Max x-axis: 16

 

四个位产生从 20=1 到 24-1=15 的数字。编辑底部的 QT GUI Histogram Sink属性并更改以下内容:

  • Title: 4 Bits
  • Number of Bins: 1024
  • Max x-axis: 16

 

流程图应如下所示:

 

运行流程图。1 Bits直方图显示 0 和1 的值,而 4 Bits直方图显示 0 到 15 之间的值:

 

Unpack K Bits块将字节 序列化为一串bit。将“Unpack K Bits”块添加到工作区,并将其连接到Unpack K Bits”块和“Char To Float块之间。编辑Unpack K Bits块属性并输入 K: 4

 

运行流程图。1 Bit直方图显示打包的 4 被解压缩(序列化)回 0 和 1 的值:

 

首先从LSB开始,然后到达最高有效位(MSB)。在前面的示例中,Pack K Bits生成了一个字节,其中位为 0000B3B2B1B0Unpack K Bits块首先生成位 B 0 的输出,然后是 B 1、B 2 和 B3,字节中剩余的 4个0将被忽略。

 

Unpack K Bits块完美地反转了Pack K Bits输入流的操作。这可以通过添加具有两个输入的 QT GUI Time Sink块来验证:

 

 

连接模块:

 

QT GUI Time Sink显示输出:

 

鼠标左键单击并拖动到较小的部分以放大:

 

这两个情节完美重叠。Pack K Bits块的输入与Unpack K Bits块的输出完全相同。这演示了Pack K BitsUnpack K Bits如何执行完美的反向操作。

 

2.10 Streams & Vectors 流和向量

2.10.1 Streams

(实验 A03_streams.grc)

GRC中的blocks可以使用streamsvectors连接。streams为每个时间实例携带 1 个样本。streams生成序列化数据。streams必须具有数据类型,例如float 32 byte

Signal Source模块产生float 32 流。每个时间实例的块输出包含 1 个复样本:

 

 

该图显示在每个时间实例中都有一个复样本

2.10.2 Vectors

vectors每个时间实例携带多个样本。vectors并行表示数据。streams表示每个时间实例的标量。vectors表示每个时间实例的数组。

GRC 使用较浅的颜色表示streams,使用较深的颜色表示vectors输出:示意如下:

 

2.10.3 Stream to Vector block

(实验 A04_1_Streams_Vectors.grc)

将item 流转换为包含N个item的向量流;注:(输入流本身可以是向量/标量,所以用item表示)。

Stream to Vector属性解释:

a) Num Items:流要连接成一个输出向量的连续输入项数。该输出Vector具有NumItems个Vector Length长度的尺寸。=N(N个Item)

b) Vector Length:一个item流(向量/标量)的长度。=M,则该输出Vector的元素个数为N * M。

解释:若Vector Length=1,Num items=3,将产生一个个3维的行向量。

下面的示例介绍如何将流转换为向量并转换回流。两个复的正弦波流被转换为一个 2 元素向量,然后转换回它们的两个独立流。

将两个信号源块添加到工作区:

 

编辑第二个信号源的参数,使其频率为 100,振幅为 0.1,以在视觉上将其与第一个信号源区分开来:

 

搜索“Streams to Vector”块,将其拖到工作区中并将其连接到Signal Source”块:

 

Streams to Vector块充当交织器。Streams to Vector块从 in0 端口获取样本,并将其放入输出Vector中的第一个元素中。Streams to Vector块从 in1 端口获取样本,并将其放入输出Vector中的第二个元素中。Streams to Vector块将两个串行Stream输入组合成二维Vector输出。

搜索Vector to Stream块,并将三个 QT GUI Time Sink块添加到流程图:

 

Vector to Stream块会将Vector序列化为StreamStreams to Vector输出处的样本将交错在一起。

 

编辑三个 QT GUI Time Sink块的标题,以便可以彼此区分。如标题为Signal Source ASignal Source B、Interleaved Signal Sources

 

运行流程图将显示三个时间接收器:Signal Source ASignal Source B、Interleaved Signal SourcesInterleaved Signal Sources时间接收器显示来自信号源 A 和信号源 B 的交错样本:

 

2.10.4 Vector to Stream block

(实验 A04_2_Streams_Vectors.grc)

将向量转换为item流,将N*M项的向量转换为N个M项的数据流(向量/标量)

属性:

a) Num Items:该输入Vector的元素数除以Vector Length的结果,=上述N

b) Vector Length:vector中每个item流的长度,=上述M

 

下面的示例对向量化数据进行序列化,将其转换回两个流。“Vector to Streams”块反序列化向量样本并将其转换为流,对“Streams to Vector”块执行反向操作。

搜索“Vector to Streams”块,将其添加到工作区,然后将其连接到Streams to Vector块:如下

 

运行流程图。已分离回两个流:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值