accurate sampling in c++

前端 未结 2 1392
耶瑟儿~
耶瑟儿~ 2021-01-06 21:55

I want to sample values I get from a gpio 4000 times per second, currently I do something like that:

std::vector sample_a_chunk(unsigned int rate         


        
相关标签:
2条回答
  • 2021-01-06 22:24

    I think the best you can probably achieve is to use absolute timing so as to avoid drift.

    Something like this:

    std::vector<int> sample_a_chunk(unsigned int rate,
        unsigned int block_size_in_seconds)
    {
        using clock = std::chrono::steady_clock;
    
        std::vector<int> data;
    
        const auto times = rate * block_size_in_seconds;
        const auto delay = std::chrono::microseconds{1000000 / rate};
    
        auto next_sample = clock::now() + delay;
    
        for(int j = 0; j < times; j++)
        {
            data.emplace_back(/* read the value from the gpio */);
    
            std::this_thread::sleep_until(next_sample);
    
            next_sample += delay; // don't refer back to clock, stay absolute
        }
        return data;
    }
    
    0 讨论(0)
  • 2021-01-06 22:38

    I would use boost::asio::deadline_timer.

    #include <vector>
    
    #define BOOST_ERROR_CODE_HEADER_ONLY 1
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    std::vector<int> sample_a_chunk(unsigned int rate, unsigned int block_size_in_seconds) {
      std::vector<int> data;
      const unsigned int times = rate * block_size_in_seconds;
      auto expiration_time = boost::posix_time::microsec_clock::local_time();
      const auto delay = boost::posix_time::microseconds(1000000/rate);
      boost::asio::io_service io;
      boost::asio::deadline_timer t(io);
    
      for (unsigned int j=0; j < times; j++) {
        expiration_time += delay;
        data.emplace_back(/* read the value from the gpio */);
        t.expires_at(expiration_time);
        t.wait();
      }
      return data;
    }
    
    0 讨论(0)
提交回复
热议问题