Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TeeChart Peak-Erkennung (https://www.delphipraxis.net/211082-teechart-peak-erkennung.html)

norwegen60 26. Jul 2022 06:19

TeeChart Peak-Erkennung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

gibt es eine einfache Möglichkeit in einer Messkurve Peaks zu erkennen und bei diesen z.B. deren Werte mit einem Mark zu versehen. Da es eine Messkurve ist, liegt auch ein Rauschen vor. Es müsste also die Möglichkeit geben, die Empfindlichkeit einzustellen. Gewünscht ist so was wie im Anhang dargestellt.
Ich habe eine Lösung wo ich die Peaks per 1. Ableitung = 0 erkenne und dann bei den Nicht-Peaks die Marks mit
Delphi-Quellcode:
chChart.Series[0].Marks[i].Visible := False;
abschalte. Es ist aber je nach Messwerten nicht ganz einfach, die Sensitivität einzustellen. Vielleicht gibt es ja aber was von der Stange.

Grüße
Gerd

Andreas13 26. Jul 2022 09:57

AW: TeeChart Peak-Erkennung
 
Hallo Gerd,
wenn die X-Werte (in Deinem Fall die Wellenlänge) äquidistant (gleichabständig) wären, kann man die Meßdaten mit der Methode von

Savitzky, A. und Golay, J. (1964): Smoothing and Differentiation of Data by Simplified Least Squares Procedure. Analytical Chemistry 36 (1964) p. 1627 – 1639.

zunächst glätten, um das Rauschen zu unterdrücken und danach die Peaks relativ einfach und sicher bestimmen. Die Savitzky-Methode kann auch die 1. und 2. Ableitungen liefern. Bei geglätteten Kurven scheint mir jedoch eine einfache Überprüfung der Monotonie der Kurve schneller: Ein Peak liegt vor, wenn benachbarte Werte nicht mehr größer (oder kleiner) sind.

Grüße
Andreas

norwegen60 26. Jul 2022 10:28

AW: TeeChart Peak-Erkennung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich mache die 1. Ableitung jetzt schon mit Savitzky, A. und Golay :).
Trotzdem brauche ich noch eine zusätzliche Sensitivität. Nur das glätten mit Savitzky reicht nicht

Die Darstellung in TeeChart ziert sich auch noch ein bisschen. Keine Ahnung warum von den Peaks rechts keiner gemarkt wird. Erkannt werden sie korrekt

Andreas13 26. Jul 2022 10:33

AW: TeeChart Peak-Erkennung
 
Hi Gerd,
man kann (soll) je nach Rauschen der Daten den Savitzky-Golay-Filter mehrmals hintereinander laufen lassen.
Könntest Du evtl. Testdaten zur Verfügung stellen?
Grüße, Andreas

norwegen60 26. Jul 2022 11:01

AW: TeeChart Peak-Erkennung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Andreas,

wenn ich das Averaging übertreibe, gehen eng beieinander liegende Peaks unter, aber er findet über 1000 immer noch Peaks
Ich habe deshalb zusätzlich zu Derivation (Wechsel von - nach +) noch eine Mindestdifferenz drin.
Im Beispieldaten muss Differenz min 75 sein um die gelisteten Peaks zu finden
Differenz berechene ich über Min/Max-Werte so dass ich sie normieren von 0..100 normieren kann

Grüße
Gerd

Andreas13 26. Jul 2022 17:06

AW: TeeChart Peak-Erkennung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Gerd,
inzwischen konnte ich ein wenig mit Deinen Daten experimentieren. Anbei einige meiner gewonnenen Erkenntnisse als Zwischenstand:

1):
Die Wellenlängen sind nicht ganz äquidistant (s. Anhang). Der Savitzky-Golay-Algorithmus basiert jedoch auf dieser Annahme.
Minimale Schrittweite = 0,40; Maximale Schrittweite = 0,60; Maximale Differenz der Schrittweite = 0,20.
Wir können die Methode etwas großzügiger Weise trotzdem anwenden. Wir machen bei der Anwendung etwas größere Fehler als üblich wären.

2):
Ich verwende einen "Glättungsgrad = 1": d. h. 5 benachbarte Punkte. Das ist die minimale Option beim Savitzky-Golay-Filter. Das Maximum wäre 17 Punkte = Glättungsgrad = 7.
Ein höherer Glättungsgrad killt die Peaks, also bleiben wir bei Glättungsgrad = 1.

3):
Zur Rauschunterdrückung habe ich mit verschiedenen Werten experimentiert:
SoOft = 1 ... 1000-mal.

