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

Median of arbitrary datapoint around index - MATLAB

我一直在使用 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]

关于如何实施这个有什么建议吗?

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

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

我认为单独处理每个峰最有效。下面我会一步一步来演示。

取每个峰的邻域

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 将标量值分配给数组的多个元素。)