在倍频程/matlab中切掉不必要点的最简单方法

在倍频程/matlab中切掉不必要点的最简单方法,matlab,octave,data-mining,Matlab,Octave,Data Mining,我将点(x,y)的坐标存储在名为data的1206x2矩阵中。命令plot(data(:,1),data(:,2))给出了以下图片: 我使用findpeaks命令在数据中找到了最大值: [pks,loc,smth] = findpeaks(data(:,2)); 然后将它们绘制在上一张图上: plot(mod(:,1),mod(:,2),mod(loc,1),pks,'o') 所以,问题是:什么是最简单的方法来切断我不需要的最大值,我指的是这张图片红线下的最大值: UPD: 到目前为止,

我将点(x,y)的坐标存储在名为
data
1206x2
矩阵中。命令
plot(data(:,1),data(:,2))
给出了以下图片:

我使用
findpeaks
命令在数据中找到了最大值:

[pks,loc,smth] = findpeaks(data(:,2));
然后将它们绘制在上一张图上:

plot(mod(:,1),mod(:,2),mod(loc,1),pks,'o')

所以,问题是:什么是最简单的方法来切断我不需要的最大值,我指的是这张图片红线下的最大值: UPD:
到目前为止,我发现最好的方法是使用“MinPeakDistance”参数。

跳过绘图中的点的最简单方法是使它们
NaN
。我将假设您有一个变量
红线
,所有X值都有Y值,因此
红线(loc)
将返回峰值位置的截止值。您可以忽略曲线以外的
峰值,如下所示:

>>pks(pks < redline(loc)) = NaN
>>plot(mod(:,1),mod(:,2),mod(loc,1),pks,'o') 
>pks(pks>绘图(mod(:,1),mod(:,2),mod(loc,1),pks,'o')

对于您显示的信号,它实际上非常简单。如果我有一些类似于你的信号

你可以在导数的符号等于1的地方找到正峰值

dy = [NaN, diff(y)];
pks = sign(dy) == 1;
t_pks = t(pks);
y_pks = y(pks);

尝试使用
信封
内置功能:

% generate signal
x = 1:200;
y = x.*sin(x/5).*sin(3*x);
% get its envelope
npeak = 2;
[yupper,ylower] = envelope(y,npeak,'peak');
plot(x,y,x,yupper)


然后你可以从这个封套中加/减常数,使其沿y轴移动。

不幸的是,我在gimpSo中画了红线,它没有切掉我不需要的峰值,如果你正在寻找一个倍频程的解决方案,你不应该为Matlab添加标签,除非你特别要求两者兼容。