Je öfter der SG-Filter angewandt wird, desto weniger ist das Rauschen, aber eventuell relevante Peaks können verschwinden.
Die gefundenen Peaks sind bei
SoOft = 0: --> 271 Peaks
SoOft = 1: --> 154 Peaks
SoOft = 10: --> 66 Peaks
SoOft = 20: --> 54 Peaks
SoOft = 30: --> 47 Peaks
SoOft = 100: --> 36 Peaks
SoOft = 500: --> 20 Peaks
SoOft = 1000: --> 11 Peaks
Einige Diagramme sind im Anhang (Holmium.zip) zu sehen.

Allerdings habe ich die Peaks nicht über die 1. Ableitung bestimmt, sondern durch folgenden einfachen Vergleich dreier benachbarter Punkte der mehrfach geglätteten Meßdaten-Kurve in Excel:
Code:
Public Function Peak(xa#, xb#, xc#, ya#, yb#, yc#)
 Dim Faktor#
 Dim Res#

 Faktor = 1.002    ' d.h. ein Peak in der geglätteten Kurve muß mindestens 0,2% größer sein als seine beiden Nachbarn
 If (ya * Faktor <= yb) And (yb >= yc * Faktor) Then Peak = xb Else Peak = ""
End Function
Durch den Faktor läßt sich die Anzahl der Treffer stark beeinflussen. Das Ergebnis ist allerdings noch unbefriedigend und bin noch am Überlegen, wie man das Ganze verbessern könnte.

Einige Ideen:

a):
Obige VBA-Routine zur Peak-Bestimmung auf noch mehr Nachbarpunkte erweitern, um noch vorhandene zufällige Schwankungen auszufiltern.

b):
Die 2. Ableitung verwenden: Die Nullstelle der 1. Ableitung ist bekanntlich identisch mit dem Extremwert der 2. Ableitung: d.h. positive und negative Peaks (d.h. die Absolut-Werte) zusammenzählen.

c):
Beim Glätten Gewichte verwenden (?)

d):
Neben den Peaks auch die Täler (Mulden) bestimmen und einen normierten Schwellenwert für eine signifikant anzusehende relative Peak-Höhe zu den Nachbar-Peaks definieren, damit nicht jeder kleine "Huckel" als Peak angesehen wird.

Im Beitrag Choosing the optimal parameters for a Savitzky–Golay smoothing filter unter https://nirpyresearch.com/choosing-o...othing-filter/ ist eine Methode zur Wahl der "optimalen Parameter" der Savitzky–Golay-Filter beschrieben, allerdings habe ich die Methode noch nicht verstanden und kann sie auch nicht anwenden... :oops:

Vielleicht hast Du weitere Ideen.

Grüße
Andreas

Andreas13 29. Jul 2022 08:48

AW: TeeChart Peak-Erkennung
 
Hello again,

der Teufel steckt bekanntlich immer im Detail: Eine halbwegs sichere Erkennung von Peaks in Chromatogrammen etc. ist gar nicht so einfach und recht aufwendig.

Ich habe auf ResearchGate https://www.researchgate.net/ zahlreiche Fachartikel zum Thema Peak Recognition gefunden. An dieser Stelle nenne ich nur drei frei zugängliche Beiträge, neben vielen kostenpflichtigen. Aber diese reichen aus meiner Sich bereits aus, um die Problematik und die Tücken der Peak-Erkennung zu verdeutlichen. Möglicherweise kannst Du daraus eine "abgespeckte" aber immerhin akzeptable "ShortCut"-Methode entwickeln und diese in Deine Programme einbauen.

1):
Random Subwindows for Robust Peak Recognition in Intracranial Pressure Signals (2008)
https://www.researchgate.net/publica...essure_Signals

2):
Analysis of Uncertain - Data Smoothing of Histograms (2009)
https://www.researchgate.net/publica..._of_Histograms

3):
Robust Peak Recognition in Intracranial Pressure Signals (2010)
https://www.researchgate.net/publica...essure_Signals

Leider kann ich mich im Moment mit dem Thema der Peak Recognition nicht weiter befassen, weil ich meine frische Corona-Infektion (trotz 3 Impfungen & Vorsichtsmaßnahmen :wall:) auskurieren muß. :(

Grüße & viel Erfolg
Andreas

norwegen60 29. Jul 2022 11:37

AW: TeeChart Peak-Erkennung
 
Hallo Andreas,

ich sauf im Moment gerade mit zwei anderen Themen ab udn muss deshalb das Peak-Thema etwas hinten an stellen. Grundsätzlich war die Frag eja auch eher, ob es Bordmittel in TeeChart gibt, aber da bin ich mir mittlerweile sicher, dass es die nicht gibt.

Trotzdem vielen Dank für deine Unterstützung. Ich werde mir die Links anschauen

Grüße
Gerd

PS: Und gute Besserung. Bin auch gerade wieder genesen nach.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz