如何使用 UHD 从 USRP 流式传输固定数量的样本

Posted

技术标签:

【中文标题】如何使用 UHD 从 USRP 流式传输固定数量的样本【英文标题】:How to stream a fixed number of samples from a USRP using UHD 【发布时间】:2020-08-17 22:53:56 【问题描述】:

我正在尝试使用 UHD 库从 USRP X310 设备流式传输固定/准确数量的样本。我在UHD GitHub page 上引用了一些示例代码。我正在使用建议的while循环将数据一次一个数据包流式传输到缓冲区中。我的问题是最后一个部分数据包(参见下面的示例)从未被接收或放入我的缓冲区中,我得到uhd::rx_metadata_t::ERROR_CODE_TIMEOUT 错误响应。

// Instantiate RX Streamer
uhd::stream_args_t streamArgs("fc32");
// Set the number of samples per packet
streamArgs.args["spp"] = "200";
rxStream = usrpDevice->get_rx_stream(streamArgs);
    
// Configure RX Streamer for fixed number of samples
uhd::stream_cmd_t streamCmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
streamCmd.num_samps = 1100;
streamCmd.stream_now = true;
rxStream->issue_stream_cmd(streamCmd);

// Initialize RX metadata structure
uhd::rx_metadata_t md;

// Create buffer to stream samples to
std::vector<std::complex<float>> buff(rxStream->get_max_num_samps()); // buff size = 200

size_t numAccSamples = 0;

while (numAccSamples < 1100)

    size_t numRXSamples = rxStream->recv(&buff.front(), buff.size(), md);
    
    // Handle streaming error codes
    switch (md.error_code)
    
        // No errors
        case uhd::rx_metadata_t::ERROR_CODE_NONE:
            break;
            
        case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: // I get this error on the expected last iteration of the while loop
            if (numAccSamples == 0)
            
                continue;
            
            throw std::runtime_error("ERROR_CODE_TIMEOUT: Got timeout before all samples received");
            
            default:
                throw std::runtime_error("Got error code " + md.error_code);
        
        
        // process data here

        numAccSamples += numRXSamples;
    

例如,如果我想流式传输 1100 个样本并且我的数据包大小设置为 200,我的 while 循环将成功运行 5 次并填充我的缓冲区。但是,当我第六次进入我的 while 循环时(我有 1000/1100 个样本),对 recv() 的调用会出现超时错误,并且样本不会传递到我的缓冲区。此时,我还没有流式传输所有 1100 个样本。

我如何才能获得确切的样本数量?

这里是recv() call 的文档链接供参考。

【问题讨论】:

【参考方案1】:

经过多次尝试和错误,我发现出现此问题是因为尚未在 USRP 上设置采样率参数。因此,在尝试流式传输样本之前,请务必设置采样率!

usrpDevice->set_rx_rate(50e6);

// stream samples

【讨论】:

以上是关于如何使用 UHD 从 USRP 流式传输固定数量的样本的主要内容,如果未能解决你的问题,请参考以下文章

从 USRP 接收数据

[OpenAirInterface实战-19] :OAI 软件无线电USRP UHD硬件驱动程序的使用与网络架构

GNU Radio: Multiple USRP configurations 配置多个USRP设备

uhd镜像重新安装

USRP知识

下载uhd_images_downloader出现报错