走进“开源SDR实验室” 一起玩转GNU Radio:gr-audio

本文内容、开发板及配件仅限用于学校或科研院所开展科研实验!

温馨提示:“开源SDR实验室”是北京的。

本文介绍GNU Radio源码的gr-audio相关实例及模块。

目录

一、cvsd_sweep

 1、VCO模块

2、CVSD Encoder和CVSD Decoder模块

3、Packed to Unpacked模块

4、Char to Float模块

 5、Audio Sink模块

6、QT GUI Tab Widget模块

二、dial_tone

1、Signal Source模块

2、Add模块

3、QT GUI Range模块

三、有用链接和联系方式


一、cvsd_sweep

GRC文件为《gnuradio-3.9.1.0/gr-audio/examples/grc/cvsd_sweep.grc》。该流图的主要功能是实现了CVSD编码和解码,运行时扬声器可发声。VCO模块受控于Signal Source模块,产生幅度频率变化的正弦信号,再输入给CVSD编码器进行编码,再经过CVSD解码器进行解码后对信号进行了还原。每个可直观查看信号的时域和频域变化。具体用到了Signal Source、Throttle、VCO、CVSD Encoder、CVSD Decoder、Packed to Unpacked、Char To Float、Audio Sink、QT GUI Frequency Sink、QT GUI Time Sink模块。

 1、VCO模块

https://wiki.gnuradio.org/index.php/VCO

该模块为压控振荡器模块,可以根据输入幅度生成相应频率的正弦波。模块输入是控制电压的float数据流,输出是float型的(振荡器)正弦波。

模块参数解释如下:

Sample Rate,采样率。

Sensitivity,灵敏度,单位为弧度/秒/伏。

Amplitude,振幅,输出信号的振幅。

2、CVSD Encoder和CVSD Decoder模块

一般成对出现在程序中。这是CVSD编码器/解码器的包装程序,它执行与声码一起工作所必需的插值和滤波。它将传递的浮点数(+ -1)转换为短整型数值,将其缩放(至32000;略低于最大值),对其进行插值,然后对其进行声码处理。输入的采样率可以是任何值,当然,采样率越高和插值率越高,声音质量就越好。

模块参数解释如下:

Resample,重采样取值。

Frac. Bandwidth,频率带宽值。

3、Packed to Unpacked模块

https://wiki.gnuradio.org/index.php/Packed_to_Unpacked

该模块是数据包解码模块,支持指定大端和小端方式。

模块参数解释如下:

Bits per Chunk,每个输出(字节/短整型)中要包含多少位。

Endianness:处理输入位时是以大端MSB方式还是小端LSB方式;(LSB的意思是:全称为Least Significant Bit,在二进制数中意为最低有效位,一般来说,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。MSB的意思是:全称为Most Significant Bit,在二进制数中属于最高有效位,MSB是最高加权位,与十进制数字中最左边的一位类似。)

Num Ports,输入和输出端口的数量,如果需要多个并行流,可以通过该参数来设定。

关于大端和小端,这里给出一个大端的例子。如果bits_per_chunk = 1 且选择MSB ,如果输入为: 0b11110000,那么输出则为: 0b00000001 0b00000001 0b00000001 0b00000001 0b00000000 0b00000000 0b00000000 0b00000000

4、Char to Float模块

https://wiki.gnuradio.org/index.php/Char_To_Float

该模块是用于将Char字符流数据转换成Float数据的模块,并可以通过一个缩放因子来调整输入数据的大小(默认情况下,这个缩放因子是1)

关于这个缩放因子,我们通过对比取值为1和10两种情况,便可以一目了然的看到该因子的调节作用。

 在图中,Random Source模块生成一个最小值为0,最大值为128,采样数为1K的Byte型数据流,然后分别通过缩放因子分别为1和10的两个Char to Float模块,最后接入QT GUI Time Sink模块中。通过对比发现,缩放因子为1的情况下,转换后的Float数据的最小值为0,最大值为128;缩放因子为10的情况下,转换后的Float数据的最小值为0,最大值为12.8。

 5、Audio Sink模块

https://wiki.gnuradio.org/index.php/Audio_Sink

该模块支持通过扬声器或其他音频设备播放信号,即发出声音。

模块参数解释如下:

Sample Rate,可以通过下拉列表选择16KHz、22.05KHz、24KHz、32KHz、44.1KHz、或48KHz,也可以自动手动输入采样率数值或变量名。注意,并不是你的电脑设备能支持所有采样率,对于一般情况来说,该采样值应该为48KHz。

Device Name,该参数可以默认不填,如果默认不填的话则使用电脑默认的音频设备。对于用户自定义的设备,则需要根据不同的操作系统来决定具体的参数。

在苹果系统中,需要找到“系统设置”,点击“声音”,找到“输出”标签,这里就给出了所有可用的音频设备。当一个新的音频设备查到电脑中时,则会新增一个新设备名称。例如在一些Mac电脑中,会有“Headphone”字眼的设备。由于大多数的设备名称中都包括空格,因此一定要注意在设备名称参数中加上双引号。例如,spectrum_inversion.py -O "MacBook Pro Speakers"。

在Linux系统中,典型的实例包括:hw:0,0、plughw:0,0或pulse。对于那些ALSA用户的音频工作有问题的情况,则需要在终端中输入命令aplay -L来查询设备名称,例如,

hw:CARD=Generic,DEV=0

HD-Audio Generic, ALC662 rev3 Analog

Direct hardware device without any conversions

那么我们可以在Audio Sink模块的Device Name栏中填写“hw:CARD=Generic,DEV=0”即可,注意一定要带双引号。

