替换索引周围的+/-值 - MATLAB

时间:2017-11-19 13:32:52

标签: arrays matlab

question之后,我从中获得了宝贵的帮助,我已经达成了以下问题:

使用检测到的峰的指数并计算了我的信号的中位数+/- 3个数据点在这些峰值周围,我需要在峰值周围的+/- 5窗口中用先前计算的中位数替换我的信号。

我只能用中位数替换峰值处的数据点,而不能替换周围的+/- 5个数据点...见图。黑色=原始峰值;黄色=峰值处的数据点变为其周围+/- 3个数据点的中位数。

Original peak and changed peak

不幸的是,我无法通过遵循上一个问题的建议来使其发挥作用。

非常感谢任何帮助!

干杯, 中号

1 个答案:

答案 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}}