You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:30:52