2016-03-16 44 views
4

我实施一个非常简单的带通滤波器,它的输入参数是包含该信号时,停留时间,并且截止频率为高通和低通滤波器的载体:std :: chrono的频率?

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++来说),并希望在定义我的接口之前,我可以在这里收集一些智慧词汇。任何其他建议也是受欢迎的。

+0

我想你正在寻找['std :: chrono :: duration'](http://en.cppreference.com/w/cpp/chrono/duration)来表示时间间隔。 – AndyG

回答

8

频率可以被视为一个周期的持续时间。所以20赫兹可以被视为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<int, std::ratio<1,1>>类型的对象。

+0

即时可用且更简单(但功能更强大)的解决方案可以在[C++中的度量单位]中找到(http://stackoverflow.com/questions/21868368/units-of-measurement-in -C)。 – lorcap

相关问题