在question之后,我从中获得了宝贵的帮助,我已经达成了以下问题:
使用检测到的峰的指数并计算了我的信号的中位数+/- 3个数据点在这些峰值周围,我需要在峰值周围的+/- 5窗口中用先前计算的中位数替换我的信号。
我只能用中位数替换峰值处的数据点,而不能替换周围的+/- 5个数据点...见图。黑色=原始峰值;黄色=峰值处的数据点变为其周围+/- 3个数据点的中位数。
Original peak and changed peak
不幸的是,我无法通过遵循上一个问题的建议来使其发挥作用。
非常感谢任何帮助!
干杯, 中号
答案 0 :(得分:1)
假设您的意思是以下内容。给定数组
35
您要替换3,4,5,35,5,4,3
和周围的+/- 5个条目,其中位数为4
,即x = [0 4 4 4 4 4 4 4 4 4 4 4 0]
,因此生成的数组应为
[~,idx]=findpeaks(x);
med_sz = 3; % Take the median with respect to +/- this many neighbors
repl_sz = 5; % Replace neighbors +/- this distance from peak
if ~isempty(idx)
m = medfilt1(x,med_sz*2+1);
N = numel(x);
for offset = -repl_sz:repl_sz
idx_offset = idx + offset;
idx_valid = idx_offset >= 1 & idx_offset <= N;
x(idx_offset(idx_valid)) = m(idx(idx_valid));
end
end
根据我在中的回答,直观的方法是通过抵消指标简单地用中值替换邻居。这可以通过以下方式完成
[~,idx]=findpeaks(x);
med_sz = 3;
repl_sz = 5;
if ~isempty(idx)
m = medfilt1(x,med_sz*2+1);
idx_repeat = repmat(idx,repl_sz*2+1,1);
idx_offset = idx_repeat + repmat((-repl_sz:repl_sz)',1,numel(idx));
idx_valid = idx_repeat >= 1 & idx_repeat <= numel(x);
idx_repeat = idx_repeat(idx_valid);
idx_offset = idx_offset(idx_valid);
x(idx_offset) = m(idx_repeat);
end
或者,如果要避免循环,则等效的无循环实现
{{1}}