在倍频程/matlab中切掉不必要点的最简单方法
我将点(x,y)的坐标存储在名为在倍频程/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: 到目前为止,
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添加标签,除非你特别要求两者兼容。