软件无线电安全之GNU Radio基础 -上

GNU Radio介绍

GNU Radio是一款开源的软件工具集,专注于软件定义无线电(SDR)系统的设计和实现。该工具集支持多种SDR硬件平台,包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图,使用不同的模块实现信号处理、滤波、解调等功能。GNU Radio提供了丰富的信号处理库,支持实时和离线操作,广泛应用于无线通信、雷达、无线电天文学等领域。其强大的社区支持和详细的文档使开发者能够更好地使用这一工具,灵活、可定制地构建和测试各种无线通信系统。

调制与信号处理流程

人类的可听范围为20 - 20000kHz。相对而言,这些频率远低于FM无线电广播频率。因此,音频波只能传播很短的距离。广播电台想要远程传输声音和音乐的音频信号。那么电台就需要将音频信号中的信息传输到更高频率的载波上。这些波可以比人们可听见的波传播得更远、更快。这个过程称之为调制。调制有几种不同的类型,我们经常收听的FM 广播电台,使用的是频率调制。

在软件无线电(SDR)行业中,数字信号是以离散形式表示的信号,即信号的幅度、频率和相位在时间上是离散的。这与模拟信号不同,模拟信号是连续的。数字信号的处理涉及将模拟信号转换为数字形式,通过一系列离散的处理步骤对其进行操作,最后将结果重新转换回模拟信号。

以下是数字信号在软件无线电行业中的处理步骤:

  1. 模数转换(Analog-to-Digital Conversion,ADC)过程:模拟信号首先通过模数转换器(ADC)转换为数字信号。目的:将连续的模拟信号在时间和幅度上进行离散化,以便计算机能够处理。

  2. 数字信号处理(Digital Signal Processing,DSP)过程:数字信号经过一系列数字信号处理算法,如滤波、混频、解调等。目的:在数字域中对信号进行操作和处理,以提取、增强或变换信号的特定特征。

  3. 数模转换(Digital-to-Analog Conversion,DAC)过程:处理后的数字信号通过数模转换器(DAC)转换为模拟信号。目的:将数字信号还原为连续的模拟信号,以便在后续的模拟电路或设备中使用。

  4. 输出阶段过程:模拟信号经过可能的放大器、滤波器等设备后,最终输出到用户的设备,如扬声器或显示器。目的:将数字信号处理的结果转换为可感知或可用的模拟信号。

在软件无线电中,这些步骤通常在计算机上通过专用软件(例如本小节中的GNU Radio)执行。这种数字信号的处理方法使得系统更加灵活,能够适应不同的通信标准和应用需求。

GNU Radio安装

sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils cmake build-essential
git clone git://github.com/EttusResearch/uhd.git
cd ~/code/udh/host
sudo mkdir build
sudo cmake ../
sudo make
sudo ldconfig
export LD_LIBRARY_PATH=/usr/local/lib
sudo apt install cmake git g++ libboost-all-dev python-dev python-mako \
python-numpy python-wxgtk3.0 python-sphinx python-cheetah swig libzmq3-dev \
libfftw3-dev libgsl-dev libcppunit-dev doxygen libcomedi-dev libqt4-opengl-dev \
python-qt4 libqwt-dev libsdl1.2-dev libusb-1.0-0-dev python-gtk2 python-lxml \
pkg-config python-sip-dev
sudo apt-get install python3-pip
git clone --recursive https://github.com/gnuradio/gnuradio.git
cd gnuradio
sudo mkdir build
cd build
sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/gnuradio ../
sudo make
sudo make install
sudo vim ~/.barshrc
export PATH=$PATH:/opt/gnuradio/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gnuradio/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/gnuradio/lib/pkgconfig
export PYTHONPATH=$PYTHONPATH:/opt/gnuradio/lib/python2.7/dist-packages

GNU Radio使用

第一个流程图

打开终端运行gnuradio_companion命令,会显示如下界面,界面中有Options和Variable俩个块。我们双击 Options 块,我们可以通过编辑 Id 和 Title 来命名流程图:

图片

点击file->save,输入grc文件的名称后保存GRC流程图。

图片

我们可以进入保存grc的目录下进行查看,发现保存了一个grc文件和生成了一个python文件。其中grc文件包含了在 GRC 中显示流程图的信息,python文件则包含实际的 Python 流程图代码。

图片

图片

返回gnuradio打开的grc文件中,键盘使用ctrl+f或者点击菜单栏中的放大镜按钮可以进行模块搜索。这里我们分别搜索 Signal Source 、Throttle、QT GUI Frequency Sink 和 QT GUI Time Sink模板,并按照下图顺序将每个块拖放到工作区中。随后依次点击上一个块out口和下一个块的in口,连接效果如下。

