中值滤波器超高效实现

5
我正在寻找一种快速/高效的中值滤波器的 Ansi C 实现。有什么建议吗?
到目前为止,我已经找到了 以下 的实现,它很好,但我对更快的实现感到好奇。我只需要用于一个维度。
1个回答

14
I需要从非常嘈杂的CPU消耗数据中提取信号。这里是Jeff McClintock中位数滤波器... 初始化平均值和中位数为零,然后对于每个样本'inch',通过小的增量将中位数朝向输入样本。最终,它将在约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


1
虽然这个解决方案非常高效,但请注意以下注意事项:1)收敛速度取决于信号幅度(比较具有不同偏移和幅度的阶跃响应),因此不会收敛到接近零的信号!2)对于接近恒定输入信号,该估计引入了振荡,其振幅为“平均值* 0.01”,频率为采样率3)在短脉冲上偏转(原始中位数不会这样做,因此作为胡椒和噪声滤波器而受欢迎) - orzechow
是的,消除抖动的一种改进方法是将步长限制在误差信号(样本-中位数)的最大值之内,即:std::max(average * 0.01,fabs(sample - median))。 - Jeff McClintock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接