从设备列表中找到一个适用的设备。如果是使用带扬声器的HDMI适配器,则需要找到带有HDMI字眼的设备条目。

在Windows系统中,找到“设置”—》“系统”—》“声音”—》“输出”,选择输出设备的下拉列表中就会有所有可用的音频设备。当一个新的音频设备查到电脑中时,则会新增一个新设备名称。例如插入耳机后,则会新加一个设备。

Ok to Block,默认值为yes,应该当该模块不被其他模块限流情况下将该参数设置为yes。

Num Inputs,Audio Sink模块可以有多个输入,这取决于你电脑的硬件。例如,如果是stereo立体声,则该参数为2,如果是单声道,则该参数为1。

6、QT GUI Tab Widget模块

该模块用于给其他QT类组件创建选项卡。该模块的参数ID用于其他QT Widget模块GUI Hint参数,实现图形的位置控制。所有的QT Widget模块和图形模块都有一个叫做GUI Hint的参数。这个参数可以用于排版图形位置。

GUI Hint参数的命名格式为:(行数,列数,行宽个数,列宽个数)。其中,行数是指图形占整个界面的第几行,列数是指图形占整个界面的第几列,行宽个数是指该行占了几个单位行,列宽个数是指该列占了几个单位列。

GUI Hint图形位置行列数字编排规则表

 如表所示,在一个界面中,第一行的行索引为0,第二行的行索引为1,第三行的行索引为2,以此类推。第一列的列索引为0,第二列的列索引为1,第三列的列索引为2,以此类推。

 

如表所示,Waveform Selector的(0,0,2,1)表示的是占界面的第一行和第二行,占第一列,这是因为(0,0,2,1)的数字2表示占两行。

如果我们的界面有几个不同的tab标签页,假设我们的QT GUI Tab Widget模块的ID是“displays”,那么我们可以通过“displays@0”、“displays@1”和“displays@2”来表示界面的第一个tab标签页、第二个tab标签页和第三个tab标签页。

在cvsd_sweep.grc中“QT GUI Frequency Sink”和“QT GUI Time Sink”模块中的“GUI Hint”参数中,我们会发现“displays@0:0,0,1,1”、“displays@0:1,0,1,1”、“displays@1:0,0,1,1”、“displays@1:1,0,1,1”、“displays@2:0,0,1,1”和“displays@2:1,0,1,1”。如图 3‑7所示,以“displays@0:0,0,1,1”和“displays@0:1,0,1,1”为例,我们会发现“Name”为“Original Spectrum”的“QT GUI Frequency Sink”模块占第一个标签页的第一行第一列,“Name”为“Original Waveform”的“QT GUI Time Sink”模块占第一个标签页的第二行第一列。其他标签页同理。

二、dial_tone

GRC文件为《gnuradio-3.9.1.0/gr-audio/examples/grc/dial_tone.grc》。该流图的功能是实现两个单音信号和一个噪声信号的叠加,演示拨号音的控制。通过调整volume滑块,即可选择音量。调整Noise Amplitude滑块,可改变噪声幅度,改变你听到声音的效果,即噪声幅度越大,则你听到的沙沙噪声越大。

1、Signal Source模块

https://wiki.gnuradio.org/index.php/Signal_Source

该模块是信号源模块,用于生成常数、正弦波、余弦波、方波、三角波和锯齿波的信号,支持complex、float、int、short和byte类型输出类型。

模块参数解释如下:

Sample Rate,采样率。

Waveform,可选项包括[Constant常数,Sine正弦波,Cosine余弦波,Square方波,Triangle三角波,Saw Tooth锯齿波]。

对于带有变量的选项,应使用以下取值:常数=100,正弦=101,余弦=102,方波=103,三角形=104,锯齿=105。

Frequency,信号的频率。

Amplitude:输出幅度(默认值为1)。

Offset:从零开始偏移(默认值为0)。

Initial Phase:默认值为0(弧度)。

2、Add模块

https://wiki.gnuradio.org/index.php/Add

该模块实现逻辑加运算,输出值为输入值的和,即output[n] = sum( x_0[n], x_1[n], ..., x_m[n])

模块参数解释如下:

IO type,输入输出数据类型,支持complex、float、int和short。

Num Inputs,数据数据源个数。

Vec Length,向量长度,一般取值为1。

3、QT GUI Range模块

https://wiki.gnuradio.org/index.php/QT_GUI_Range

该模块用于实现界面中的变量调节功能。该模块的ID参数是一个变量名,其他可视化模块可以调用这个变量名,以此来实现在界面中对该变量的可变调节。

模块参数解释如下:

ID,该模块的ID号,在当前流图中唯一的ID号。

Label,该模块的标签名称,如果Label栏空着什么也不填写,那么在界面中的变量名称就与ID一致。

Type,取值类型,支持float和int。

Default Value,默认值。

Start,起始值(最小值)。

Stop,终止值(最大值)。

Step,步长值。

Widget,变量变化形式,支持数值和滑动、仅数值、仅滑动和旋钮四种形式。

Minimum Length,最小长度。

GUI Hint,图形的位置参数。

三、有用链接和联系方式

https://wiki.gnuradio.org/index.php/VCO

https://wiki.gnuradio.org/index.php/Packed_to_Unpacked

https://wiki.gnuradio.org/index.php/Char_To_Float

https://wiki.gnuradio.org/index.php/Audio_Sink

https://wiki.gnuradio.org/index.php/Signal_Source

https://wiki.gnuradio.org/index.php/Add

https://wiki.gnuradio.org/index.php/QT_GUI_Range

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值