一、GNURadio简介
GNU Radio是一个设计框架,用户可以用来设计、模拟和部署的真实高效无线电系统。这是一个高度模块化,自带flowgraph
流程图,集成处理各种信号的库,可以很方便的将各个模块结合到一起来处理复杂的信号。
GNU Radio已经被广泛应用于无线电世界,可以用电脑软件处理包括音频处理、移动通信、卫星跟踪、雷达系统、GSM网络、数字信号广播等等
二、GNUradio 特点
1.开源
2.数字;信号处理
理论知识
1.小信号理论
2.数字信号特点
(1) a有限量数值 b只有时间是变量?
(2)数字信号能够用一个数字序列来表示,我们通常称作样本,样本之间固定的时间间隔决定了采样频率。
(3)流程图进行编译:当创建一个信号处理应用,也就是一个完整的块处理图,这样的图在GNU Radio中称为flowgraph
流程图。
安装过程 心得
1.终端 cmd行操作
2.获取安装库失败:unbuntu系统下获取网址速度太慢
查到的解决方法:用梯子;换一个网络代理
自己解决方法:换了一个网络代理以后解决是很快;第二个gr-etcetera我是通过利用pybombs recipes add gr-etcetera git+https://mirrors.tuna.tsinghua.edu.cn/pybombs/recipes/gr-etcetera.git解决的,本质应该也是从镜像网站下载到的。
3.安装 pip包失败
换为pip3命令行Ubuntu下 HackRF的GNURadio环境搭建 - 哔哩哔哩
4.在python运行中 SyntaxError: invalid syntax
重新安装了pip pybombs包
5.运行前端无法显示python自动生成的页面结果 理想如下:
解决方案:id名不合法;传递数据类型不一样
三、GRC简介
1.GRC:(gnuradio-companion的简写,GNU Radio的图形化界面编程工具,类似于simulink)来创建不同的通信程序。简单来说,GRC是一种帮助我们用图形化的形式来创建python脚本程序的工具。
2.首先,看一下GRC的主界面。主界面包括五个部分:
(1)界面右侧的GNU Radio的模块库,用于调用已集成到GRC中的模块
(2)GRC的工具栏,用于GRC程序的打开、创建、编译、执行等操作
(3)GRC的终端,用于显示GRC程序,将模块拖拽到此处,用线将不同的模块连接起来,形成通信程序。
(4)工作空间,用于显示GRC程序运行过程中的调试信息
(5)变量,用于显示GRC程序中的变量名称及其数值
3.
4.修改属性以及颜色展示:
这里的参数,当你修改了参数的值之后,在你未保存之前,参数栏的颜色会变成蓝色。关于该模块的解释说明,可以查看”Documentation”选项卡。
为了更好的区分不同程序,你可以把每个程序的“Option”模块的ID参数,修改为不同的值,例如“tutorial_two_1”,你可以根据自己的需要来命名。这个ID的参数,会决定你生成的python脚本的名称。即如果你的ID是“tutorial_two_1”,那么生成的Python脚本的名字就是“tutorial_two_1.py”。在GNU Radio 3.8中,如果你不修改ID的默认值,当你运行GRC流图的时候,则会提示错误。
四、搭建GRC流程图 基础部分
1.
2.注意前后模块的变量种类要一样
3.修改id名
(一)采样率
1.定理:在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的2.56~4倍;采样定理又称奈奎斯特定理。
概念理解:
频谱波峰:
频域波形:
2.实操:
(二)搭建AM发射器
原理:
flowgraph:
(三)搭建AM接受器
(四)UHD频谱分析-接入式硬件
需要提前下载UHD USRP
五、PSK解调调制(模拟仿真)
笔记目录:
概念笔记:
- constellation modulator实现的功能是MPSK调制,其中有一个参数是‘constellatio:要把二者的ID名设置相同,即可实现MPSK调制,调制的具体信息要在object里面设置
- sps (sample per second) 采样速率的意思,这个参数经常作为变量去设置滤波器
- firdes(意为fir滤滤为波器设计 des是design的缩写),波器设置常用的函数,只需写firdes.lowpss(.),括号内输入滤波器的参数即可实现滤波器设计,该值常作为变量用在环路中
-
根升余弦 (RRC) 脉冲整形滤波器:它为我们提供了一个参数来调整the roll-off factor of the filter,通常在数学上称为“alpha”。下面的 mpsk_rrc_rolloff.grc 流程图生成了一个图示,显示了不同的values of the excess bandwidth。典型值介于 0.2(红色迹线)和 0.35(绿色迹线)之间。
-
来自AI:在GNU Radio中,decimating FIR(有限冲激响应)滤波器是一种用于降低信号采样率的同时保持信号带宽的滤波器。这种滤波器通过丢弃一些采样点来减少数据的率,这个过程称为下采样(decimation)。这对于减少处理带宽和速度非常有用,同时可以减少硬件资源的需求。
要在GNU Radio中实现decimating FIR滤波器你可以使用`firdes`模块中的函数来设计滤波器,然后使用`gr.filter`模块中的`fir_filter_ccf`块来实现。以下是一个简单的例子,展示了如何创建和应用一个decimating FIR滤波器:
from gnuradio import gr, firdes from gnuradio.filter import firdes # 定义滤波器参数 sample_rate = 48000 # 原始采样率 decimation_rate = 4 # 下采样率 bandwidth = 5000 # 滤波器的带宽 taps = fird.low_pass(1, sample_rate, bandwidth, 5000, firdes.WIN_BLACKMAN_hARRIS) # 创建decimating FIR滤波器 decimating_filter = gr.fir_filter_ccf(decimation_rate, taps) # 示例流图 src = gr.vector_source_c(np.random.randn(1000), 'sc16') # 生成随机数据 sink = gr.vector_sink_c() # 数据接收 # 将源数据通过decimating FIR滤波器 src >> decimating_filter >> sink # 运行流图 gr.top_block().run() ```
在这个例子中,我们首先定义了原始采样率`sample_rate`和下采样率`decimation_rate`,以及滤波器的带宽`bandwidth`。然后使用`firdes.low_pass`函数设计了一个低通滤波器的系数`taps`。接着,我们创建了一个`gr.fir_filter_ccf`块,将其参数设置为`decimation_rate`和`t`,这样每个原始采样点会被保留下来,然后丢弃接下来的三个采样点,从而实现4倍的下采样。
请注意,decimating FIR滤波器的设计需要考虑到下采样率,以确保信号的完整性不会因为下采样而丢失重要的信息。通常,你需要确保滤波器的滚降特性在整个信号带宽内都是适当的,以便在降低采样率后能够重建信号。
-
滤波器模块中找了很久taps=rrc_taps 值:firdes.root_raised_cosine (1.0,samp_rate,samp_rate/sps,excess_bw,11*sps)
(一)发射一个信号
1.
(二)qpsk信号生成
官方手册讲解:
在星座图中,我们可以直观的看到过采样(因为我们把Sample per symbol设置成了4,其实实际上我们并不需要这么大的sps,所以叫做过采样)和滤波操作的作用。例如,过采样的结果就是我们在一个符号中生成了4个采样值。在本例子中,均方根升余弦滤波器带来了自干扰,也就是符号间干扰或叫码间干扰(inter-symbol interference, ISI)。ISI对于信号接收和还原来说是一个不利因素。我们将在后续的时钟恢复环节重点解决这个问题。
此刻,我们先观察生成的QPSK信号。在频域图形中,一方面,滤波器可以使得频域信号的带外功率明显降低;另一方面,“Throttle”模块的输出信号被看作是QPSK发射信号,图形中的图标是“Tx”(蓝色曲线),“Decimating FIR Filter”模块的输出信号被看作是QPSK接收信号,图形中的图标是Rx(红色曲线),通过对比发现,经过了“Decimating FIR Filter”模块的作用,接收信号的带外功率明显减少了,即在有效带宽之外,红色曲线的带外功率明显要低于了蓝色曲线的带外功率。
(二)加上信道仿真
解决思路:控制变量
针对加性噪声、频率偏移、时钟偏移分别解决
(三)解决时钟偏移——时钟恢复time recovery
一开始没有看懂官方手册的教程
(四)解决——多径效应
(五)相位矫正和频率微调
(六)解码
附录、错误语法汇集(目前遇到的
invalid literal:python语法错误;十进制语法错误:decimal
invalid synatax:语法错误,基本在工作状态都是这个错误,具体那里错了需要在前面输出结果查找