std :: chrono的频率?

dan*_*gom 4 c++ c++11 c++-chrono

我正在实现一个非常简单的带通滤波器,它的输入参数是一个包含高通和低通滤波器的信号,停留时间和截止频率的向量:

typedef std::vector<double> vec;
vec bandPass(const vec& signal, double dwellTime, double lowCutoff, double highCutoff);
Run Code Online (Sandbox Code Playgroud)

我的界面的明显问题是函数调用者必须事先知道预期的时间和频率单位,并且如果必要的话可能必须经历适当地转换它们的烦恼.

我想我可能会std::chrono用来解决我的问题,但我还没有看到它被用来测量频率.我想拥有:

vec bandPass(const vec& signal, milliseconds dwellTime, kHertz lowCutoff, kHertz highCutoff);
Run Code Online (Sandbox Code Playgroud)

并让我的函数将所有单位转换为秒和赫兹进行计算.理想情况下,乘以毫秒和kHz会得到与乘以秒和Hz相同的结果.

有没有人遇到过类似的问题?是否合法的C++可以写出1/10s引用Hertz的内容?

我没有太多使用std :: chrono(以及C++)的经验,希望在定义我的界面之前我可以在这里收集一些智慧的话.任何其他建议也欢迎.

Yak*_*ont 8

频率可以被视为周期的持续时间.因此20 Hz可以被视为0.05秒.

Chrono将全力支持.

您可以编写一个Hz类型或频率模板,与某些上下文中的周期/持续时间相反.内部存储持续时间并不能很好地工作,遗憾的是,以秒为单位的int Hz,因为持续时间以秒为单位是失败.

template<
  class Rep,
  class Period = std::ratio<1>
>
struct frequency;

template<
  class Rep,
  std::intmax_t Num,
  std::intmax_t Denom>
>
struct frequency<Rep, std::ratio<Num, Denom>>
{
  // todo!
  frequency& operator+=(const frequency& d);
  frequency& operator-=(const frequency& d);
  frequency& operator*=(const Rep& rhs);
  frequency& operator/=(const Rep& rhs);
  frequency& operator%=(const frequency& rhs);
  Rep count() const;
  friend frequency operator+(frequency lhs, frequency const& rhs);
  friend frequency operator-(frequency lhs, frequency const& rhs);
  friend frequency operator*(frequency self, Rep const& scalar);
  friend frequency operator*(Rep const& scalar, frequency self);
  friend frequency operator/(frequency self, Rep const& scalar);
  friend frequency operator%(frequency lhs, Rep const& rhs);
  friend frequency operator%(frequency lhs, frequency const& rhs);
  friend bool operator==(frequency const& lhs, frequency const& rhs);
  friend bool operator!=(frequency const& lhs, frequency const& rhs);
  friend bool operator<=(frequency const& lhs, frequency const& rhs);
  friend bool operator>=(frequency const& lhs, frequency const& rhs);
  friend bool operator<(frequency const& lhs, frequency const& rhs);
  friend bool operator>(frequency const& lhs, frequency const& rhs);
  template<class ToFrequency>
  friend ToFrequency duration_cast(frequency const& self);
  // etc
};

template<class Rep>
using hertz = frequency<Rep>;

template<class T>
hertz<T> operator "" _hz(T t) {
  return hertz<T>(std::move(t));
}
Run Code Online (Sandbox Code Playgroud)

现在13_hz是一个类型的对象frequency<int, std::ratio<1,1>>.