如何使用 UHD 从 USRP 流式传输固定数量的样本
How to stream a fixed number of samples from a USRP using UHD
我正在尝试使用 UHD 库从 USRP X310 设备流式传输 fixed/exact 数量的样本。我在 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 个样本。
我怎样才能得到准确数量的样本?
这里有一份link给recv() call的文档供参考。
经过反复试验,我发现出现这个问题是因为USRP没有设置采样率参数。因此,在尝试流式传输样本之前,请务必设置采样率!
usrpDevice->set_rx_rate(50e6);
// stream samples
我正在尝试使用 UHD 库从 USRP X310 设备流式传输 fixed/exact 数量的样本。我在 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 个样本。
我怎样才能得到准确数量的样本?
这里有一份link给recv() call的文档供参考。
经过反复试验,我发现出现这个问题是因为USRP没有设置采样率参数。因此,在尝试流式传输样本之前,请务必设置采样率!
usrpDevice->set_rx_rate(50e6);
// stream samples