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

本文讲解视频:https://www.bilibili.com/video/BV1wy4y1U7EP

本文的前半部分介绍如何生成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联系方式如下:

微信公众号二维码:

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

  1. GNU Radio系列教程(七):初级篇之GNU Radio GRC PSK调制解调

    本文讲解视频:https://www.bilibili.com/video/BV1J54y147GQ 在本文中,我们将进行纯仿真实验,不使用任何硬件设备.但是,我们会考虑无线信号在实际信道传输过程中所 ...

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

    本文的目标: (1)使用GNU Radio的标准模块来创建流图GRC程序 (2)学习如何在GRC的模块之间调试.解决问题 (3)理解GRC中的采样模块和限流模块的作用 (4)学习如何使用GNU Rad ...

  3. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...

  4. eureka集群只注册一个_Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...

  5. Linux求平方脚本,Linux Shell脚本系列教程(五):数学运算

    这篇文章主要介绍了Linux Shell脚本系列教程(五):数学运算,本文讲解了使用let.(())和[]进行算术运算.使用expr进行算术运算.使用bc进行算术运算三种方法,需要的朋友可以参考下 在 ...

  6. SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】

    阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...

  7. ASP.NET 5系列教程(七)完结篇-解读代码

     在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]&quo ...

  8. ES6系列教程第四篇--asyn详解

    一.什么是async async其实是ES7的才有的关键字,放在这里说,其实是和我们前面所说的Promise,Generator有很大关联的.async的意思是"异步",顾名思义是 ...

  9. ES6系列教程第三篇--Generator 详解

    一.什么是Generator 函数 先看下面的Generator函数, function* helloGenerator() {console.log("this is generator& ...

  10. TextSeek使用教程(初级篇) - 文件搜索软件

    TextSeek使用教程 (初级篇) 下载安装 搜索初体验 挖掘搜索结果 预览文档内容 软件主要特点 最后 TextSeek使用教程 (初级篇) 随着大家收集整理的文档日益增加,越来越多的文件难以管理 ...

最新文章

  1. 如果你是PM,想转PM,拿走
  2. 如何利用python爬虫获取网易云音乐某个歌手简介_Python 爬虫获取网易云音乐歌手信息...
  3. Mozilla 准备让“合格” Linux 用户测试 WebRender
  4. CKedit在线编辑器
  5. 解决在使用 Qt 编译项目时出现 “C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode格式以防止数据丢失“ 的警告
  6. RabbitMq--3--案例
  7. 重点客户销售数据分析python_药品销售数据分析--python
  8. 前端学习(2575):vue-route使用场景
  9. HOG + SVM 实现图片分类(python3)
  10. [郑重声明]木草山人编码的习惯
  11. [svn] 解决SVN冲突攻略(手册)
  12. JAVA综合实习报告
  13. 聚类算法——KMeans(K-均值)
  14. linux 使用shell/python编写钉钉自动监控报警脚本
  15. win10:打印机无故脱机、打印机缺纸故障处理
  16. unity3d wwise 基础相关
  17. pmsm什么意思_PMSM是什么意思
  18. 从奥运门票系统瘫痪到家乐福踩踏事件看软件设计中业务模型的处理
  19. 利用FastReport传递图片参数,在报表上展示签名信息
  20. Linux Fair Queue Packet Scheduler (FQ)公平队列报文调度器

热门文章

  1. C语言中的 pow 函数 使用方法及注意事项,和常见报错原因,且分享实战中的使用
  2. 修改oracle用户资源限制,oracle用户登陆失败次数限制修改
  3. Geoserver入门操作系列之二:创建图层样式
  4. loj507(dp)
  5. 微信公众号的订阅号和服务号权限区别
  6. 不要在意别人的目光,走自己的路
  7. 基于MK802 MiniPC的扩展开发应用-软/硬件修改和扩展
  8. select 设置不可用,提交表单时能传值
  9. 软件或者网站的版权声明中的两个时间是什么意思?该如何正确书写?
  10. 惠斯通电桥你知道怎么用吗?