2016-10-16 1 views
1

Ich habe jetzt Minima und Maxima in der Ausgabe (Abb. 1), aber ich würde gerne Beschriftungen (Abb. 2) für sortierte Maxima bekommen (höchstes erhalten 1, ...) und ähnlich für Minima (niedrigstes bekommt 1). kann ich die Ausgabe von Figur tun. 1 durch die folgenden, aber ich kann diese Anmerkungen zur FunktionWie wird Annotate erweitert ... in diesen MATLAB-Findpeaks?

close all; clear all; clc; 
% https://se.mathworks.com/help/signal/ref/findpeaks.html 
% http://stackoverflow.com/a/26837689/54964 
x = linspace(0,1,1000); 

Pos = [1 2 3 5 7 8]/10; 
Hgt = [4 4 2 2 2 3]; 
Wdt = [3 8 4 3 4 6]/100; 

for n = 1:length(Pos) 
    Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2); 
end 

PeakSig = sum(Gauss) - exp(sum(Gauss))/10; 

plot(x, PeakSig); 
hold on; 

[p l]=findpeaks(PeakSig); %,x); %,'Annotate','extents','WidthReference','halfheight') 
plot(x(l), p, 'ko', 'MarkerFaceColor', 'g'); 

[pn ln]=findpeaks(-PeakSig); %,x); %,'Annotate','extents','WidthReference','halfheight') 
plot(x(ln), -pn, 'ko', 'MarkerFaceColor', 'r'); 
title('Signal Peak Widths') 

Um nur anhängen 'Annotate','extents','WidthReference','halfheight')-[p l]=findpeaks(...) funktioniert nicht in der Anwendung usw. Folgenden offenbar, weil das Verfahren Linie plot(x(l), p, 'ko', 'MarkerFaceColor', 'g'); nicht integrieren versteht den zusätzlichen Inhalt durch die Einzeiler in den entsprechenden Variablen gemacht

[p l]=findpeaks(PeakSig,'Annotate','extents','WidthReference','halfheight') 
[p l]=findpeaks(PeakSig, x, 'Annotate','extents','WidthReference','halfheight') 

Abb. 1 Stromausgang ohne diese Anmerkungen, Abb. 2 Erwartete Ausgabe aber mit Noten von Maxima und Minima

enter image description here enter image description here

MATLAB: 2016b
OS: Debian 8.5 64-Bit-
Hardware: Asus Zenbook UX303UA

Antwort

1

Hier ist ein Weg, dies zu:

x = linspace(0,1,1000); 
Pos = [1 2 3 5 7 8]/10; 
Hgt = [4 4 2 2 2 3]; 
Wdt = [3 8 4 3 4 6]/100; 
Gauss = zeros(numel(Pos),numel(x)); 
for n = 1:numel(Pos) 
    Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2); 
end 
PeakSig = sum(Gauss) - exp(sum(Gauss))/10; 

% get the peaks: 
[p,xmax] = findpeaks(PeakSig,x); 
maxsrt = sortrows([xmax;p].',-2); 
[pn,xmin] = findpeaks(-PeakSig,x); 
minsrt = sortrows([xmin;-pn].',2); 

% plotting: 
blue = [0 0.447 0.741]; 
plot(x,PeakSig,xmax,p+0.2,'v','MarkerFaceColor',blue,'MarkerEdgeColor',blue); 
% you can comment the line above and uncomment the line below, if you 
% prefer: 
% findpeaks(PeakSig,x,'Annotate','peaks'); 
text(maxsrt(:,1),maxsrt(:,2)+0.2,num2str((1:numel(p)).'),'FontSize',14,... 
    'VerticalAlignment','bottom','HorizontalAlignment','center') 
ylim([-10 3]); 
grid on 
hold on 
plot(xmin,-pn-0.2,'^','MarkerFaceColor',blue,'MarkerEdgeColor',blue); 
hold off 
text(minsrt(:,1),minsrt(:,2)-0.2,num2str((1:numel(pn)).'),'FontSize',14,... 
    'VerticalAlignment','top','HorizontalAlignment','center') 
title('Signal Peak Widths') 

peaks

1

Und hier ist eine andere Möglichkeit, dies zu tun, mit gscatter. Statt plot zweimal aufzurufen (und möglicherweise mehr, wenn andere Anmerkungen benötigt werden), fassen Sie alle Positionen (xy) und den Typ der Anmerkungen zu einem Array zusammen (pks) und zeichnen sie alle auf einmal nach ihrem Typ (dh Gruppe) mit gscatter:

x = linspace(0,1,1000); 
Pos = [1 2 3 5 7 8]/10; 
Hgt = [4 4 2 2 2 3]; 
Wdt = [3 8 4 3 4 6]/100; 
Gauss = zeros(numel(Pos),numel(x)); 
for n = 1:numel(Pos) 
    Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2); 
end 
PeakSig = sum(Gauss) - exp(sum(Gauss))/10; 

% get the peaks: 
[p,xmax] = findpeaks(PeakSig,x); 
maxsrt = sortrows([xmax;p].',-2); 
[pn,xmin] = findpeaks(-PeakSig,x); 
minsrt = sortrows([xmin;-pn].',2); 

% plotting: 
pks = [[xmin xmax];[-pn-0.2 p+0.2];[zeros(1,numel(pn)) ones(1,numel(p))]].'; 
blue = [0 0.447 0.741]; 
ax = axes; 
plot(ax,x,PeakSig) 
hold on 
gscatter(pks(:,1),pks(:,2),pks(:,3),blue,'^v') 
hold off 
ax.Children(1).MarkerFaceColor = blue; 
ax.Children(2).MarkerFaceColor = blue; 
text(maxsrt(:,1),maxsrt(:,2)+0.2,num2str((1:numel(p)).'),'FontSize',14,... 
    'VerticalAlignment','bottom','HorizontalAlignment','center') 
text(minsrt(:,1),minsrt(:,2)-0.2,num2str((1:numel(pn)).'),'FontSize',14,... 
    'VerticalAlignment','top','HorizontalAlignment','center') 
ylim([-10 3]); 
legend off 
grid on 
title('Signal Peak Widths') 

das Ergebnis ist genau die same, aber das ist mehr kurz und vielleicht eleganter.

+1

Nein, es verwendet 'findpeaks', es ersetzt nur den Abschnitt'% Plotten: 'in der ersten Antwort. Es unterscheidet sich nur in der Art, wie Sie die Spitzen annotieren. – EBH

+1

Können Sie bitte kurz am Anfang der Antwort verbal hinzufügen, wie sich die Anmerkungen hier unterscheiden. –