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

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

我正在尝试使用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文档的链接,以供参考。

解决方法

经过反复试验,我发现出现此问题是因为尚未在USRP上设置采样率参数。因此,在尝试流式采样之前,请务必设置采样率!

usrpDevice->set_rx_rate(50e6);

// stream samples

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?