图片

点击Execute按钮(菜单栏中绿色的三角按钮)启动程序,我们可以看到如下的波形:

图片

定义变量

我们搜索var,然后将Variable变量模块拖入工作区中。并将其id命令为frequency。

图片

双击Signal Source,修改Sample Rate的值为samp_rate变量,即可将定义的samp_rate=32k值赋值给Signal Source的。修改Frequency的值为frequency变量。

图片

运行时更新变量

GNU Radio 模块库自带 QT GUI 模块,这些模块允许在运行时对流程图进行交互和修改。QT GUI Range 模块会创建一个滑块,可用于运行时更新变量。我们搜索range并将QT GUI Range块拖入工作区中:

图片

图片

QT GUI Range是一个可变滑块,使用该模块需要设置 QT GUI Range默认值。我们将ID修改为frequency,然后将Default Value设置为 0。这里的start和stop是滑块的开始值和停止值。我们设置起始值为 -samp_rate/2 ,停止值设置为 samp_rate/2 。step是滑块的步长。我们这里将步长设置为 100 Hz ,并点击apply。

图片

点击运行流程图后,效果如下。我们可以滑动按钮来修改frequency的值。

图片

图片

图片

QT GUI Chooser为变量创建选项下拉菜单。我们可以搜索Chooser,并将 QT GUI Chooser拖放到工作区中。

图片

修改QT GUI Chooser的ID值后,点击apply,发现报错。

图片

这里是因为我们前面的QT GUI Range块已经引用了frequecy变量,导致冲突。

图片

我们右击QT GUI Range块,点击disable将其禁用,禁用该块后显示为灰色。

图片

此时已经显示正常,我们此时点击运行流程图。

图片

QT GUI Chooser效果如下。

图片

图片

信号数据类型

块上的每个输入和输出端口都将具有与之关联的数据类型。数据类型由输入和输出端口的颜色标识,我们单击 Help->Types可以进行查看:

图片

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

图片

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

图片

图片

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

图片

将所有数据类型转换为 Float 后,我们重新运行该流程图:

图片

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

图片

数据类型转换

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

图片

该块默认为 Integer 32 数据类型。双击该块以打开属性并将数据类型修改为 byte:

图片

Random Source 和 Throttle 模块之间的红色箭头表示需要修复的数据类型错误。双击 Throttle 模块,我们将数据类型更改为 byte:

图片

QT GUI Time Sink 没有 char 数据类型,我们选择float类型。GNU Radio 模块库附带了类型转换器下列出的各种数据类型转换器。搜索 Char To Float 模块,将其拖动到工作区中,然后将其连接到流程图中。

图片

现在所有红色错误都消失了,按播放按钮启动流程图。QT GUI Time Sink 现在将显示来自随机源块的数据,该块随机化为 0 和 1:

图片



其他

以上为gnuradio几个基础模块的使用方法,除了上面用到模块的使用,常见的其他模块使用效果如下:

信号波形生成器(Waveform Generators)

  1. 常数信源(Constant Source) - 生成固定幅度的常数信号。

  2. 噪声信源(Noise Source) - 生成各种类型的噪声信号,如高斯噪声。

  3. 信号源(Signal Source) - 生成各种信号类型,如正弦波、方波等。

调制器(Modulators)

  1. AM解调(AM Demod) - 解调幅度调制(AM)信号。

  2. 连续相位调制(Continuous Phase Modulation) - 进行连续相位调制。

  3. 相位偏移调制与解调(PSK Mod/Demod) - 进行相位偏移调制和解调。

  4. 高斯频移键控调制与解调(GFSK Mod/Demod) - 高斯频移键控调制和解调。

  5. 高斯最小频移键控调制与解调(GMSK Mod/Demod) - 高斯最小频移键控调制和解调。

  6. 正交振幅调制调制与解调(QAM Mod/Demod) - 进行正交振幅调制和解调。

  7. 宽带调频接收(WBFM Receive) - 宽带调频调制的接收端。

  8. 窄带调频接收(NBFM Receive) - 窄带调频调制的接收端。

界面(GUI)

  1. 星座图(Constellation Sink) - 可视化星座图。

  2. 频域图(Frequency Sink) - 显示信号频谱的频域图。

  3. 时域图(Time Sink) - 显示信号的时域波形图。

  4. 直方图(Histogram Sink) - 显示信号的直方图。

  5. 瀑布图(Waterfall Sink) - 显示频谱随时间变化的瀑布图。

数学运算(Math Operators)

  1. 绝对值(Abs)

  2. 相加(Add)

  3. 复数共轭(Complex Conjugate)

  4. 相除(Divide)

  5. 积分(Integrate)

  6. 取对数(Log10)

  7. 相乘(Multiply)

  8. 均方根(RMS)

  9. 相减(Subtract)

信道模型

  1. 衰落信道模型(Fading Model) - 模拟信号在信道中的衰落效应。

  2. 动态信道模型(Dynamic Channel Model) - 模拟动态变化的信道特性。

  3. 频率选择性衰落模型(Frequency Selective Fading Model) - 模拟频率选择性衰落的信道。

滤波器(Filters)

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

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

  3. 无限冲激响应滤波器(IIR Filter)

  4. 均方根余弦滤波器(Root Raised Cosine Filter)

  5. 抽取有限冲激响应滤波器(Decimating FIR Filter)

傅里叶分析

  1. 快速傅里叶变换(FFT) - 执行快速傅里叶变换以分析信号的频谱。

  2. 克斯塔斯环(Costas Loop) - 一种相位同步技术,通常用于解调PSK调制的信号。

实验:制作一个FM receiver流程图

该实验我们使用osmocom_source 模块来接收FM信号,设置中心频率center_freq=97.9MHz,设置了一个滑块channel_freq,默认频率为97.9MHz。这里需要注意,channel_freq是收听广播的频率,center_freq是接收信号的中心频率。其中采样率设置为变量samp_rate=10MHz(采样率决定了接收信号的范围,以中心频率为中心左右各5MHz。),Ch0:Frequency (Hz)设置为变量center_freq=97.9MHz。用一个Signal Source产生一个频率为center_freq-channel_freq的余弦波来与osmocom Source模块的输出相乘,进行频谱搬移。流程图中低通滤波器(低通滤波器就是只允许频率低于截止频率的波通过的滤波器,高于截止频率的波会被直接消除)的截止频率设置为75kHz,过渡带宽为25kHz,Decimation抽取值为int(samp_rate/channel_width)=50,经过此模块后的采样率由10MHz变为了200kHz。使用Rational Resampler模块来继续调整采样率,以此来满足后续Audio Sink模块需要的48kHz做准备。经过Rational Resampler模块作用,采样率变化过程为200k*12/5=480kHz。使用WBFM接收模块来进行WBFM解调,其中Audio Decimation为10,表示将采样率480kHz要变为480k/10=48kHz,以此来适应Audio Sink所要求的48kHz。Quadrature Rate表示的是WBFM Receive模块所期望的输入采样率为480kHz。

图片

点击运行后,即可收听97.9MHz频率的波段。这里虽然可以收听到FM电台,但是声音一样有断续,左下角控制终端一直输出aUaU...。经过查阅相关资料后发现是虚拟机音频欠载的原因,目前该问题未解决,切换至windows实体机则不会出现该问题。该流程图后续优化将frequency设置为滑块并设置初始和结束值,便可以很方便的修改收听频率。

图片

总结

这一小节,我们简单使用了GNU Radio软件,我们通过GNU Radio Companion(GRC)创建了简单的流程图,展示了信号生成、处理和输出的流程。最后通过制作一个FM receiver来加深对GNU Radio的了解。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/544153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习54-ARM3(中断和时钟)

知识零碎: import ,定义表示这是一个外部变量的标号,不是在本程序定义的 export ,表示本程序里面用到的变量提供给 其他模块 调用的。 按键模块中,K1和K6所连接的高电阻,根据外部变化变化 …

HiveQL练习(hive3.x)

零、准备工作 1. Hive环境安装 参见搭建Hive 3.x环境(CentOS 9 Hadoop3.x) 2. 准备数据 在虚拟机HOME目录创建如下文件内容: cd /root vi emp.csv内容如下: 7369,SMITH,CLERK,7902,1980/12/17,800,,20 7499,ALLEN,SALESMAN…

SpringMVC--获取请求参数 / 域对象共享数据

目录 1. SpringMVC 获取请求参数 1.1. 通过ServletAPI获取 1.2. 控制器方法形参获取 1.3. RequestParam 1.4. RequestHeader 1.5. CookieValue 1.6. 通过POJO获取请求参数 1.7. 解决获取请求参数的乱码问题 2. 域对象共享数据 2.1. 三大域对象 2.2. 准备工作 2.3. S…

8:系统开发基础--8.5:系统设计、8.6:系统测试 、8.7:软件维护 、8.8:软件质量保证、8.9:软件文档

转上一节: http://t.csdnimg.cn/X0GjWhttp://t.csdnimg.cn/X0GjW 8.5:系统设计 考点1:系统设计概述 1:软件设计的任务与活动 体系结构设计:定义软件系统各主要部件之间的关系。 数据设计:基于E-R图确定…

