索引周围任意数据点的中位数 - MATLAB

时间:2017-11-18 16:16:31

标签: matlab filtering signal-processing median

我一直在使用findpeaks功能,非常成功地检测到信号中的峰值。我的下一步是清理这些已识别的峰,我有这些峰。

我的目标是计算给定指数之前的Y数据点和Y数据点的中位数,并用这些新值(计算的中位数)替换任何值(噪音)。

这样的事情:

%  points before, peak, points after
%        ↓         ↓         ↓
x = [1, 2, 3, 1,   34,   3, 2, 1, 3]

计算34的峰值之前和之后的4个数据点的中位数...

[1,2,3,1,3,2,1,3]的中位数为2

用这个新值替换我的峰值:

% Replaced peak with surrounding median
%                  ↓
x1 = [1, 2, 3, 1,  2,  3, 2, 1, 3]

有关如何实施此建议的任何建议吗?

2 个答案:

答案 0 :(得分:2)

找到峰值并将其替换为medfilt1()

的结果
[~,idx]=findpeaks(x);
if ~isempty(idx)
    m = medfilt1(x,9);
    x(idx) = m(idx);
end

答案 1 :(得分:1)

我认为单独处理每个峰值是最有效的。我将在下面逐步演示。

采取每个峰值的邻域

x(idx_max-N:idx_max+N)

N分别为峰值左侧和右侧的元素数量。可以使用MATLAB的median()函数计算每个峰周围邻域的中位数:

median(x(idx_max-N:idx_max+N))

现在,您只能将峰值位置的元素替换为邻域的中位数:

x(idx_max) = median(x(idx_max-N:idx_max+N))

或使用中值轻松替换邻域中的所有元素:

x(idx_max-N:idx_max+N) = median(x(idx_max-N:idx_max+N))

(请注意,在最后一个示例中使用scalar expansion将标量值分配给数组的多个元素。)