2012-07-14 107 views

回答

11

我需要從非常嘈雜的CPU消耗數據中提取信號。這裏是Jeff McClintock中值濾波器...

將平均值和中值初始化爲零,然後對於每個樣本的「英寸」,向輸入樣本的中值增加一個小增量。最終,它將在大約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); 
} 

enter image description here

+0

雖然該解決方案是非常有效的,當心以下注意事項的: 1)的收斂速度取決於信號幅度(比較具有不同的偏移量和幅度的階躍響應),因此不收斂對信號接近零! 2)對於接近恆定的輸入信號,該估計引入具有'平均值* 0.01'幅度和採樣率頻率的抖動。3)短脈衝偏移(其中位數本來不是,因此作爲胡椒和噪聲濾波器而受歡迎) – orzechow 2017-06-06 12:02:46

+0

是的,消除抖動的一個改進是限制步長(平均值* 0.01),而不是大於錯誤信號(樣本 - 中位數),即:std :: max(平均值* 0.01,fabs(樣本 - 中位數))。 – 2017-10-04 23:20:23