5

入力シーケンスの移動平均を計算することになっている FIR フィルターを作成しています。

class RunningAverager
{
    public:
        RunningAverager(uint64_t FilterOrder)
        {
            for (uint64_t i=0; i<FilterOrder; i++)
            {
                Registers.push(0);
            }
        }
        uint64_t GetAverage(uint64_t NewInput)
        {
            Registers.push(NewInput);
            Registers.pop();
            return GetAverage();
        }
        uint64_t GetAverage() const
        {
            uint64_t Sum = 0;
            //for (uint64_t i=0; i<Registers.size(); i++)       <-- Works
            for (std::stack<uint64_t>::const_reference ref=Registers.begin(); ref!=Registers.end(); ???)
            {   // begin() and end() methods do not exist for std::stack
                //Sum += Registers[i];      Doesn't work, because the [] operator is not overloaded.
                Sum += ref;
            }
            return Sum / Registers.size();
        }
    private:
        std::stack<uint64_t> Registers;
};

std::stackオブジェクトの反復処理に問題がありますRegisters。他の STL コンテナーとは異なり、反復子またはランダム アクセス演算子は提供されません。

std::stackループしてオブジェクトを作成するにはどうすればよいですか?

使用例:

RunningAverager ra(10);

while(...)
{
    FilteredSpeed = ra.GetAverage(ActualSpeed);
}
4

3 に答える 3

1

と を使用しstd::dequeて、スタックの代わりに を使用できます。push_frontpop_front

于 2013-08-08T11:58:33.630 に答える
1

std::dequeこの特定のアプリケーションでは、コンテナーを使用する方が簡単です。

class RunningAverage
{
    public:
        RunningAverage(uint64_t Order)
        {
            for (uint64_t i=0; i<Order; i++)
            {
                Registers.resize(Order, 0);
            }
        }
        uint64_t GetAverage(uint64_t NewInput)
        {
            Registers.push_back(NewInput);
            Registers.pop_front();
            return GetAverage();
        }
        uint64_t GetAverage() const
        {
            uint64_t Sum = 0;
            for (std::deque<uint64_t>::const_iterator it=Registers.begin(); it<Registers.end(); ++it)
            {
                Sum += *it;
            }
            return Sum / Registers.size();
        }
    private:
        std::deque<uint64_t> Registers;
};
于 2013-08-08T12:22:31.990 に答える
0

最初のループで値をスタックにプッシュします。したがって、2 番目のループでそれらを取り出し、それらを加算してカウントし、平均を取得できます。

于 2013-08-08T11:55:14.380 に答える