Just to help in understanding what’s wrong with my code I attach here the two implementations, one with the multi usrp and the other with RFNoC. Reading the documentation I understand that the MultiUSRP stands on top of the RFNoC, so I think that it is only a problem of my implementation.
They should do the same thing, however in RFNoC implementation the receiver on the other side loses lock frequently. Could someone help me understanding what’s wrong?
#include <iostream> #include <uhd/types/tune_request.hpp> #include <uhd/usrp/multi_usrp.hpp> #include <uhd/utils/safe_main.hpp> #include <uhd/utils/thread.hpp> #include <uhd/rfnoc/block_id.hpp> #include <uhd/rfnoc/duc_block_control.hpp> #include <uhd/rfnoc/mb_controller.hpp> #include <uhd/rfnoc/radio_control.hpp> #include <uhd/rfnoc/replay_block_control.hpp> #include <uhd/rfnoc_graph.hpp> #include <fstream> #define BUFFERSIZE 8192 using namespace std; int UHD_SAFE_MAIN(int argc, char* argv[]) { const double rate = 6.25e6; // Sample rate const double freq = 868.5e6; // Center frequency const double gain = 10; // TX gain const string device_addr = "type=x300,addr=192.168.40.2"; // Default (first device) const string filename = "rawiq.sc16"; uhd::rfnoc::rfnoc_graph::sptr graph; uhd::rfnoc::block_id_t radio_control_id; uhd::rfnoc::radio_control::sptr radio_control ; uhd::rfnoc::block_id_t duc_control_id; uhd::rfnoc::duc_block_control::sptr duc_control ; graph = uhd::rfnoc::rfnoc_graph::make(device_addr.c_str()); radio_control_id = uhd::rfnoc::block_id_t(0, "Radio", 1) ; radio_control = graph->get_block<uhd::rfnoc::radio_control>(radio_control_id) ; radio_control->set_tx_gain(gain,0); radio_control->set_tx_frequency(freq,0); if( !radio_control ) { cout << "ERROR: Failed to find Radio Block Controller!" << endl ; } cout << "Using radio " << radio_control_id << endl ; // DUC Block Controller duc_control_id = uhd::rfnoc::block_id_t(0, "DUC", 1) ; duc_control = graph->get_block<uhd::rfnoc::duc_block_control>(duc_control_id) ; if( !duc_control ) { cout << "ERROR: Failed to find DUC Block Controller!" << endl ; } cout << "Using duc " << duc_control_id << endl ; duc_control->set_output_rate(200e6,0); duc_control->set_freq(0,0); duc_control->set_input_rate(rate,0); uhd::stream_args_t stream_args("sc16", "sc16"); auto tx_stream = graph->create_tx_streamer(1, stream_args); graph->connect(tx_stream,0,duc_control->get_unique_id(),0); graph->commit(); std::this_thread::sleep_for(std::chrono::seconds(1)); int k = 0; ifstream *infile; infile = new ifstream(filename, std::ios::binary); uhd::tx_metadata_t md; md.start_of_burst = true; // Start of burst md.end_of_burst = false; // We will stop this later md.has_time_spec = false; std::vector<std::complex<short>> buff(BUFFERSIZE); cout << "Starting transmission" << endl; while (!infile->eof()) { infile->read(reinterpret_cast<char*>(&buff.front()), BUFFERSIZE * sizeof(complex<short>)); size_t samples_read = infile->gcount() / sizeof(complex<short>); if (samples_read == 0) { cout<<"No samples read\r\n"; break; } tx_stream->send(&buff.front(), samples_read, md); md.start_of_burst = false; } md.end_of_burst = true; tx_stream->send("", 0, md); infile->close(); cout << "Transmission complete." << endl; return 0; }
#include <iostream> #include <uhd/types/tune_request.hpp> #include <uhd/usrp/multi_usrp.hpp> #include <uhd/utils/safe_main.hpp> #include <uhd/utils/thread.hpp> #include <fstream> #define BUFFERSIZE 8192 using namespace std; int UHD_SAFE_MAIN(int argc, char* argv[]) { const double rate = 6.25e6; // Sample rate const double freq = 868.5e6; // Center frequency const double gain = 10; // TX gain const string device_addr = "type=x300,addr=192.168.40.2"; const string filename = "rawiq.sc16"; uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(device_addr); usrp->set_tx_rate(rate,1); usrp->set_tx_freq(freq,1); usrp->set_tx_gain(gain,1); usrp->set_tx_antenna("TX/RX",1); uhd::stream_args_t stream_args("sc16", "sc16"); stream_args.channels = {1}; auto tx_stream = usrp->get_tx_stream(stream_args); std::this_thread::sleep_for(std::chrono::seconds(1)); int k = 0; ifstream *infile; infile = new ifstream(filename, std::ios::binary); uhd::tx_metadata_t md; md.start_of_burst = true; // Start of burst md.end_of_burst = false; // We will stop this later md.has_time_spec = false; std::vector<std::complex<short>> buff(BUFFERSIZE); cout << "Starting transmission" << endl; while (!infile->eof()) { infile->read(reinterpret_cast<char*>(&buff.front()), BUFFERSIZE * sizeof(complex<short>)); size_t samples_read = infile->gcount() / sizeof(complex<short>); if (samples_read == 0) { cout<<"No samples read\r\n"; break; } tx_stream->send(&buff.front(), samples_read, md); md.start_of_burst = false; } md.end_of_burst = true; tx_stream->send("", 0, md); infile->close(); cout << "Transmission complete." << endl; return 0; }
_______________________________________________ USRP-users mailing list -- usrp-users@lists.ettus.com To unsubscribe send an email to usrp-users-le...@lists.ettus.com