X310 USRP(Python)闭环IQ收发配置及tx_waveform.py使用咨询
USRP X310闭环传输IQ数据实操指南
一、是否用tx_waveform.py传输?
是的,tx_waveform.py是UHD官方提供的标准发射脚本,适合快速实现IQ数据的有线/OTA传输,完全匹配你的闭环测试需求。
二、tx_waveform.py的输出是什么?
- 运行时会打印发射核心参数日志:采样率、中心频率、增益、发射样本数等
- 核心输出是通过USRP TX通道输出的实时光IQ流,对应你加载的
.dat文件里的复采样数据 - 若开启
--output-file参数,还能生成发射数据的本地备份文件(默认不开启)
三、传输与接收的关键配置
发射端(tx_waveform.py)配置项
- 采样率/中心频率:必须和接收端完全一致(比如你代码里的50e6、1e9)
- TX增益:根据闭环线缆衰减调整,建议从20dB开始测试,避免信号过饱和
- IQ文件路径:指定你生成的
test.dat文件位置 - 通道选择:指定TX通道(比如0,和接收端对应)
- 时钟源:因为接了OctoClock,必须加
--ref-clock external参数锁定外部时钟
接收端配置(基于你提供的代码)
- 采样率、中心频率、增益必须和发射端完全匹配
- 新增时钟源配置:代码里加
usrp.set_clock_source("external"),同步OctoClock - 流格式:保持
fc32(主机端)和sc16(USRP端)的格式匹配 - 缓冲区大小:建议用
streamer.get_max_num_samps()自动获取最大值,避免手动限制
四、完整闭环操作流程
步骤1:生成IQ测试数据
运行你提供的脚本生成test.dat:
num_symbols = 10000 r = 0.1*np.random.randn(num_symbols) + 0.1j*np.random.randn(num_symbols) print(r.size) r = r.astype(np.complex64) r.tofile('test.dat')
步骤2:运行tx_waveform.py发射数据
在终端执行(替换参数为你的实际值):
python tx_waveform.py --tx-rate 50e6 --tx-freq 1e9 --tx-gain 20 --tx-channel 0 --ref-clock external --file test.dat --repeat
--repeat:让数据循环发射,方便接收测试- 找不到脚本的话,通常在UHD安装目录的
examples/python文件夹里
步骤3:修改并运行接收代码
修正你提供的接收代码,补全时钟配置并优化缓冲区逻辑:
import uhd import numpy as np usrp = uhd.usrp.MultiUSRP() num_samps = 10000 center_freq = 1e9 sample_rate = 50e6 gain = 20 # 绑定外部时钟源(OctoClock) usrp.set_clock_source("external") usrp.set_rx_rate(sample_rate, 0) usrp.set_rx_freq(uhd.libpyuhd.types.tune_request(center_freq), 0) usrp.set_rx_gain(gain, 0) # 配置流参数 st_args = uhd.usrp.StreamArgs("fc32", "sc16") st_args.channels = [0] metadata = uhd.types.RXMetadata() streamer = usrp.get_rx_stream(st_args) # 自动获取最大缓冲区大小 max_samps_per_buf = streamer.get_max_num_samps() # 启动接收流 stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.start_cont) stream_cmd.stream_now = True streamer.issue_stream_cmd(stream_cmd) # 接收指定数量样本 samples = np.zeros(num_samps, dtype=np.complex64) received = 0 while received < num_samps: samps_to_recv = min(max_samps_per_buf, num_samps - received) recv_buffer = np.zeros((1, samps_to_recv), dtype=np.complex64) streamer.recv(recv_buffer, metadata) # 检查接收状态 if metadata.error_code != uhd.types.RXMetadataErrorCode.none: print(f"接收错误: {metadata.strerror()}") samples[received:received+samps_to_recv] = recv_buffer[0] received += samps_to_recv # 停止接收 stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.stop_cont) streamer.issue_stream_cmd(stream_cmd) print("接收完成,样本数:", len(samples)) print("前10个样本:", samples[:10])
步骤4:验证传输结果
对比发射数据和接收数据的相关性,确认传输正常:
tx_data = np.fromfile('test.dat', np.complex64) corr = np.corrcoef(tx_data[:num_samps], samples)[0,1] print(f"收发数据相关性:{corr:.4f}")
相关性接近1说明传输无异常
五、常见问题排查
- 接收不到数据:检查RF线缆连接、OctoClock供电状态(用
uhd_usrp_probe确认时钟源识别)、收发参数是否完全一致 - 数据失真:调整TX/RX增益,避免信号过饱和;确保采样率无小数误差
- 时钟不同步:确认OctoClock已连接到X310的REF IN接口
内容的提问来源于stack exchange,提问作者Salad96
相关产品推荐
相关产品推荐

