2016-03-16 81 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

相關問題