#c #usrp #uhd
#c #usrp #uhd
Вопрос:
Я пытаюсь передать в потоковом режиме фиксированное / точное количество выборок с устройства USRP X310, используя библиотеку UHD. Я ссылался на некоторый пример кода на странице UHD GitHub. Я использую цикл 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(amp;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() для справки.
Ответ №1:
После долгих проб и ошибок я выяснил, что эта проблема возникает из-за того, что параметр частоты дискретизации не был установлен в USRP. Поэтому, прежде чем пытаться передавать в потоковом режиме сэмплы, обязательно установите частоту дискретизации!
usrpDevice->set_rx_rate(50e6);
// stream samples