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 -- [email protected]
To unsubscribe send an email to [email protected]