C Einfache Signalanalyse

Gast #2525979
Hallo,
Ich möchte mit meinem AVR ein Signal analysieren. Es handelt sich um 
einen "dreckigen" Sinus. Die Werte Werte stehen in einem Array. Ich 
möchte Periodendauer sowie die Werte der Minimas und Maximas ermitteln.
Bisher glätte ich die Werte mit dem gleitenden Mittelwert und 
"durchsuche" anschließend das Array nach Maximas mit einer if-Abfrage:
1
if(data[i - 1] <= data[i] &&  data[i + 1] <= data[i])
2
//Maxima gefunden
Die Periode ermittel ich mit dem Abstand zwischen zwei gefundenen 
Maximas.
Leider ist das Verfahren sehr ungenau. Um ungewollte Maximas zu 
eliminieren vergleiche ich data[i] mit dem Mittel der Folgewerte. Dies 
bringt zwar Besserung, ist aber immer noch unpräzise.

Wie gehe ich die Sache richtig an?
Nicht dass ihr mich falsch versteht, ich möchte von keinem eine fertige 
Lösung, aber es wäre toll wenn mir jemand den richtigen Weg zeigen 
könnte :-)

Grüße
Wolfgang
Da bei einem Sinus um das Maximum herum in einem recht großen Bereich 
die Steigung nahe Null ist, ist es klar, daß man damit die Periodendauer 
nur sehr ungenau bestimmen kann. Das ist ja genau die Stelle, an der 
sich kleine Abweichungen am stärksten auswirken. Für die Periodendauer 
wären die Nulldurchgänge sicher besser geeignet.

PS: Der Plural von "Maximum" ist "Maxima".
Ich mache nochmal Werbung für das Prony Verfahren:

Beitrag "Re: Phasenverschiebung messen (us Bereich)"

Das geht super. Man kriegt Amplitude/Frequenz/Phase wesentlich genauer 
als durch Abzählen der Nulldurchgänge, besser sogar als mit einer FFT.

Vorgehensweise: man berechnet vom Signal alle Summen aus aus einem Wert 
und dem übernächsten Wert. Trägt man diese Werte gegeneinander im 
Kooerdinatensystem auf ergibt sich eine Gerade. Die Steigung der Geraden 
ist proportional zum Cosinus der Frequenz. Hat man die Frequenz, lassen 
sich Amplitude und Phase bestimmen.

Wolfgang, stell mal deine Daten ein, dann hack ich das mal zusammen.

Cheers
Detlef

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.