From 3714d8e3477c123272579b572f1c0189eaf176fc Mon Sep 17 00:00:00 2001 From: 30hours Date: Sun, 14 Jan 2024 04:36:53 +0000 Subject: [PATCH] USRP working at 2 MHz --- docker-compose.yml | 2 +- src/capture/Capture.cpp | 4 +-- src/capture/usrp/Usrp.cpp | 76 +++++++++++++++++++++++---------------- src/capture/usrp/Usrp.h | 5 ++- 4 files changed, 53 insertions(+), 34 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 186f792..6ca77d7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: network_mode: host privileged: true command: > - sh -c "/blah2/bin/blah2 -c config/config.yml" + sh -c "/blah2/bin/blah2 -c config/radar4-usrp.yml" container_name: blah2 blah2_frontend: diff --git a/src/capture/Capture.cpp b/src/capture/Capture.cpp index 39fb806..edd893e 100644 --- a/src/capture/Capture.cpp +++ b/src/capture/Capture.cpp @@ -27,7 +27,7 @@ void Capture::process(IqData *buffer1, IqData *buffer2) // RspDuo device if (type == VALID_TYPE[0]) { - RspDuo *device = new RspDuo(this->fc, this->path); + //RspDuo *device = new RspDuo(this->fc, this->path); } // Usrp device @@ -35,7 +35,7 @@ void Capture::process(IqData *buffer1, IqData *buffer2) { //Usrp *device = new Usrp(this->fc, this->path); } - Usrp *device = new Usrp(this->fc, this->path); + Usrp *device = new Usrp(this->fc, this->fs, this->path); // capture status thread std::thread t1([&]{ diff --git a/src/capture/usrp/Usrp.cpp b/src/capture/usrp/Usrp.cpp index 2fb6cc9..f45ebb2 100644 --- a/src/capture/usrp/Usrp.cpp +++ b/src/capture/usrp/Usrp.cpp @@ -14,9 +14,10 @@ #include // constructor -Usrp::Usrp(uint32_t _fc, std::string _path) +Usrp::Usrp(uint32_t _fc, uint32_t _fs, std::string _path) { fc = _fc; + fs = _fs; path = _path; capture = false; } @@ -41,60 +42,75 @@ void Usrp::process(IqData *buffer1, IqData *buffer2) uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make("localhost"); - // Set the sample rate - double sampleRate = 2e6; // Replace with your desired sample rate - usrp->set_rx_rate(sampleRate); + usrp->set_rx_subdev_spec(uhd::usrp::subdev_spec_t("A:A A:B"), 0); + //usrp->set_rx_subdev_spec(uhd::usrp::subdev_spec_t("A:B"), 1); - // Set the center frequency + usrp->set_rx_antenna ("RX2", 0); + usrp->set_rx_antenna ("RX2", 1); + + std::cout << "testy " << std::endl; + std::cout << usrp->get_rx_subdev_name(0) << std::endl; + std::cout << usrp->get_rx_antenna(0) << std::endl; + std::cout << usrp->get_rx_antenna(1) << std::endl; + + // set sample rate across all channels + usrp->set_rx_rate((double(fs))); + + // set the center frequency double centerFrequency = (double)fc; - usrp->set_rx_freq(centerFrequency); + usrp->set_rx_freq(centerFrequency, 0); + usrp->set_rx_freq(centerFrequency, 1); - // Set the gain + // set the gain double gain = 20.0; // Replace with your desired gain - usrp->set_rx_gain(gain); + usrp->set_rx_gain(gain, 0); + usrp->set_rx_gain(gain, 1); - // Set the number of channels - size_t numChannels = 1; // Assuming one channel for simplicity - usrp->set_rx_antenna("RX2", 0); // Set antenna for channel 0 - - // Set the receive buffer size - size_t bufferSize = 1024 * numChannels; - std::vector> buffer(bufferSize); - - // Create a receive streamer + // create a receive streamer uhd::stream_args_t streamArgs("fc32", "sc16"); + streamArgs.channels = {0, 1}; uhd::rx_streamer::sptr rxStreamer = usrp->get_rx_stream(streamArgs); - // Setup streaming + // allocate buffers to receive with samples (one buffer per channel) + const size_t samps_per_buff = 1024; + std::vector> usrpBuffer1(samps_per_buff); + std::vector> usrpBuffer2(samps_per_buff); + + // create a vector of pointers to point to each of the channel buffers + std::vector*> buff_ptrs; + buff_ptrs.push_back(&usrpBuffer1.front()); + buff_ptrs.push_back(&usrpBuffer2.front()); + + // setup stream uhd::rx_metadata_t metadata; - rxStreamer->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); + uhd::stream_cmd_t streamCmd = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; + //streamCmd.stream_now = rxStreamer->get_num_channels() == 1; + streamCmd.stream_now = false; + streamCmd.time_spec = usrp->get_time_now() + uhd::time_spec_t(0.05); + rxStreamer->issue_stream_cmd(streamCmd); while(true) { // Receive samples - size_t numReceived = rxStreamer->recv(&buffer[0], buffer.size(), metadata); - - // Stop streaming - // rxStreamer->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + size_t numReceived1 = rxStreamer->recv(buff_ptrs, samps_per_buff, metadata); // Check for errors if (metadata.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) { std::cerr << "Error during reception: " << metadata.strerror() << std::endl; - return; + //return; } - // Copy received samples to the output buffer - //iqBuffer.resize(numReceived); - //std::copy(buffer.begin(), buffer.begin() + numReceived, iqBuffer.begin()); buffer1->lock(); buffer2->lock(); - for (size_t i = 0; i < buffer.size(); i++) + for (size_t i = 0; i < numReceived1; i++) { - buffer1->push_back({(double)buffer[i].real(), (double)buffer[i].imag()}); - buffer2->push_back({(double)buffer[i].real(), (double)buffer[i].imag()}); + buffer1->push_back({(double)buff_ptrs[0][i].real(), (double)buff_ptrs[0][i].imag()}); + buffer2->push_back({(double)buff_ptrs[1][i].real(), (double)buff_ptrs[1][i].imag()}); } buffer1->unlock(); buffer2->unlock(); + + sleep(0.1); } } diff --git a/src/capture/usrp/Usrp.h b/src/capture/usrp/Usrp.h index 1fdfcb0..3f376d2 100644 --- a/src/capture/usrp/Usrp.h +++ b/src/capture/usrp/Usrp.h @@ -23,6 +23,9 @@ class Usrp private: /// @brief Center frequency (Hz) uint32_t fc; + + /// @brief Sampling rate (Hz) + uint32_t fs; /// @brief File path. std::string path; @@ -34,7 +37,7 @@ public: /// @param fc Center frequency (Hz). /// @param path Path to save IQ data. /// @return The object. - Usrp(uint32_t fc, std::string path); + Usrp(uint32_t fc, uint32_t fs, std::string path); /// @brief Get file name from path. /// @return String of file name based on current time.