Ableitungsberechnung

9

Ich habe eine Reihe von Daten (einzelnes Array). Wenn ich diese Daten nehme und zeichne, kann ich sehen, dass es mehrere Peaks gibt. Wenn ich jedoch einen Datenabschnitt vergrößere, sehe ich, dass es zu erheblichem Rauschen kommt.

Ich möchte mit wenig CPU-Zeit und Energie erkennen, wie viele Peaks in den Daten vorhanden sind. Ich dachte daran, die Steigungen dieser Spitzen zu erkennen (könnte scharf oder gleichmäßig ansteigen oder abfallen) und die Anzahl der Steigungen zu betrachten, um die Anzahl der Spitzen zu bestimmen. (2 Steigungen positiv und negativ für jeden Peak)

Gibt es Hinweise, wie ich die Steigungen bei Lärm berechnen kann?

Der Code wird in ein eingebettetes System eingegeben, der Speicher ist begrenzt, daher möchte ich vorzugsweise etwas implementieren, für das keine signifikante Datenkopie erforderlich ist.

Ktuncer
quelle
1
Sie klingen wie in einem Geschäft, das nach etwas fragt, das Sie brauchen
2
Wenn das Rauschen eine relativ hohe Frequenz hat, können Sie die Daten tiefpassfiltern
Paul R
4
Können Sie ein oder mehrere Beispieldiagramme Ihrer Daten veröffentlichen? Das wird uns helfen zu sehen, wie es aussieht. Die Spitzenwerterfassung erfolgt normalerweise nicht über eine Ableitungsschätzung, da die Berechnung der Ableitung eines Signals sehr rauschempfindlich ist (es handelt sich um eine Hochpassoperation). Das interessierende Signal kann Merkmale aufweisen, die Sie ausnutzen können. Außerdem gibt es immer einen Kompromiss zwischen der Wahrscheinlichkeit, einen Peak korrekt zu erkennen, und der Wahrscheinlichkeit, einen Peak fälschlicherweise zu deklarieren, der wirklich nicht von Interesse ist. Was ist für Ihre Bewerbung wichtiger?
Jason R
2
Wenn Sie eine Handlung erstellen können, wäre dies hilfreich.
Jason R
1
Wenn Sie Peaks erkennen möchten, möchten Sie möglicherweise nach Peaks suchen (siehe dsp.stackexchange.com/questions/1302/peak-detection-approach ).
Geerten

Antworten:

1

Dies hängt von der Art des Rauschens und der Art des Signals ab. Zeigen Sie ein Beispiel, wenn Sie eine gute Antwort wünschen. Im Allgemeinen möchten Sie das Signal jedoch wahrscheinlich tiefpassfiltern. Wenn ich Sie wäre, würde ich ein Fourier-Leistungsspektrum nehmen, um zu sehen, ob der größte Teil des Rauschens hochfrequent ist und das Signal, das mir wichtig ist, hauptsächlich in einem niedrigeren Bereich liegt. Wenn sie sich überschneiden, ist das das Leben. Ich müsste mehr über Dinge nachdenken.

Ein Tiefpassfilter, der in vielen Fällen für verrauschte Signale geeignet ist, ist das Savitzky-Golay-Filter. Es wird in Numerical Recipes beschrieben, und für Python gibt es eine Funktion im Python Numpy Cookbook. Es ist nur eine Faltung mit einem kleinen Kernel. Sie wählen die Fenstergröße basierend auf der Breite der Peaks oder anderer Features aus, die breit genug sind, um das Rauschen zu unterdrücken, aber nicht breiter als die Features. Es kann klein sein, sagen wir fünf Punkte, oder größer wie Dutzende, vielleicht hundert.

Sie wählen auch eine Polynomreihenfolge - normalerweise verwende ich 2 oder 4. Ordnung 2 ist in Ordnung, wenn das Fenster klein ist, <10 Punkte oder weniger als einen halben Zyklus umfasst (wenn Ihr Signal einem Sinus ähnelt), während Ordnung 4 ist Besser bei der Anpassung verzerrter Peakformen, hat aber gerne 9 oder mehr Punkte. Viel hängt jedoch von der Form und Frequenz des Geräusches ab.

Wie andere in den Kommentaren sagen, ist das Finden von Derivaten wahrscheinlich nicht die beste Strategie, aber wenn Sie trotzdem Derivate finden möchten, kann der Savitzky-Golay-Filter dies tun - gleichzeitig das Derivat anstelle des Signals glätten und melden.

DarenW
quelle