我已经实现了移动中位数绝对偏差(移动 MAD),它似乎与Matlab 的实现有点精确。尽管如此,我确信它没有效率。
通常的中值滤波器应该用 2 个堆来实现。由于每个元素的绝对偏差向量在一个样本与另一个样本之间完全不同,因此无法以这种方式实现移动 MAD 。这迫使我们对每个样本使用快速选择 - 这使得计算非常长......
function M = myMovmad(x, xmedian, windSize)
M = zeros(size(xmedian));
for iX=1:length(M)
ind1 = max([iX - (windSize - 1) / 2, 1]);
ind2 = min([length(x), iX + (windSize - 1) / 2]);
M(iX) = median(abs(x(ind1:ind2) - xmedian(iX)));
end
end
不知何故,Matlab 设法实现了移动 MAD,计算时间仅为中值滤波器的两倍。这表明他们以某种方式设法使用了双中值滤波器。关于如何实施它的任何想法?
似乎 Hampel 滤波器是更通用的一组滤波器的一部分,称为递归中值滤波器(也与鲁棒规模估计有关)。该组中的几个过滤器在GNU 科学库中基于链接的文章有一个 C实现。然而,它们的实现似乎与上面介绍的非常相似——这并不令人满意。有没有更好的实现或更有效的尖峰去除?