我正在实现一个非常简单的带通滤波器,它的输入参数是一个 vector ,其中包含信号、驻留时间以及高通和低通滤波器的截止频率:
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
的内容来引用 Hertz 是否合法?
我对 std::chrono(以及 C++,就此而言)没有太多经验,希望在定义我的接口(interface)之前能在这里收集一些智慧的话。也欢迎任何其他建议。
最佳答案
频率可以视为一个周期的持续时间。因此 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>>
类型的对象.
关于c++ - std::chrono 的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36043351/