GNU Radio系列教程(五):初级篇之GNU Radio GRC AM发射与接收

本文用GNU Radio来实现AM发射和接收。

本文的前半部分介绍如何生成AM信号。后半部分则介绍如何解调AM信号。AM信号调制程序利用Socket来将生成的AM信号传输给实现AM解调的程序。本文并没有使用HackRF One、LimeSDR等硬件,只是使用了计算机的扬声器和麦克风。

需要具备的基础知识:

GNU Radio系列教程(三):初级篇之GNU Radio GRC流图

GNU Radio系列教程(四):初级篇之GNU Radio GRC采样率

目录

一、AM发射器

二、AM接收器

三、测试程序

四、有用链接和联系方式


一、AM发射器

按照下图搭建一个AM发射器流图。(注意该图是用的GRC v3.8版本的)

其中使用到的模块及其参数解释如下:

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

(2)“Audio Source”模块:计算机的麦克风被用来作为声音信号的输入。Sample rate(48KHz),Device Name(此参数可以不填,默认为空即可。)

(3)“Sample_rate”参数:在本GRC中除了“Audio Source”模块之外的所有采样率都是768KHz,该采样率的选取依据是,每个码元周期有16个采样值,则48000*16=768000Hz=768KHz。

(4)“Repeat”模块:为了能够实现采样率由48KHz到768KHz的转化,“Repeat”模块将内插值设定为16,48000*16=768000Hz=768KHz。

(5)“QT GUI Range”参数:为了实现对声音信号增益的动态调节控制,设定一个id为volume的“QT GUI Range”参数,默认值为1.2,start开始值为0,stop结束值为10.0,step步长为0.1。

(6)“Multiply Constant”模块:使用id为volume的参数,作为“Multiply Constant”模块的乘数。

(7)“Add Constant”模块:调制信号加上常数1,这里为什么要加上常数1,可参见AM调制公式。

(8)“Signal Source”模块:用于生成一个载波信号,注意这里载波信号的采样率为768KHz,载波信号的频率(48KHz)与“Audio Source”的采样率(48KHz)之间没有必然的联系,只是碰巧而已,你也可以自己修改载波信号频率值。“Signal Source”模块中的“Amplitude”设定为0.5(即500m,m表示的10的-3次方。)

(9)“QT GUI Time Sink”模块:给出生成的AM已调信号时域波形。“Number of Points”为4096(4.096k),采样率为768KHz。

(10)“Multiply”模块:将调制信号与载波信号相乘,实现AM调制操作。

(11)“ZMQ PUB Sink”模块:在使用硬件进行真实信号发射时候,“Multiply”模块的输出AM已调信号,需要通过“band-pass filter”(带通滤波器)之后再接硬件模块(例如osmocom Sink模块)。但是在本例子中,我们直接把AM已调信号传递给了“ZMQ PUB Sink”模块(该模块可以用来将数据通过Socket方式传递给AM接收器)。“Address”值为tcp://127.0.0.1:50001。

AM调制表达式

为了测试AM发射器是否正常工作,我们可以编译并运行AM发射器流图程序,并在对着计算机的麦克风说话的同时,观察时域波形的变化情况。

二、AM接收器

按照下图,搭建一个AM接收器流图。(注意该图是用的GRC v3.8版本的)

其中使用到的模块及其参数解释如下:

(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

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”栏不用填写。

三、测试程序

你可以直接在GRC中工具栏找到编译(或执行按钮),来编译生成python脚本(或运行程序)。当然,你也可以直接找到生成的python脚本,直接运行python脚本,即在终端(ubuntu下打开终端的快捷键是同时按下ctrl、alt、字母T三个按键)中,通过

python3 XXX.py

XXX是你的python脚本文件名

先运行AM接收器流图,然后再运行AM发射器流图,并对着麦克风说话,你就会通过电脑的扬声器听到你说的话。

四、有用链接和联系方式

https://wiki.gnuradio.org/index.php/Simulation_example:_AM_transmitter_and_receiver

淘宝店铺、QQ技术交流群、CSDN联系方式如下:

微信公众号二维码:

猜你喜欢

转载自blog.csdn.net/OpenSourceSDR/article/details/108383826
GNU