2016-11-24 5 views
3

Ich habe eine sehr große Textdatei mit 11 Spalten. Da ich nicht die gesamten Daten posten kann, habe ich die Textdatei zu einem öffentlichen Repo hochgeladen und in diesem Link gefunden: http://s000.tinyupload.com/?file_id=59483318155908771897GNU-Plot - Zählen Sie die Anzahl der Peaks

Gibt es eine Möglichkeit, die Anzahl der Peaks mit GNU-Plot in Linux COUNT? Aus der obigen Textdatei zeichne ich die Spalte 1st und 7th als x- und y-Spalte, wo die Peaks Variationen der 7th Spalte sind und das ist, was mich interessiert. Zum Beispiel, um die Anzahl zu zählen Spitzen der Frequenz wie im folgenden Bild als 10.

Hier ein einfaches Plotten Skript ich benutze.

set key right top 
set xrange [:10] 


#show timestamp 
set xlabel "time in sec" 
set ylabel "Freq" 


set title "Testing" 
plot "data/freq.csv" using 1:7 title "Freq", \ 

Danke für jede Hilfe.

+1

Nicht mit Gnuplot. GNU Octave findpeaks() sollte das allerdings können. – Thor

+1

Ein paar Punkte: Es heißt [Gnuplot nicht GNU-Plot] (http://www.gnuplot.info/faq/faq.html#x1-120001.7).Das Durchführen einer Signalanalyse, wie das Finden von Spitzen in einem Signal, erfordert ein Werkzeug, das für solche Aufgaben ausgelegt ist, z. GNU Oktave. – Thor

Antwort

4

Gnuplot ist für Plotting und kleine Arithmetik, das Finden von Spitzen in einem Signal ist eine Signalverarbeitungsaufgabe und Sie brauchen etwas wie GNU Octave, um eine vernünftige Arbeit zu machen. Wenn Sie freq.csv Datei laden und findpeaks() auf sie mit einem plausiblen Wert laufen für MinPeakDistance Sie erhalten:

Found most peaks

Der Code, den ich verwendet, um die oben Plot zu erzeugen:

y = dlmread('freq.csv', ' '); 
[peak_y, peak_x] = findpeaks(y(:,7), "MinPeakDistance", 40); 
plot(y(:,1), y(:,7), y(peak_x,1), peak_y, '.r'); 

Je nachdem, was Sie wollen findpeaks() könnte ausreichen, siehe help findpeaks und demo findpeaks für andere Optionen, die Sie optimieren können.

1

Es ist ein bisschen zwicken aber dieses Beispiel sollte helfen:

y2=y1=y0=NaN 
stat "data/freq.csv" using (y2=y1,y1=y0,y0=$7,(y1>y2&&y1>y0?y1:NaN)) prefix "data" 

nun in der Variablen data_records Sie die COUNT von lokalen Maxima erhalten, sollten Sie in der Spalte haben 7.

Sie über

drucken
print data_records 

mehr zu verstehen, poste ich hier ein Beispiel für die Sinusfunktion

set table 'test.dat' 
plot sin(x) 
unset table 
x2=x1=x0=NaN 
y2=y1=y0=NaN 
plot 'test.dat' using (x2=x1,x1=x0,x0=$1,x1):(y2=y1,y1=y0,y0=$2,(y1>y2&&y1>y0?y1:NaN)) w p, 'test.dat' u 1:2 w l 

Sollte ein Sinus und auch die maximalen Punkte geplottet werden.

Bei mehreren Punkten den gleichen Wert haben:

x2=x1=x0=NaN 
y2=y1=y0=NaN 
plot 'freq.csv' u 0:7 w l, '' using (x2=x1,x1=x0,x0=$0,x1):(y2=y1,y1=y0,y0=$7,(y1>=y2&&y1>y0?y1:NaN)) w p 

oder

plot 'freq.csv' u 0:7 w l, '' using (x2=x1,x1=x0,x0=$0,x1):(y2=y1,y1=y0,y0=$7,(y1>y2&&y1>=y0?y1:NaN)) w p 

je nachdem, welche Seite des Plateaus Sie

Der stat Befehl die Spitze Zahl wollen wird:

stat 'freq.csv' using (y2=y1,y1=y0,y0=$7,(y1>=y2&&y1>y0?y1:NaN)) prefix "data" 
+0

Warum 'sin (x)'? Ich verstehe es nicht, Liebes. Könnten Sie es gemäß meinem Beispielcode in der Frage bearbeiten? Vielen Dank! – Mahsolid

+0

Ich habe die Antwort aktualisiert. Der zweite Teil der Sünde ist nur, um es klar zu machen, denn in Ihrem Datenschnipsel gibt es in Spalte 7 kein lokales Maximum. Aber Sie haben nur einen Weg nach COUNT gesucht, um sie nicht zu plotten. – bibi

+0

Es gibt eine weitere Eigenart in Ihrer Datendatei, es sind durch Kommata getrennte Daten, also müssen Sie dies gnuplot mitteilen: 'set datafile separator ','' – bibi

Verwandte Themen