索引周围任意数据点的中值 - 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 将标量值分配给数组的多个元素。)
我一直在使用 findpeaks
函数检测信号中的峰值,并取得了巨大成功。我的下一步是清理这些已识别的峰,我有这些峰的索引。
我的目标是计算给定索引之前的 Y 数据点和之后的 Y 数据点的中值,并用这些新值(计算出的中值)替换现有的任何值(噪音)。
像这样:
% points before, peak, points after
% ↓ ↓ ↓
x = [1, 2, 3, 1, 34, 3, 2, 1, 3]
计算 34
...
[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 将标量值分配给数组的多个元素。)