ここにあるように見えるのは、ボックスカーウィンドウ関数を実装する有限インパルス応答(FIR)フィルターの低音の実装です。DSPの観点から問題を考えると、それぞれがの値をvector
持つNO_OF_NEIGHBOURS
等しいFIR係数で着信をフィルタリングする必要があります1/NO_OF_NEIGHBOURS
。通常、車輪の再発明ではなく、確立されたアルゴリズムを使用するのが最善です。
これは、フィルターが2倍になる、かなりだらしない実装です。これを簡単に変更して、データ型をフィルタリングできます。デモでは、デモンストレーションの目的で、立ち上がりソー関数(0、.25、.5,1)の数サイクルのフィルタリングを示しています。それはコンパイルされるので、あなたはそれで遊ぶことができます。
#include <iostream>
#include <vector>
using namespace std;
class boxFIR
{
int numCoeffs; //MUST be > 0
vector<double> b; //Filter coefficients
vector<double> m; //Filter memories
public:
boxFIR(int _numCoeffs) :
numCoeffs(_numCoeffs)
{
if (numCoeffs<1)
numCoeffs = 1; //Must be > 0 or bad stuff happens
double val = 1./numCoeffs;
for (int ii=0; ii<numCoeffs; ++ii) {
b.push_back(val);
m.push_back(0.);
}
}
void filter(vector<double> &a)
{
double output;
for (int nn=0; nn<a.size(); ++nn)
{
//Apply smoothing filter to signal
output = 0;
m[0] = a[nn];
for (int ii=0; ii<numCoeffs; ++ii) {
output+=b[ii]*m[ii];
}
//Reshuffle memories
for (int ii = numCoeffs-1; ii!=0; --ii) {
m[ii] = m[ii-1];
}
a[nn] = output;
}
}
};
int main(int argc, const char * argv[])
{
boxFIR box(1); //If this is 1, then no filtering happens, use bigger ints for more smoothing
//Make a rising saw function for demo
vector<double> a;
a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
a.push_back(0.); a.push_back(0.25); a.push_back(0.5); a.push_back(0.75); a.push_back(1.);
box.filter(a);
for (int nn=0; nn<a.size(); ++nn)
{
cout << a[nn] << endl;
}
}
この線を使用してフィルター係数の数を増やして、徐々に平滑化された出力を確認します。フィルタ係数が1つしかないため、平滑化は行われません。
boxFIR box(1);
コードは十分に柔軟なので、必要に応じてウィンドウの形状を変更することもできます。これを行うには、コンストラクターで定義された係数を変更します。
注:これは因果的フィルターであるため、実装に対してわずかに異なる出力が得られます(現在のサンプルと以前のサンプルにのみ依存します)。実装は、平均を作成するために将来のサンプルを先読みするため、因果関係はありません。そのため、ベクトルの終わりに近づいている状況では、条件付きステートメントが必要です。このアルゴリズムを使用してフィルターで実行しようとしているような出力が必要な場合は、このアルゴリズムを逆に実行してベクトルを実行します(これは、ウィンドウ関数が対称である限り正常に機能します)。そうすれば、アルゴリズムの厄介な条件付き部分なしで同様の出力を得ることができます。