SDR(软件无线电):基于AD9361的宽带收发系统在GNU Radio中的流图设计与信号捕获
扫描二维码
随时随地手机看文章
在通信侦察、电子对抗等宽带应用中,AD9361(集成式RF捷变收发器)凭借其70 MHz至6 GHz的频率覆盖与56 MHz的瞬时带宽,成为SDR系统的理想前端。本文将探讨如何利用GNU Radio快速构建AD9361的收发流图,并实现宽带信号的实时捕获与分析。
一、硬件架构:AD9361与Host的桥接
典型的AD9361 SDR平台(如ADALM-PLUTO或Zynq+AD9361定制板)通常采用“前端数字化+主机处理”的架构:
1. AD9361:负责射频下变频(RF→Baseband)、ADC/DAC及AGC。
2. FPGA:实现JESD204B接口时序、DDC/DUC(数字上下变频)及DMA数据传输。
3. Host PC:运行GNU Radio,通过libiio驱动与硬件交互,进行信号处理和可视化。
二、GNU Radio流图设计:从射频到基带
在GNU Radio Companion (GRC) 中,我们通过模块化连接构建信号处理链。
2.1 接收(Rx)流图核心模块
一个标准的宽带捕获流图包含以下关键模块:
1. IIO Device Source:这是与AD9361交互的核心模块。
◦ URI:指向硬件(如ip:192.168.2.1或usb:)。
◦ Device:选择ad9361-phy。
◦ Buffer Size:设置为65536以获得更大的捕获窗口。
◦ Sampling Rate:设置为AD9361的输出速率(如30.72 MSPS)。
◦ LO Frequency:设置射频中心频率(如2.4 GHz)。
◦ Gain Mode:通常选择manual,手动设置Rx增益。
2. Frequency Xlating FIR Filter(频移滤波器):
◦ 用于将宽带信号搬移到基带。设置Decimation为2或4以降低CPU负载,Center Frequency设为信号在接收带宽内的偏移量。
3. Rational Resampler(有理重采样):
◦ 将AD9361的高采样率转换为GNU Radio易于处理的速率(如2 MSPS),便于后续分析。
4. QT GUI Sink(显示模块):
◦ 使用Frequency Sink查看频谱,Time Sink查看时域波形,Constellation Sink查看星座图。
2.2 发射(Tx)流图核心模块
1. Signal Source:生成要发射的信号(如CW、QPSK、LTE信号)。
2. Rational Resampler:将低采样率信号插值到AD9361所需的Tx采样率。
3. IIO Device Sink:与Source模块对应,负责将处理后的IQ数据通过DMA发送给AD9361进行上变频和发射。
三、宽带信号捕获实战:Python Snippet与文件存储
GNU Radio擅长实时处理,但对于宽带信号的“记录与回放”(Record & Playback),我们通常需要借助Python Snippet或File Sink。
3.1 使用Python Snippet进行实时捕获
在GNU Radio流图中插入Python Snippet模块,编写回调函数处理IQ数据。
# GNU Radio Python Snippet: capture_callback
# 该函数在每次接收到指定长度的数据块时被调用
import numpy as np
import datetime
import os
# 全局变量,用于控制捕获逻辑
capture_enabled = False
capture_count = 0
MAX_CAPTURES = 10
def capture_callback(data):
"""
data: 输入的numpy数组,形状为 (num_channels, num_samples)
对于AD9361,通常是 (2, N),即I/Q两路
"""
global capture_enabled, capture_count
if not capture_enabled:
# 可以通过其他逻辑(如检测到特定信号)触发
# 这里简化为手动触发或定时触发
return
if capture_count >= MAX_CAPTURES:
print("Capture limit reached.")
capture_enabled = False
return
# 提取IQ数据 (假设第一路是I,第二路是Q)
iq_data = data[0] + 1j * data[1]
# 生成文件名,包含时间戳
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"/data/captures/adc_capture_{timestamp}.bin"
# 以二进制形式写入文件 (int16或float32格式)
# AD9361通常是12位数据,在GNU Radio中常转为float32
iq_data.astype(np.complex64).tofile(filename)
print(f"Captured {len(iq_data)} samples to {filename}")
capture_count += 1
注意:此代码块需嵌入GRC的Python Snippet模块,并连接到IIO Device Source的输出端口。
3.2 使用File Sink进行原始数据存储
对于长时间的原始IQ数据记录,直接使用File Sink模块效率更高。
# 在GRC中添加 File Sink 模块
# File: /data/raw_iq_capture.dat
# Type: complex64 (或 short for int16 if supported by your SDR source)
# Num Items: 0 (unlimited)
这种方式会持续将IQ数据流写入硬盘,适合后续使用Matlab、Python或GNU Radio离线处理。
四、信号捕获后的离线分析示例
捕获到的.bin文件可以使用Python进行分析:
import numpy as np
import matplotlib.pyplot as plt
# 读取捕获的数据
data = np.fromfile('/data/captures/adc_capture_xxxx.bin', dtype=np.complex64)
# 计算频谱
plt.specgram(data, NFFT=1024, Fs=30.72e6/4) # Fs为实际采样率
plt.title('Spectrum of Captured Signal')
plt.xlabel('Time')
plt.ylabel('Frequency (Hz)')
plt.show()
五、结语
基于AD9361和GNU Radio的SDR系统,极大地降低了宽带射频开发的门槛。通过IIO驱动实现与硬件的无缝对接,利用GRC流图快速搭建收发链路,再结合Python Snippet或File Sink实现精准的信号捕获,开发者可以专注于算法验证与协议分析,而无需陷入底层驱动开发的泥潭。





