Как передать в потоковом режиме фиксированное количество выборок из USRP с использованием UHD

#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