デジタル フィルタリング C++ アプリケーションでは、std::inner_product
(および と一緒std::vector<double>
にstd::deque<double>
) を使用して、データ サンプルごとに、フィルター係数と入力データの間の内積を計算します。アプリケーションのプロファイリングを行った後、実行時間の 85% 以上がstd::inner_product
!に費やされていることがわかりました。
std::inner_product
たとえばGCCでは、どの程度まで最適化されていますか? SIMD命令を使用していますか?ループ展開を実行しますか? それを確認する方法は?これに基づいて、カスタム内積関数を実装する価値はありますか (特に係数の数が少ない場合)? (ただし、機能を可能な限り汎用的に保ちたい)
より具体的には、これはフィルターを適用するために使用するコードです。
std::deque<double> in(filterNum.size(), 0.0);
std::deque<double> out(filterDenom.size() - 1, 0.0);
const double gain = filterDenom.back();
for (unsigned int s = 0, size = data.size(); s < size; ++s) {
in.pop_front();
in.push_back(data[s] / gain);
data[s] = inner_product(in.begin(), in.end(), filterNum.begin(),
-inner_product(out.begin(), out.end(), filterDenom.begin(), 0.0));
out.pop_front();
out.push_back(data[s]);
}
通常、私は 2 次バンドパス IIR フィルターを使用します。これは、filterNum
およびfilterDenom
(フィルターの分子と分母の係数) のサイズが 5であることを意味します。data
は、入力サンプルを含むベクトルです。