diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2015-11-08 21:26:48 +0100 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2015-11-08 21:26:48 +0100 | 
| commit | 05886065ea52559de5800850f728432c826f33b6 (patch) | |
| tree | 1d5b8f4fdb2e12d52f1638be2ee7cba902e65650 | |
| parent | 22eb9a40a48c24c2794b07f96729ce49697ef298 (diff) | |
| download | odr-dpd-05886065ea52559de5800850f728432c826f33b6.tar.gz odr-dpd-05886065ea52559de5800850f728432c826f33b6.tar.bz2 odr-dpd-05886065ea52559de5800850f728432c826f33b6.zip | |
Move definition of TX timestamp and fix bug after RX reset
| -rw-r--r-- | AlignSample.cpp | 36 | ||||
| -rw-r--r-- | AlignSample.hpp | 18 | ||||
| -rw-r--r-- | OutputUHD.cpp | 9 | ||||
| -rw-r--r-- | OutputUHD.hpp | 2 | ||||
| -rw-r--r-- | main.cpp | 19 | 
5 files changed, 50 insertions, 34 deletions
| diff --git a/AlignSample.cpp b/AlignSample.cpp index dbb68c7..b6afc2a 100644 --- a/AlignSample.cpp +++ b/AlignSample.cpp @@ -72,10 +72,25 @@ void AlignSample::push_rx_samples(complexf* samps, size_t len, double first_samp      }      else if (m_first_rx_sample_time != 0) {          // We have previously received samples with valid timestamp +        double delta = m_rx_sample_time(m_rxsamples.size()) - first_sample_time; +        if (std::fabs(delta) > 1e-3) { +            fprintf(stderr, "RX sample time %f expected %f. Delta of %f(%zu)." +                    " Resetting RX\n", +                m_rx_sample_time(m_rxsamples.size()), +                first_sample_time, +                delta, +                (size_t)std::fabs(delta * (double)samplerate)); + +            m_first_rx_sample_time = 0; +            m_num_rx_samples_dropped = 0; +            m_rxsamples.clear(); +        } +          std::copy(samps, samps + len, std::back_inserter(m_rxsamples));      }      else if (first_sample_time == 0) {          MDEBUG("RX timestamp missing\n"); +        throw std::runtime_error("RX timestamp missing");      }  } @@ -141,8 +156,8 @@ CorrelationResult AlignSample::crosscorrelate(size_t len)          std::copy(m_txsamples.begin(), m_txsamples.begin() + len, tx_fft_in.begin());          // the other half of the buffers are set to 0 -        m_rxsamples.erase(m_rxsamples.begin(), m_rxsamples.begin() + len); -        m_txsamples.erase(m_txsamples.begin(), m_txsamples.begin() + len); +        m_drop_rx_samples(len); +        m_drop_tx_samples(len);          rx_ts = m_rx_sample_time();          tx_ts = m_tx_sample_time(); @@ -199,11 +214,8 @@ void AlignSample::consume(size_t samples)  {      std::lock_guard<std::mutex> lock(m_mutex);      if (align() and m_rxsamples.size() > samples and m_txsamples.size() > samples) { -        m_rxsamples.erase(m_rxsamples.begin(), m_rxsamples.begin() + samples); -        m_num_rx_samples_dropped += samples; - -        m_txsamples.erase(m_txsamples.begin(), m_txsamples.begin() + samples); -        m_num_tx_samples_dropped += samples; +        m_drop_rx_samples(samples); +        m_drop_tx_samples(samples);      }  } @@ -220,10 +232,7 @@ bool AlignSample::align()              return false;          } -        m_rxsamples.erase( -                m_rxsamples.begin(), m_rxsamples.begin() + rx_samples_to_skip); - -        m_num_rx_samples_dropped += rx_samples_to_skip; +        m_drop_rx_samples(rx_samples_to_skip);          return true;      }      else if (m_rx_sample_time() > m_tx_sample_time()) { @@ -234,10 +243,7 @@ bool AlignSample::align()              return false;          } -        m_txsamples.erase( -                m_txsamples.begin(), m_txsamples.begin() + tx_samples_to_skip); - -        m_num_tx_samples_dropped += tx_samples_to_skip; +        m_drop_tx_samples(tx_samples_to_skip);          return true;      }      return false; diff --git a/AlignSample.hpp b/AlignSample.hpp index 78c430f..5757ff9 100644 --- a/AlignSample.hpp +++ b/AlignSample.hpp @@ -88,14 +88,24 @@ class AlignSample {      private:          bool align(); -        double m_rx_sample_time() const { +        double m_rx_sample_time(size_t offset = 0) const {              return m_first_rx_sample_time + -                (double)m_num_rx_samples_dropped / samplerate; +                (double)(m_num_rx_samples_dropped + offset) / (double)samplerate;          } -        double m_tx_sample_time() const { +        double m_tx_sample_time(size_t offset = 0) const {              return m_first_tx_sample_time + -                (double)m_num_tx_samples_dropped / samplerate; +                (double)(m_num_tx_samples_dropped + offset) / (double)samplerate; +        } + +        void m_drop_tx_samples(size_t samples) { +            m_txsamples.erase(m_txsamples.begin(), m_txsamples.begin() + samples); +            m_num_tx_samples_dropped += samples; +        } + +        void m_drop_rx_samples(size_t samples) { +            m_rxsamples.erase(m_rxsamples.begin(), m_rxsamples.begin() + samples); +            m_num_rx_samples_dropped += samples;          }          std::mutex m_mutex; diff --git a/OutputUHD.cpp b/OutputUHD.cpp index a80f5b9..9536ebd 100644 --- a/OutputUHD.cpp +++ b/OutputUHD.cpp @@ -67,14 +67,13 @@ OutputUHD::OutputUHD(double txgain, double rxgain, double samplerate) :      m_usrp->set_rx_gain(m_rxgain);      MDEBUG("OutputUHD:Actual RX Gain: %f ...\n", m_usrp->get_rx_gain()); -    double tx_time = m_usrp->get_time_now().get_real_secs(); +    const double usrp_time = m_usrp->get_time_now().get_real_secs();      MDEBUG("OutputUHD: USRP time %f\n", -            tx_time); +            usrp_time);      md.start_of_burst = false;      md.end_of_burst   = false;      md.has_time_spec  = true; -    md.time_spec      = uhd::time_spec_t(tx_time + 2);      uhd::stream_args_t stream_args("fc32"); //complex floats      myTxStream = m_usrp->get_tx_stream(stream_args); @@ -89,13 +88,13 @@ OutputUHD::OutputUHD(double txgain, double rxgain, double samplerate) :  } -size_t OutputUHD::Transmit(const complexf *samples, size_t sizeIn, double *first_sample_time) +size_t OutputUHD::Transmit(const complexf *samples, size_t sizeIn, double transmit_time)  {      const double tx_timeout = 20.0;      size_t usrp_max_num_samps = myTxStream->get_max_num_samps(); -    *first_sample_time = md.time_spec.get_real_secs(); +    md.time_spec      = uhd::time_spec_t(transmit_time);      size_t num_acc_samps = 0; //number of accumulated samples      while (num_acc_samps < sizeIn) { diff --git a/OutputUHD.hpp b/OutputUHD.hpp index f1d164e..b3169c6 100644 --- a/OutputUHD.hpp +++ b/OutputUHD.hpp @@ -33,7 +33,7 @@ class OutputUHD {      public:          OutputUHD(double txgain, double rxgain, double samplerate); -        size_t Transmit(const complexf *samples, size_t sizeIn, double *first_sample_time); +        size_t Transmit(const complexf *samples, size_t sizeIn, double transmit_time);          ssize_t Receive(complexf *samples, size_t sizeIn, double *first_sample_time);      private: @@ -259,13 +259,15 @@ int main(int argc, char **argv)      std::thread correlator_thread(find_peak_correlation);      do { -        double first_sample_time = 0; +        const double first_sample_time = 4.0; +        const double sample_time = first_sample_time + (double)total_samps_read / (double)samplerate;          if (fd) {              std::vector<complexf> input_samples(samps_per_buffer);              samps_read = read_samples_from_file(fd, input_samples, samps_per_buffer); -            sent = output_uhd.Transmit(&input_samples.front(), samps_read, &first_sample_time); -            aligner.push_tx_samples(&input_samples.front(), samps_read, first_sample_time); + +            sent = output_uhd.Transmit(&input_samples.front(), samps_read, sample_time); +            aligner.push_tx_samples(&input_samples.front(), samps_read, sample_time);          }          else {              zmq::message_t msg; @@ -280,15 +282,14 @@ int main(int argc, char **argv)              }              samps_read = msg.size() / sizeof(complexf); -            sent = output_uhd.Transmit((complexf*)msg.data(), samps_read, &first_sample_time); - -            aligner.push_tx_samples((complexf*)msg.data(), samps_read, first_sample_time); +            sent = output_uhd.Transmit((complexf*)msg.data(), samps_read, sample_time); +            aligner.push_tx_samples((complexf*)msg.data(), samps_read, sample_time);          } -        if (first_sample_time - last_print_time > 1) { -            //MDEBUG("Tx %zu samples at t=%f\n", samps_read, first_sample_time); -            last_print_time = first_sample_time; +        if (sample_time - last_print_time > 1) { +            //MDEBUG("Tx %zu samples at t=%f\n", samps_read, sample_time); +            last_print_time = sample_time;          }          total_samps_read += samps_read; | 
