本文用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发射器流图。(注意该图是用的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接收器流图。(注意该图是用的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联系方式如下:
微信公众号二维码: