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

news2024/11/26 10:31:39

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的了解。

图片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录Windows XP系统安装详细图文版安装日志

一、准备工作 一、下载镜像文件 我用的镜像文件在网盘可自行下载: 点击下载OSI镜像文件提取码:888999 系统安装介质准备:首先,你需要准备一个Windows XP的安装介质。这可以是光盘,也可以是U盘。确保你的安装介质是…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂,牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

Linux(磁盘管理与文件系统)

目录 1. 磁盘基础 1.1 磁盘结构 1.2 MBR 1.3 磁盘分区结构 2. 文件系统类型 2.1 XFS文件系统 2.2 SWAP 2.3 fdisk命令 2.4 创建新硬盘 3.创建文件系统 3.1 mkfs 3.2 挂载、卸载文件系统 3.3 查看磁盘使用情况 1. 磁盘基础 1.1 磁盘结构 磁盘的物理结构 盘片:硬…

Java项目实现图形验证码(Hutool)

项目架构: 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 业务场景: 登录时使用验证码登录 1.1 打开hutool, 搜索 图片验证码 1.2后端编写生产验证码方法 1.3前端 1.3.1展示验证码 1.3.2 前端方法 1.3.2.1UU…

快速入门Web开发(上) 黑马程序员JavaWeb开发教程

快速入门Web开发(上) 本文档是黑马程序员的 黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)_哔哩哔哩_bilibili上这篇没有写什么很深的个人见解 但下篇有 开发Web网…

02 MySQL --DQL专题--条件查询、函数、分组查询

一些盲点. 数据库中仅有月薪字段(month_salary),要求查询所有员工的年薪,并以年薪(year_salary)输出: 分析: 查询操作中,字段可以参与数学运算as 起别名,但实际上可以省略 #以下…

Stronghold Village

有了近2000个预制件和大量资产,您可以用基本的或先进的模块化预制件建造您的设防城镇或梦幻村庄,其中有许多定制选项和大量道具和物品 【资产描述】 你准备好建造你的史诗般的奇幻设防小镇了吗?有了这个庞大的资产库,您将能够创建村庄、城市、据点、乡村建筑、大教堂、城堡…

Tricentis测试生成式人工智能系统和红队:入门指南

Tricentis测试生成式人工智能系统和红队:入门指南 测试人工智能并确保其责任、安全和保障的话题从未如此紧迫。自 2021 年以来,人工智能滥用的争议和事件增加了26 倍,凸显了日益增长的担忧。用户很快就会发现,人工智能工具并非万无一失。他们可能会表现出过度自信,并且缺…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目(这个看下一篇文章吧) 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍:YApi 是高效、易用、功能强大的 api 管理平台&#…

使用vite从头搭建一个vue3项目(四)使用axios封装request.js文件,并使用proxy解决跨域问题

目录 一、创建request.js文件二、创建axios实例三、创建请求、响应拦截器四、使用 request.js,测试接口:https://api.uomg.com/api/rand.qinghua1、调取接口代码书写2、注意(跨域问题) axios 的二次封装有三个要点: 创…

解决程序化刷新EXCEL提示更新外部链接的弹窗问题

解决方法 【信任中心】-> 【消息栏】->勾选如下策略提示 2. 【信任中心】->【外部内容】->启用下面的三项链接 3. 【信任中心】->【宏设置】->启用所有宏

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面(部分)地图搭建(部分)定义植物类 (部分)定义僵尸类(部分)游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…

MySQL-笔记-06.数据高级查询

目录 6.1 连接查询 6.1.1 交叉连接(cross join) 6.1.2 内连接(inner join) 6.1.3 外连接(outer join) 6.1.3.1 左外连接(left [outer] join) 6.1.3.2 右外连接(rig…

Meta因露骨AI图片陷入困境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Postgresql源码(126)TupleStore使用场景与原理分析

相关 《Postgresql源码(125)游标恢复执行的原理分析》 《Postgresql游标使用介绍(cursor)》 总结 开源PG中使用tuple store来缓存tuple集,默认使用work_mem空间存放,超过可以落盘。在PL的returns setof场景…

回文链表leecode

回文链表 偶数情况奇数情况 回文链表leecode 偶数情况 public boolean isPalindrome(ListNode head) {if (head null) {return true;}ListNode fast head;ListNode slow head;while (fast ! null && fast.next ! null) {fast fast.next.next;slow slow.next;}//反…

Day43:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

Excel文件解析(Java)

一、概述 在应用程序的开发过程中&#xff0c;经常需要使用 Excel文件来进行数据的导入或导出。所以&#xff0c;在通过Java语言实现此类需求的时候&#xff0c;往往会面临着Excel文件的解析(导入&#xff09;或生成&#xff08;导出)。 在Java技术生态圈中&#xff0c…

Java实现RSA加密示例代码

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 RSA加密是一种非对…

如何配置Postgres的自动扩展功能以应对数据增长

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1&#xff1a;创建表空间示例2&#xff1a;创建分区表示例3&#xff1a;调整配置参数示例4&#xff1a;使用监控和告警工具 总结 在PostgreSQL中&#xff0c;随着数据的…