繁体   English   中英

用c ++进行准确采样

[英]accurate sampling in c++

我想对每秒从gpio获得的值进行4000次采样,目前我正在执行类似的操作:

std::vector<int> sample_a_chunk(unsigned int rate, unsigned int block_size_in_seconds) {
    std::vector<std::int> data;
    constexpr unsigned int times = rate * block_size_in_seconds;
    constexpr unsigned int delay = 1000000 / rate; // microseconds
    for (int j=0; j<times; j++) {
      data.emplace_back(/* read the value from the gpio */);
      std::this_thread::sleep_for(std::chrono::microseconds(delay));
    }
    return data;
}

但是根据参考,sleep_for可以保证至少等待指定的时间。

如何让系统等待确切的时间,或者至少达到最佳的准确性? 我如何确定系统的时间分辨率?

我认为您可能可以实现的最好方法是使用绝对定时以避免漂移。

像这样:

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;
}

我会使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM