【问题标题】:std::chrono for frequencies?std::chrono 的频率?
【发布时间】:2016-03-16 17:54:59
【问题描述】:

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

typedef std::vector<double> vec;
vec bandPass(const vec& signal, double dwellTime, double lowCutoff, double highCutoff);

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

我想我可以使用std::chrono 来解决我的问题,但我还没有看到它被用来测量频率。我想要:

vec bandPass(const vec& signal, milliseconds dwellTime, kHertz lowCutoff, kHertz highCutoff);

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

有没有人遇到过类似的问题? C++ 写1/10s 之类的东西来指代赫兹是否合法?

我对 std::chrono(以及 C++,就此而言)没有太多经验,并希望在定义我的接口之前在这里收集一些智慧的话。也欢迎任何其他建议。

【问题讨论】:

标签: c++ c++11 chrono


【解决方案1】:

频率可以被视为一个周期的持续时间。所以 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));
}

现在13_hzfrequency&lt;int, std::ratio&lt;1,1&gt;&gt; 类型的对象。

【讨论】:

猜你喜欢
  • 2018-03-16
  • 2014-03-23
  • 1970-01-01
  • 2017-09-02
  • 2013-10-25
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多