标准::频率的计时
std::chrono for frequencies?
我正在实现一个非常简单的带通滤波器,它的输入参数是一个包含信号、停留时间和高通和低通滤波器截止频率的矢量:
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>>
的对象。
相关文章:
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 在指针的帮助下,文本文件中单词的频率
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 函数计算用户按下按钮的频率
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 在条件变量中触发错误信号的频率是多少
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 使用标准库对矢量的矢量进行排序,并计算唯一出现的频率
- 标准::频率的计时