GNU Radio
简介
GNU Radio 是一款免费的开源软件开发工具包,提供信号处理模块来实现软件无线电。它可与现成的低成本外部 RF 硬件一起使用,以创建软件定义的无线电,或者在类似模拟的环境中不使用硬件。它广泛用于研究、工业、学术界、政府和业余爱好者环境,以支持无线通信研究和现实世界的无线电系统。
GNU Radio 是一个框架,它使用户能够设计、模拟和部署功能强大的现实世界无线电系统。它是一个高度模块化、面向“流程图”的框架,带有一个全面的处理块库,可以轻松组合以制作复杂的信号处理应用程序。GNU Radio 已用于大量现实世界的无线电应用,包括音频处理、移动通信、跟踪卫星、雷达系统、GSM 网络、Digital Radio Mondiale 等等 - 全部以计算机软件实现。它本身并不是与任何特定硬件对话的解决方案。它也没有为特定无线电通信标准(例如 802.11、ZigBee、LTE 等)提供现成的应用程序,但它可以(并且已经)用于开发基本上任何带宽受限通信标准的实现。
以前,在开发无线电通信设备时,工程师必须开发用于检测特定信号类别的专用电路,设计能够解码或编码特定传输的专用集成电路,并使用昂贵的设备对其进行调试。
软件定义无线电 (SDR) 采用模拟信号处理,并在物理和经济可行的范围内,使用软件算法在计算机上处理无线电信号。
基础使用:
官方教学WIKI
https://wiki.gnuradio.org/index.php/Tutorials
界面预览:
将右边的block拖放至左边即可
常用block:
source(信号源模块):接收输入信号或数据
File Source:从文件中读取数据。
- 用途:读取存储在磁盘上的数据。
- 示例:读取音频文件、信号文件等。
Signal Source:生成特定的信号(如正弦波、方波等)。
- 用途:用于信号的生成,比如生成正弦波信号。
- 示例:
Signal Source
生成一个频率为 1 kHz 的正弦波。
HackRF Source:从 HackRF SDR 硬件接收信号。
- 用途:从硬件接收无线电信号。
- 示例:用于接收 FM 信号或其他无线电频段信号。
USRP Source:通过 USRP(Universal Software Radio Peripheral)硬件接收信号。
用途:从 USRP 硬件接收信号。
示例:用于接收无线电通信信号。
sink(接收端模块):发送输出信号或数据
File Sink:将数据写入文件。
- 用途:将接收到的数据保存到磁盘文件中。
- 示例:保存接收到的信号数据到
.dat
文件。
Audio Sink:将数据输出到计算机音频设备。
- 用途:将解调后的信号(如音频)传输到计算机扬声器。
- 示例:用于 FM 收音机将解调后的音频信号播放出来。
Null Sink:丢弃数据,不进行处理。
- 用途:用于测试时忽略输出数据。
Signal Processing(信号处理模块):对信号进行处理、分析、转换等
Add:两个信号相加。
- 用途:用于信号合成,例如多载波合成或调制。
Multiply:两个信号相乘。
- 用途:用于调制解调过程中的乘法操作。
Low Pass Filter:低通滤波器。
- 用途:滤除高频噪声,仅保留低频信号。常用于接收无线电信号时的信号处理。
High Pass Filter:高通滤波器。
- 用途:去除低频噪声或直流分量,仅保留高频信号。
Band Pass Filter:带通滤波器。
- 用途:仅保留特定频段内的信号,常用于接收特定频率范围的无线电信号。
Delay:对信号进行延迟。
- 用途:模拟延迟或处理时延。
Complex to Mag:将复数信号转换为幅度(忽略相位)。
- 用途:将复数信号(如 IQ 信号)转换为幅度信号。
Complex to Real:将复数信号转换为实部。
- 用途:仅获取复数信号的实部。
Modulation / Demodulation(调制解调模块):进行信号的调制或解调
WBFM Receive:宽带 FM 解调器。
- 用途:用于接收和解调宽带 FM 信号。
- 示例:用于将 FM 信号转换为音频信号。
AM Demod:调幅(AM)解调器。
- 用途:用于接收并解调调幅信号。
PSK Mod:相位移键控(PSK)调制。
- 用途:将数据调制为 PSK 信号。
QAM Mod:正交振幅调制(QAM)。
- 用途:将数据调制为 QAM 信号,广泛用于无线通信。
Frequency Mod:频率调制。
- 用途:用于频率调制(FM)的信号生成。
Debugging and Analysis(调试与分析模块):
Scope Sink:波形显示。
- 用途:用于显示信号的时域波形,类似示波器。
QT GUI Sink:GUI 波形显示。
- 用途:在图形界面中显示信号波形或其他图形。
Message Debug:用于打印调试消息。
- 用途:在程序中插入调试信息,帮助分析问题。
Control and Data Flow(控制与数据流模块):
Throttle:控制数据流速率。
- 用途:限制数据流速率,防止占用过多计算资源。
Variable:定义变量。
- 用途:在流程中存储和管理变量的值。
Connect:用于连接不同的 Blocks。
- 用途:创建 Blocks 之间的数据流路径。
其他 Blocks:
- Channel Model:模拟信道的影响(如噪声、衰减等)。
- Noise Source:生成噪声信号。
- Packet Encoder / Decoder:用于数据包编码和解码。
- UDP Source / Sink:用于通过 UDP 协议发送和接收数据。
当然也可以自定义块:python block
打开代码编辑:
即可更改代码实现block自定义
基础小结实验:GNU Radio + HackRF 实现FM收音机
GRC:
信号源:
Device选择hackrf=0 如果插入多个hackrf 可以选择不同的值
运行效果:
进阶:ZMQ
ZeroMQ,可嵌入的网络库,提供进程内、进程间、TCP和多播等各种传输中承载原子消息的socket
ZMQ可以将GNU radio中的实时数据流通过socket引到外部的python/c等应用程序中
块的类型:
SINK | SOURCE | 特征 |
---|---|---|
PUB | SUB | 广播,可一对多 |
PUSH | PULL | 点播,点对点对等网络 |
REQ | REP | 点对点链路,一个请求一个回复,类似客户端服务器 |
Data Blocks:
ZMQ data blocks 传输原始流数据;没有格式化。数据类型和采样率由馈送 ZMQSink 的流程图确定。因此,接收数据的流程图或程序必须知道这些参数,以便正确地解释数据。
Message Blocks
不像普通的 ZeroMQ 字符串,GNU Radio ZMQ Message Blocks 使用 PMT 对数据进行编码和解码。
ZMQ PUB发送,外部python ZMQ SUB recv DEMO:
GRC:
python:
import zmq
import numpy as np
import time
import matplotlib.pyplot as plt
# 创建一个 ZeroMQ 上下文,这是使用 ZeroMQ 的必要步骤
context = zmq.Context()
# 创建一个 SUB(订阅)套接字,用于接收消息
socket = context.socket(zmq.SUB)
# 连接到发布者(PUB)的套接字
# PUB 的地址是 "tcp://127.0.0.1:55555",注意这里使用的是 connect 而不是 bind
# 因为在 PUB-SUB 模式中,通常只有一个 PUB 会 bind(绑定)一个端口,而 SUB 使用 connect 来连接到 PUB
socket.connect("tcp://127.0.0.1:55555")
# 设置订阅选项,这里 `b''` 表示订阅所有的主题
# 如果没有设置订阅选项,SUB 是无法接收消息的
socket.setsockopt(zmq.SUBSCRIBE, b'')
# 进入一个无限循环,用于持续接收数据
while True:
# 使用 poll 方法检查套接字上是否有可用的数据,超时时间设置为 10 毫秒
if socket.poll(10) != 0: # 如果返回值不为 0,说明有消息可接收
# 接收消息
msg = socket.recv() # 从套接字中获取消息
print(len(msg)) # 打印消息的长度(字节数)
# 将消息数据转换为 numpy 数组
# 数据类型是 complex64,表示复数,`count=-1` 表示读取缓冲区中的所有数据
# 需要确保发送端的数据格式与此处的解析一致
data = np.frombuffer(msg, dtype=np.complex64, count=-1)
# 打印前 10 个数据(复数),用于调试
print(data[0:10])
# 如果需要可视化数据,可以取消以下注释代码块
# 绘制复数部分的实部和虚部
# plt.plot(np.real(data)) # 绘制实部
# plt.plot(np.imag(data)) # 绘制虚部
# plt.show() # 显示绘图
else:
# 如果没有消息,就休眠 100 毫秒,然后重新检查
time.sleep(0.1)
运行结果
进阶实验:GNU Radio + HackRF抓空中BLE通过ZMQ转发
参考项目:
https://github.com/oldprogram/sdr4iot-ble-rx
GRC
分析各个大模块作用:
- 通过 RTL-SDR Source 从 HackRF 设备捕获 BLE 信号。
- 通过 Simple Squelch 去除无效的噪声信号,确保只有有效信号被传递到下游。
- 使用 Frequency Xlating FIR Filter 将信号频率转换到基带,为解调做准备。
- 使用 GFSK Demod 解调 GFSK 信号,恢复出数字数据流。
- 通过 Unpacked to Packed 转换数据格式。
- 最后,数据通过 ZMQ PUB Sink 发布到外部
详细配置
RTL-SDR Sorce
RTL-SDR Sorce 为信号源模块
Device Arguments选择hackrf = 0
由于无需外部时钟与更精确的同步,信号源同步方式Sync选择PC Clock
采样率Sample Rate,即每秒钟采集的样本数。采样率越高,接收到的信号数据就越精细,可以更好地捕捉到高频信号。这个参数直接影响信号的质量与解析精度。对于BLE,通常需要较高的采样率(如 1 MHz 到 10 MHz),以确保捕获到足够的信号细节。此处采样率为10Mhz
Frequency (Hz),设置信号源的中心频率,表示接收的信号频率范围的中点。BLE信号通常工作在2.4 GHz频段。设置此频率后,RTL-SDR设备会开始接收该频率附近的信号。由于此处接收的为38信道,故设置2.426GHz
RF参数主要决定信号源的采样频率、中心频率等与射频相关的设置。此处设置100
IF设置中频滤波器的带宽,限制接收信号的频率范围,去除不必要的高频噪声或干扰。对于大多数应用,默认值即可。如果信号中有强干扰,可以调整此参数来过滤掉部分干扰频段。此处设置89
BB参数用于设置信号的数字处理部分,负责对接收到的信号进行采样、解调等后续处理。基带参数通常涉及到信号采样后如何对数据进行转换、解调等处理。此处设置为0
Head
Head 模块用于限制信号流中的样本数,它会根据设置的参数控制信号的流出数量。设置 num items = 300M 表示 Head 将从信号源接收并传递 3 亿个数据点(或样本)。
这一配置通常用于数据采集和调试阶段,在不需要持续无限制采集的情况下,限制采集的样本数。这可以帮助避免接收过多的数据,从而节省系统资源。
File Sink
File Sink 模块用于将接收到的数据流保存到文件中。它可以将信号流直接写入到磁盘文件。
Simple Squelch
Simple Squelch 模块用于在信号中检测噪声并抑制低于设定阈值的信号(过滤器)。Squelch模块通常在无线电接收器中用于静音处理,避免无用的背景噪声占用接收带宽。它工作原理类似于在接收信号时,如果信号的强度低于设定的阈值,就会屏蔽掉该信号,防止噪声或无效信号被处理。
dB = -70:设置为 -70 dB 可以有效过滤掉低于此强度的噪声或无效信号,而通常BLE信号强度在-70 dB以上时为有效信号。
Alpha = 100 m:设置为 100ms 的较大值,保证了对信号变化的平滑响应,避免信号强度快速波动时频繁切换,这样能够使得系统对环境的动态变化更为适应,同时也减少误判。
Frequency Xlating FIR Filter
作用:这个模块执行频率偏移和滤波,主要有两个目的:
频率移位:通过频率平移(Xlate),将信号频率转换到基带频率或适合解调的频段。对于BLE信号,通常工作在2.4 GHz频段,通过这个模块可以将捕获到的信号移到一个较低的频率范围(例如基带频率)以便于后续处理。
滤波:使用 FIR(有限冲击响应)滤波器对信号进行滤波,去除不需要的高频部分和噪声。BLE信号的带宽相对较窄,适当的滤波可以有效地减少干扰,确保接收到的是有效的信号。
如果选择低通滤波器,taps 会指定保留低于某一频率的信号,过滤掉高于该频率的部分。
如果选择带通滤波器,taps 会指定保留一个特定频率范围的信号,过滤掉低于和高于该范围的部分。
Taps (滤波器系数):定义了 FIR(有限冲击响应)滤波器的系数,也就是滤波器的权重。通过调节 taps 参数,可以自定义滤波器的频率响应,优化接收到的信号并增强需要的信号分量。==》由于BLE信号的频率较高(2.4 GHz),使用 Frequency Xlating FIR Filter 将信号频率转换到较低的范围是必要的。它也帮助去除来自其他频段的干扰,并使信号变得适合后续的解调处理。==》此处设置为低通滤波器 (lowpass_filter)
center frequency 参数用于定义滤波器的中心频率,也就是滤波器工作频带的中点。在 Frequency Xlating FIR Filter 中,center frequency 通过将接收到的信号的频谱平移到目标频段来帮助将信号移到适合解调的频段。
假设捕获到的信号频率为 2.4 GHz,center frequency 如果设置为 2.4 GHz,那么经过滤波后信号将被移到基带(或其他适当的频段)。
对于BLE信号,设置 center frequency 为目标频段中心(例如2.426 GHz),将捕获到的信号移到适合后续处理的频率范围,以便进行解调、解码等操作。
设置 center frequency 为 0 表示不进行频率平移处理,信号将直接经过滤波器的处理。这对于已经在适当频率范围内的信号是合适的,简化了信号处理流程,并且可以避免重复频率转换的操作。
GFSK Demod
用于高斯频移键控(GFSK) 解调,因为BLE设备通常使用 GFSK 作为调制方式,该模块能够提取有效信号中的数据。它将接收到的频率变化转换为数字数据(例如0和1),这是解码BLE数据包的关键步骤。此模块是从物理层信号到数据流转换的重要环节。
Samples per Symbol(样本数)设置为10,Sensitivity = 157.08 m较高的灵敏度设置能够提高解调器对弱信号的响应能力,这对于BLE信号尤其重要,因为BLE信号的功率(低功耗)较低且环境噪声较多。
Unpacked to Packed
GFSK Demod模块输出的信号通常是未打包(Unpacked)的格式,其中每个数据位可能由多个样本表示。Unpacked to Packed 模块的作用是将这些未打包的比特流转换为打包格式(Packed)
转换成打包格式也就是将解调后的位流数据转换为字节流数据,可以更方便地与后续模块进行交互,方便后续的传输和分析。
ZMQ PUB Sink
ZMQ PUB Sink 模块用于将数据发送到外部系统或应用程序。它通过 ZeroMQ 协议将打包的BLE数据(已解调并处理过)发布到网络中,供其他系统或模块订阅和使用。
数据传输:ZeroMQ 是一个高效的消息队列协议,支持高吞吐量、低延迟的数据传输。使用 ZMQ PUB Sink 可以将BLE数据流实时地传输给其他处理系统
灵活性与扩展性:ZeroMQ 提供了发布/订阅机制,可以在不改变系统架构的情况下,方便地将数据分发到多个订阅者。
高效的通信:ZMQ 提供了非常快速且轻量级的通信,可以保证数据的实时性,尤其适用于需要高吞吐量和低延迟的无线信号捕获与分析任务。