2012-07-14 52 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