标准::频率的计时

std::chrono for frequencies?

本文关键字:频率 标准      更新时间:2023-10-16

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

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 相同的结果。

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

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

频率可以被视为一个周期的持续时间。 因此,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_hz是类型 frequency<int, std::ratio<1,1>> 的对象。