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
相关产品推荐
相关产品推荐

