Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何找到向量的相对最小值(不是最小值)_Matlab_Octave - Fatal编程技术网

Matlab 如何找到向量的相对最小值(不是最小值)

Matlab 如何找到向量的相对最小值(不是最小值),matlab,octave,Matlab,Octave,让我们假设我有一个值向量,其表示形式如下: 数据向量有2000个元素,如您所见,还有一个向量的角度介于-180º和180º之间。我想找到每个最小峰值的指数,但我不知道如何实现该算法 在其他情况下,我设置了一个阈值(例如-75dBm),并考虑了-75dBm以下的最小值,但在这种情况下,峰值在-70dBm以上,我不能增加阈值,因为我的测量结果将是错误的 我希望有人能帮助我。感谢您的回复。对于这样的数据,您最好的办法是平滑它,然后使用FindPeak 例如 %% parameters to adjs

让我们假设我有一个值向量,其表示形式如下:

数据向量有2000个元素,如您所见,还有一个向量的角度介于-180º和180º之间。我想找到每个最小峰值的指数,但我不知道如何实现该算法

在其他情况下,我设置了一个阈值(例如-75dBm),并考虑了-75dBm以下的最小值,但在这种情况下,峰值在-70dBm以上,我不能增加阈值,因为我的测量结果将是错误的


我希望有人能帮助我。感谢您的回复。

对于这样的数据,您最好的办法是平滑它,然后使用FindPeak

例如

%% parameters to adjsut
%smoothing window length
smthwin=50;
%minimum peak prominence
mpp=0.01;

%% create some test data
x=(1:1000)/1000;
y=sin(3*x-0.5).*sin(5*x).*sin(9*x-0.1).*sin(15*x-0.3)+rand(size(x))/10;

%% smooth and findpeaks
%smooth it
%here I use a median filter, but smooth() is a great function too with lots of options 
ysmth=medfilt1(y,smthwin);

%use findpeaks on -y to find local minima
[pks,pks_loc]=findpeaks(-ysmth,'MinPeakProminence',mpp);
%the location of the local minima is 
mins=x(pks_loc);

%%plot to check
figure
plot(x,y)
hold on
plot(mins,-pks,'o','LineWidth',2)

使用卡尔曼/低通滤波器(因为数据看起来有噪声),然后使用内置函数
islocalmin
。我有Matlab 2015,函数
islocalmin
似乎没有实现,因此您可以以相同的方式使用
idy=findpeaks(-filtered_y)
当我过滤数据时,一些最小值太轻,以至于
findpeaks
功能无法找到它们。有两种选择:1)改进过滤器2)不要应用过滤器并检测所有实际最小值(但你会得到很多最小值)。我不认为对数据进行平滑处理的笼统建议是最佳做法。。。您的峰值可能与原始数据中的峰值不一致。您最好使用
findpeaks
的额外输出,并在高度和/或宽度阈值上限制已识别的峰值,如我在问题上所述,或者使用
mpp