Signalvergleich

  • Hallo Community,

    ich muss für meine Abschlussarbeit Zwei Signale(gleicher Länge unterschiedliche Amplituden, Phasen und Frequenzen) mit einander vergleichen...

    Zeit oder Frequenzbereich?

    Kreuzkorrelation?

    hat jemend da schon eine Erfahrung??

  • Kommt ja drauf an, was es für Signale sind; was deren Charakteristik ist und was das Ziel des Vergleiches ist.


    Man kann auch statistische Größen (Minimum, Maximum, Peak-To-Peak, RMS) miteinander vergleichen.

    Mit einer Kreuzkorrelation kann man sicher etwas über die Ähnlichkeit der Signale sagen.

    Mittels geeigneter FFT lässt sich die Frequenzverteilung vergleichen.


    Fraglich ist auch, ob die Signale normiert werden dürfen. Entweder in Relation zu einem bestimmten Wert oder auf ihr eigenes Maximum.

    Dann kann man ebenfalls obige Vergleiche anwenden.

  • vielen Dank für die schnelle Antwort!

    Meine Signale sind eigentlich row data, sie ertragen also normierungen um Rauschen zu entfernen.

    Eine Idee bzw. ein erster Schritt wäre auch vorm Vergleich, das Signal in kleinen Bereichen zu zerlegen und diese mit die entsp Bereiche vom Mustersignal zu vergleichen. Meine Weitere Frage ist dann folgendes: wie kann man ein Signal automatisch in verschiedenen Intervallen abschneiden?

    Ich habe es bereit mit den Funkionen Gren und suchpegel probiert (Die Grenzpunkte habe ich visuel bestimmt.. was sehr ungünstig war!)



  • Also zum Unterteilen in Intervallen brauchst du ja irgendein Kriterium. Sei es eine zeitliche Unterteilung (Gren/cut) oder mit Hilfe eines Pegels (SuchePegel/SearchLevel).

    Ich glaube ab der FAMOS 7.2 sind auch Intervall-Funktionen hinzugekommen u.a. IntervalFromLevel.


    Stell dir selbst die Frage, wie du die Grenzpunkte visual festgelegt hast. Wie bist du da vorgegangen? Und versuche das dann in einer Sequenz (in Code) zu berechnen.

  • Danke nochmal für die Antwort!

    Also ich suche die Krümmungen und sie erstallen so zu sagen meiene Intervallgrenzen... jetzt habe ich einen Syntaxproblem mit dem Anwenden der Indexen (Für Arrays!! )... Das Programm sieht folgendes aus:

    Signal_Länge= lang?(PA)
    index1=0
    index2=0

    while index1 < Signal_Länge

       erste_Ableitung[index1]= diff(PA[index1]) ; 1.Fehler
       zweite_Ableitung= diff(erste_Ableitung(index1)); 2.Fehler

        wenn zweite_Ableitung = 0 
        
           Krümmung= zweite_Ableitung

           Interval(index2)=Gren(PA, index2, Krümmung)

          index2= index2+Interval(index2)

         ENDE

       index1= index1+1

     ENDE
    Hätten Sie vielleicht eine Idee wie ich die Zwei Fehlerzeilen verbessern kann?

  • Also erstmal gibt es in FAMOS 7.x auch FOR-Schleifen. Und später auch "foreach" Schelifen


    Du wendest die diff-Funktion auf einen Einzelwert an. Das funktioniert nicht.


    Code
    1. ; außerhalb der Schleifeerste_Ableitung = diff(PA)
    2. zweite_Ableitung = diff(ersteAbleitung)

    Zu gucken, ob die zweite Ableitung exakt null ist, halte ich für schwierig. Rein rechnerisch wird da eher selten exakt null rauskommen.

    Daher würde ich schauen, dass der Absolutbetrag der zweiten Ableitung ein Epsilon unterschreitet. Wie groß das Epsilion ist, hängt natürlich von der Skalierung ab.

    Hier hilft wieder SuchePegel, PosiEx, PosiEx2 oder ähnliche Funktionen.


    "Interval(index2)" halte ich für einen ungütigen Ausdruck auf der linken Seite. Zum anderen müsste "Interval" erstmal definiert sein.

    Aber auch wenn hier eckige Klammern sind. Du schneidest einen Bereich aus und willst ihn aneinen einzelnen Wert zuweisen.


    Ansonten kann ich natürlich auch Schulungen empfehlen:

    https://www.imc-tm.de/service-…academy/terminuebersicht/

  • Hallo aybabtu,

    vielen Dank nochmal für die Tipps. Ich habe meinen Code verbessert, allerdings bin ich wieder auf ein Problem gestoßen(Signalzerlegung).

    So sieht mein Code aus :

    ;Automatische Eventierung
    ;Referenzsignal PA zur verschiedenen Blocks abschneiden
    ;Methode: Maxima und Minima Manipulation
    ;Referenzsignal aus dem Rohsignal extrahieren
    PA_Länge= lang?(PA)
    Start_Ref = 4's'
    Ende_Ref = 18's'
    Referenz= Gren(PA, Start_Ref ,Ende_Ref)
    Referenz_Länge= Lang?( Referenz)
    Referenz_Butterworth= filtlpz(Referenz , 0, 0, 8, 10)
    Referenz_Butterworth_Tast1_Länge= Lang?( Referenz_Butterworth)


    ; Suche: Block 1
    y_Maximum=Max( Referenz_Butterworth)
    x_Maximum= PosiEx (Referenz_Butterworth, y_Maximum )
    Block1= Gren(Referenz_Butterworth,Start_Ref, x_Maximum)


    ; Suche: Block 2
    Block1_Länge= Lang?( Block1)
    Block23= Gren(Referenz_Butterworth, x_Maximum ,ende_Ref )
    Block23_Länge= Lang?( Block23)
    index1=1
    X_rMaxima= Xmaxi( Block23,x_Maximum )
    X_rMaxima_Länge= Lang?( X_rMaxima)
    Start_Block2= x_Maximum
    Stop_Block2= X_rMaxima[X_rMaxima_Länge]
    Block2= Gren(Block23, Start_Block2, Stop_Block2 )


    ; Suche: Block 3
    Block3= Gren(Block23, Stop_Block2, Ende_Ref)


    ; Suche: Block 1/Teil 1
    Block1_dttt= diff(filtlpz(diff(filtlpz(median(Referenz_Butterworth ,99),0,0,8,10)),0,0,8,10))
    start1= Start_Ref
    for index=1 to Lang?(Block1_dttt)-1
       if abs(Block1_dttt[index])< 0.002
          wPunkt= PosiEx( Referenz_Butterworth, Block1_dttt[index])
          VarName = "Block1_" + tform(index,"") + "_" + tform(index+1,"")
          <varname> = gren(Referenz_Butterworth, wPunkt[index], wPunkt[index+1])
       end 
    end
          

  • 1) erledigt

    2) Fehler : <varname> = gren(Referenz_Butterworth, wPunkt[index], wPunkt[index+1])

    3) 3. Parameter der Gren Funktion ist kein Einzelwert

    Das gewünschte Ergebnis ist angehängt.

    wie findest du die logik überhaupt bzw. wie würdest du ein Signal klein zerlegen ?



  • Code
    1. Block1_dttt= diff(filtlpz(diff(filtlpz(median(Referenz_Butterworth ,99),0,0,8,10)),0,0,8,10))

    Sowas liest sich sehr schlecht. Ich kann nur erahnen, dass es der erste Block einer dritten Ableitung ist.

    Du kannst auch Untersequenzen benutzen und diese dann aufrufen. Oder oder.

    ---

    Mit PosiEx erhälst du eine bestimmte Anzahl an x-Werten.

    Du greifst aber mit einer anderen Laufvariablen (index) auf diese zu.

    Hast du hier sicher gestellt, dass du auch die benötigte Anzahl hast? Es mag sein, dass es hinhaut, kann aber auch sein, dass der Index wegläuft - auch wenn dann die Fehlermeldung anders wäre.


    Hast du dir mal den Datensatz wPunkt im Dateneditor angesehen? Die Eigenschaften untersucht? Etc.?


    Alles in allem habe ich auch den Überblick verloren. Sorry. :-D