假设大小为x
的时间信号1xN
被假定为正弦曲线。对此进行峰值检测,我希望输出交替为正/负,在“假峰值”的情况下(可能由于信号中的噪声而发生),我想平均序列。
输入为[locs, pks]
,示例可以是:
locs = [ 10 20 30 38 40 42 50 60 ];
pks = [ 2.3 -1.2 0.5 -1.6 -1.4 -1.5 0.3 -0.5 ];
在这种情况下,我希望将汇总数字4到6收集到合并的loc = mean([38 40 42]) = 40
和pk = mean([-1.6 -1.4 -1.5]) = -1.5
。一种工作算法是:
labels = bwlabel(diff(sign(pks)) == 0);
ulabels = 1:max(labels);
for i = 1:length(ulabels)
idx = find(labels==ulabels(i));
idx = [idx, idx(end)+1];
locs(idx(1)) = round(mean(locs(idx)));
pks(idx(1)) = mean(pks(idx));
locs(idx(2:end)) = nan;
pks(idx(2:end)) = nan;
end
locs = locs(~isnan(locs));
pks = pks(~isnan(pks));
但是,由于for
循环,如果有许多错误峰值,这将非常慢,并且在我的整个脚本中将运行多次次。我希望加快速度。
因此:我怎样才能解决这个问题?
感谢。