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

USRP X310收发流异常:接收器反复接收相同信号

USRP X310收发流重复接收相同数据问题

来自韩国的问候!我正在使用USRP X310进行收发流开发,已查阅ettus.com官方手册并开展相关工作。

当前核心问题:运行Rx和Tx流对象时,接收器反复接收到完全相同的数据。我准备了5段不同的Tx数据(总计10000个样本,分为5个2000样本的块),预期接收数据至少存在细微差异,但实际每次接收的2000样本缓冲区数据完全一致。

以下是我使用的代码:

import  numpy as np
import matplotlib.pyplot as plt
import uhd,threading, time
import dvbt2_detect,dvbt2_detectV2
from scipy.io import loadmat
import scipy.signal as sg
from fifoBuffer import FIFOBuffer

plt.close()
Fs = 50e6  # 20MHz sampling rate
Ts_dvbt2 = 7/64*1e-6        # DVB-T2 with sampling time = 7/64us (Table 65)
Fs_dvbt2 = 1/Ts_dvbt2


## Tx P1-Preamble Normalization
dvbt2_org = loadmat("./data/generatedP1.mat")['data'].flatten()
dvbt2_20MHz = sg.resample(dvbt2_org, int(len(dvbt2_org)*35/16))
real_data = np.real(dvbt2_20MHz)
imag_data = np.imag(dvbt2_20MHz)
max_value = np.max([np.abs(real_data).max(), np.abs(imag_data).max()])
real_data = (real_data -real_data.mean())/max_value
imag_data = (imag_data -imag_data.mean())/max_value

dvbt2_20MHz_norm = real_data+1j*imag_data

##Tx Data and Zero pad
num_signals = 10000
xs = np.zeros(num_signals, np.complex64)
real_part = np.random.uniform(-1, 1, 4480)
imaginary_part = np.random.uniform(-1, 1, 4480)
data_signal = real_part + 1j * imaginary_part

## xs formation
xs[:len(dvbt2_20MHz_norm)] = dvbt2_20MHz_norm
xs[len(dvbt2_20MHz_norm):len(dvbt2_20MHz_norm)+len(data_signal)] = data_signal

## xs DVBT2 Detection
dvbt2_9M143Hz_buffer = sg.resample(xs, int(len(xs)*16/35))
corr1 = dvbt2_detect.dvbt2_detect(dvbt2_9M143Hz_buffer)
print(corr1)
corr2 = dvbt2_detectV2.dvbt2_detectV2(xs)
print(corr2)


spp = 2000

debug = False
tx_flag=True

Ns=len(xs)
n1 = np.arange(Ns)
n2 = np.arange(2000)
ts1 = n1/Fs
ts2 = n2/Fs


def tx_func():
    global xs, tx_flag
    tx_cnt=0
    while tx_cnt<400:
        idx=tx_cnt%5
        num_tx_samps = tx_streamer.send(xs[idx*2000:(idx+1)*2000],tx_metadata)
        tx_cnt += 1
    tx_flag=False
    print('TxSent')

rf_freq = 2.62e9  # 2.62GHz carrier frequency
tx_channel = 0
txGain = 25  # dB
rx_channel = 0
rxGain = 10  # dB


# dev = uhd.libpyuhd.types.device_addr(addr=192.168.40.1)
myusrp = uhd.usrp.MultiUSRP()
num_samps = Ns

myusrp.set_tx_antenna("TX/RX")
myusrp.set_tx_rate(Fs)
myusrp.set_tx_bandwidth(Fs/2)
myusrp.set_tx_freq(uhd.libpyuhd.types.tune_request(rf_freq), tx_channel)
myusrp.set_tx_gain(txGain)

myusrp.set_rx_antenna("RX2")
myusrp.set_rx_rate(Fs)
myusrp.set_rx_bandwidth(Fs/2)
myusrp.set_rx_freq(uhd.libpyuhd.types.tune_request(rf_freq), rx_channel)
myusrp.set_rx_gain(rxGain)

# Tx Streamer
txstream_args = uhd.usrp.StreamArgs('fc32', 'sc16')
# txstream_args.args = f'spp={Ns}'  # samples per packet
txstream_args.args = f'spp={spp}'  # samples per packet
tx_streamer = myusrp.get_tx_stream(txstream_args)

# Set up the stream and receive bufferx
rxstream_args = uhd.usrp.StreamArgs('fc32', 'sc16')
# rxstream_args.args = f'spp={Ns}'  # samples per packet
rxstream_args.args = f'spp={spp}'  # samples per packet
rxstream_args.channels = [rx_channel]
rx_streamer = myusrp.get_rx_stream(rxstream_args)
recv_buffer = np.zeros((1, 2000), dtype=np.complex64)

# Start Stream
tx_metadata = uhd.types.TXMetadata()
rx_metadata = uhd.types.RXMetadata()
stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.start_cont)
stream_cmd.stream_now = True
rx_streamer.issue_stream_cmd(stream_cmd)
print("Finished Configuration")

rx_flag = True
usrp_configured = True


txT = threading.Thread(target=tx_func)
txT.start()
time.sleep(0.0001)
rx_cnt = 0
err_log=[]
while rx_cnt<100:
    nrsamp = rx_streamer.recv(recv_buffer, rx_metadata)
    err_log.append([rx_cnt,nrsamp,recv_buffer])
    rx_cnt += 1

stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.stop_cont)
rx_streamer.issue_stream_cmd(stream_cmd)
while tx_flag:
    pass


print(Ns)
plt.figure()
plt.subplot(411)
plt.plot(xs.real)
plt.subplot(412)
plt.plot(xs.imag)
plt.subplot(413)
plt.plot(err_log[99][2][0].real)
plt.subplot(414)
plt.plot(err_log[99][2][0].imag)

# plt.plot(err_log[99][2][0].imag)
plt.show()

plt.figure()
plt.subplot(411)
plt.plot(err_log[12][2][0].real)
plt.subplot(412)
plt.plot(err_log[53][2][0].real)
plt.subplot(413)
plt.plot(err_log[67][2][0].real)
plt.subplot(414)
plt.plot(err_log[87][2][0].real)
plt.show()
# rx_flag = False

print('done')

txT.join()

if not debug:
    del tx_streamer, rx_streamer
    del myusrp
print('finished')

预期与实际结果

我预期每次接收的数据均不相同,但实际结果:

  • 接收数据IQ图:前两个为Tx的IQ曲线,后两个为Rx的IQ曲线
  • 接收数据一致性验证:多次接收的Rx数据曲线完全重合,无任何差异

内容的提问来源于stack exchange,提问作者Hoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:34:55