Mustererkennung mit Hilfe der Kreuzkorrelation

  • Hello Community,


    Sei 2 Signale: Referenz PA und Messung PA_1

    um die Ähnlichkeit zwischen diese beiden Signale zu überprüfen habe ich:

    1- Das Referenzsignal in kleinen Abschnitten zerlegt

    2- Eine Schleife durchgeführt, in dem ich-Mit Hilfe der CorrCoeff- nach jedem Referenzabschnitt bei den anderen Signal suche

    (Warum nicht direkt vergleichen? Es geht darum diese kleine Verläufe in einen nächsten Schritt genauer auszubewerten)

    Anbei ist mein Code, es funktioniert nicht..noch nicht wie erhoff.!

    Falls Sie dieses Thema interessant finden , würde ich mich darüber freuen, wenn Sie damit für ein paar Minütchen bechfätigen und Feedback/ Ideen mit uns teilen.

    Sig= filtlpz(PA , 0, 0, 8, 10)
    StartW= 5.5
    RefAbschnitte= GrNew()
    EndW= 20
    Sig= Gren(Sig, StartW, EndW)
    Sig_Absch_1=Gren(Sig, StartW, 6.5)
    GrKanalAdd( RefAbschnitte, Sig_Absch_1 )
    Sig_Absch_2=Gren(Sig, 6.5, 7)
    GrKanalAdd( RefAbschnitte, Sig_Absch_2 )
    Sig_Absch_3=Gren(Sig, 7, 9)
    GrKanalAdd( RefAbschnitte, Sig_Absch_3 )
    Sig_Absch_4=Gren(Sig, 9, 9.5)
    GrKanalAdd( RefAbschnitte, Sig_Absch_4 )
    Sig_Absch_5=Gren(Sig, 9.5, 12.4)
    GrKanalAdd( RefAbschnitte, Sig_Absch_5 )
    Sig_Absch_6=Gren(Sig, 12.4, 12.6)
    GrKanalAdd( RefAbschnitte, Sig_Absch_6 )
    Sig_Absch_7=Gren(Sig, 12.6, 16.5)
    GrKanalAdd( RefAbschnitte, Sig_Absch_7 )
    Sig_Absch_8=Gren(Sig, 16.5, EndW)
    GrKanalAdd( RefAbschnitte, Sig_Absch_8 )
    Messung= filtlpz(PA_1 , 0, 0, 8, 10)
    Messung= Gren(PA_1, StartW, EndW )


    for index=1 to 8 
       A=RefAbschnitte:[index]
       for i=1 to lang?(Messung)-lang?(A)
          TeilStart= posi(A,A[i])
          DeltaT= posi(A,A[lang?(A)])
          Teil= Gren(Messung, TeilStart, DeltaT
          Erg = "Erg_"+tform(index,"")+"_"+tform(i,"")
          <Erg> = CorrCoeff(A,Teil)
          TeilStart= DeltaT 
             if <Erg> >= 0.8
                   MessAbschnitt= "Match_Abschnitt"+tform(index,"")+"Ab_Index_"+tform(i,"")

                   <MessAbschnitt>= Teil       
             else
                   i=i+1
            end
       end
    end



          

       

  • Zitat

    es funktioniert nicht..noch nicht wie erhoff.!

    Was genau ist dein Ziel bzw. deine Erwartung und was genau ist das Ergebnis?
    Wenn Fehler auftauchen, wie lautet die Meldung?


    Falls nicht geschehen würde ich das Zerteilen in Abschnitten in einer Untersequenz durchführen.

    Das macht den Code übersichtlich.

  • In der for-Schleife...

    was genau soll "A" sein? -> CurrentSegment


    Warum wird dann eine weitere Schleife von 1 bis der Längendifferenz gebildet?

    Ich dachte, die Abschnitte sollten jeweils mit einem anderen Signal verglichen werden.

    Hier kenne ich aber den Anwendungsfall nicht.

    Ebenso ändert sich die Längendifferenz während der inneren Schleife nicht.

    Daher würde ich eine weitere Zeile

    deltaSignalLength = lang?(Messung) - lang?(A) einführen.


    TeilStart = posi(A, A[i]) ist nichts anderes als i*xdel?(A) bzw. die aktuelle Zeit -> currentTime

    DeltaT: hier kann ich kein 'delta' erkennen. Es ist "fast" die zeitliche Dauer des Signals -> duration


    Okay, mit den beiden zeitlichen Punkten zerschneidest du das andere Signal.

    Teil -> measurementSegment


    Erg -> CoefficientName


    Warum wird dann TeilStart auf DeltaT gesetzt?

    Es wird nicht am Anfang der Schleife abgefragt, sodass ein "verrücken" notwendig wäre.

    Ebenso sehe ich nicht, dass es im folgendem Verlauf benutzt wird.


    Alles in allem würde ich die Variablennamen überdenken, damit klar ist, wofür diese Variable da ist.

  • Was genau ist dein Ziel bzw. deine Erwartung und was genau ist das Ergebnis?
    Wenn Fehler auftauchen, wie lautet die Meldung?


    Falls nicht geschehen würde ich das Zerteilen in Abschnitten in einer Untersequenz durchführen.

    Das macht den Code übersichtlich.

    Ziel ist für jeden Abschnitt im Referenzsignal seinen ähnlichen im Messsignal rauszusuchen.

    Ich bekomme gar keine Fehlermeldungen, aber ein Denkfehler ist vielleicht drin, dass nur der erste Abschnitt rausgeschnitten wird und der rest wird vernachlässigt. (zum Test habe ich extra sehr ähnlichen Signalen ausgesucht)