免费的 ChatGPT 网站(六个)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、insCode二、讯飞星火三、豆包四、文心一言五、通义千问六、360智脑 现在智能…

专题十三、预处理器

预处理器 1. 预处理器的工作原理2. 预处理指令3. 宏定义3.1 简单的宏3.2 带参数的宏3.3 # 运算符3.4 ## 运算符3.5 宏的通用属性3.6 宏定义中的圆括号3.7 创建较长的宏3.8 预定义宏3.9 C99 中新增的预定义宏3.10 空的宏参数3.11 参数个数可变的宏3.12 __func__ 标识符 4. 条件编…

Leetcode 416.分割等和子集

题目 思路 使用0-1背包的思路。 之前0-1背包是说有N个物品,一个最大承重重量为W的背包。每个物品都有各自的重量和value,要让放入背包中物品价值总和最大。 这道题如何对应成0-1背包,看下面的分析。 背包的大小:要想两个子集元素和相等&am…

宝塔面板Docker+Uwsgi+Nginx+SSL部署Django项目

这次为大家带来的是从零开始搭建一个django项目并将它部署到linux服务器上。大家可以按照我的步骤一步步操作,最终可以完成部署。 步骤1:在某个文件夹中创建一个django项目 安装django pip install django创建一个django项目将其命名为djangoProject …

【板栗糖GIS】如何给微软拼音输入法加上小鹤双拼

【板栗糖GIS】如何给微软拼音输入法加上小鹤双拼 用过在注册表里新建的方法,结果弄完没有出现小鹤双拼方案,想到了自己写reg表 目录 1. 新建一个txt文件 2. 把.txt的后缀名改成.reg,双击运行 3. 在设置中找到微软输入法-常规 1. 新建一个…

二分查找(函数法)

1.二分查找的前提 只有单调的序列才能进行二分查找; 一般为单调不减,单调不增需要像 sort() 一样修改比较函数; 2.binary_search( ) 函数 binary_search( ) 是算法库(algorithm)函数里面的,用于在一个已经…

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】

山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…

【大语言模型】轻松本地部署Stable Diffusion

硬件要求: 配备至少8GB VRAM的GPU,如果你的电脑只有CPU,请看到最后。根据部署规模,需要足够的CPU和RAM。 软件要求: Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…

Training - PyTorch Lightning 分布式训练的 global_step 参数 (accumulate_grad_batches)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137640653 在 PyTorch Lightning 中,pl.Trainer 的 accumulate_grad_batches 参数允许在执行反向传播和优化器步骤之前&…

CSS常用十大选择器(理论+代码实操)

HTML代码实例 注意&#xff1a;拷贝后本地运行注意head标签中的link标签的href属性是否正确 我的目录结构&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title><lin…

人机区别之一在于机器智能还不能提出问题

人机区别在于机器智能目前还不能提出问题。虽然机器智能已经可以通过程序和算法执行各种任务&#xff0c;但它们仍然无法像人类一样主动思考和提出问题。机器智能只能根据预设的指令或对特定情况的响应来进行操作&#xff0c;而无法产生自己的独立思考和主动提问。这是因为机器…

广东省道路货物运输资格证照片回执可手机线上办理

广东省道路运输资格证是从事道路运输业务、危险品道路运输人员的必要证件&#xff0c;而在办理该证件的过程中&#xff0c;驾驶员照片回执是一项必不可少的材料。随着科技的发展和移动互联网的普及&#xff0c;现在办理驾驶员照片回执已经不再需要亲自前往照相馆&#xff0c;而…

结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用 示例项目(github)&…

MES生产管理系统:私有云、公有云与本地化部署的比较分析

随着信息技术的迅猛发展&#xff0c;云计算作为一种新兴的技术服务模式&#xff0c;已经深入渗透到企业的日常运营中。在众多部署方式中&#xff0c;私有云、公有云和本地化部署是三种最为常见的选择。它们各自具有独特的特点和适用场景&#xff0c;并在不同程度上影响着企业的…

neo4j使用详解(结尾、neo4j的java driver使用模板及工具类——<可用于生产>)

Neo4j系列导航: neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 neo4j java Driver等更多 1. 简介 本文主要是java使用neo4j driver操作neo4j的模板项目及非常有用的工具类,主要包括: 图…

Tesserocr 的安装步骤

Tesserocr 的安装 OCR&#xff0c;即 Optical Character Recognition&#xff0c;光学字符识别。是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。那么对于图形验证码来说&#xff0c;它都是一些不规则的字符&#xff0c;但是这些字符确实是由字符稍加扭…