高速で効率的なメディアン フィルターの Ansi C 実装を探しています。ポインタはありますか?
これまでのところ、次の実装を見つけました。これは優れていますが、より高速なものに興味があります。1次元だけが必要です。
非常にノイズの多い CPU 消費データから信号を抽出する必要がありました。これがジェフ・マクリントックのメジアンフィルターです...
平均値と中央値をゼロに初期化し、各サンプルの「インチ」ごとに入力サンプルに向かって中央値を少しずつ増やします。最終的には、入力サンプルの約 50% が中央値よりも大きく、50% が中央値よりも小さい点で落ち着きます。増分のサイズは、実際の中央値に比例する必要があります。実際の中央値がわからないので、平均値を概算として使用します。ステップ サイズは、推定値の 0.01 倍として計算されます。ステップ サイズが小さいほど正確ですが、安定するまでに時間がかかります。
float median = 0.0f;
float average = 0.0f;
// for each sample
{
average += ( abs(sample) - average ) * 0.1f; // rough running average magnitude.
median += _copysign( average * 0.01, sample - median );
}