logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Autokorelacja - wyznaczenie okresu sygnału?

robiw 03 Sty 2010 20:10 4594 5
  • #1 7480180
    robiw
    Poziom 26  
    Witam,
    Mam tablicę spróbkowanego sygnału x[1..200] która zawiera od 2 do 5 okresów badanego przebiegu. Zależy mi na znalezieniu wspomnianego okresu stosując funkcję korelacji lecz mam zapytanie czy taki ogólny zapis jest poprawny:

    x[1..200] - spróbkowany sygnał
    Amax - maksymalna autokorelacja
    Atk - bieżąca autokorelacja
    Index - index wystąpienia maksymalnej autokorelacji

    Procedura znalezienia okresu:

    
     Amax=0
     for i=1 to 200
    
       Atk=0
       for j=1 to 200
         Atk=Atk+[ x(i)*x(j) ]
       next
    
       if Atk>Amax then
         if i≠1 then Index=i
       end if
    
      next
    


    W tym momencie w zmiennej Index powinien znaleźć się index maksymalnej autokorelacji. Ten index pomnożony przez okres próbkowania powinien dać okres przebiegu badanego. Czy dobrze myślę? Z góry serdeczne dzięki za pomoc... robiw
  • #2 7487025
    jarekz_2
    Poziom 16  
    Cytat:
    Czy dobrze myślę? Z góry serdeczne dzięki za pomoc... robiw

    Oj, coś tu jest nie tak! Musisz mnożyć próbki sygnału przez próbki tegoż sygnału przesuniętego o dT, a więc mniej więcej tak (algorytmu nie sprawdzałem!):
    
     Amax=0
     for dT=-100 to +100       // bo w pamięci są co najmniej 2 okresy
       if abs(dT) >= 40 then   // bo w pamięci jest najwyżej 5 okresów
          Atk=0
          for i=1 to 200
            Atk=Atk+[ x(i)*x(i+dT) ]
          next i
          if Atk>Amax then
             Amax = Atk
             dTmax = dT
          end if
       end if
     next dT
    

    Jest to algorytm mocno uproszczony! Brak np. sprawdzania, czy indeks (i+dT) nie wychodzi poza zakres 1...200. Suma Atk prawdopodobnie powinna być jeszcze dzielona przez ilosć iloczynów wchodzących w jej skład, aby znajdowanie jej maksimum miało sens. Radzę Ci trochę poczytać na temat ogólnych metod liczenia autokorelacji. W Internecie powinno być wystarczająco dużo materiału na ten temat.
  • #3 7487276
    robiw
    Poziom 26  
    Witaj,
    No właśnie w tym sęk, że nie znalazłem nic konkretnego co pomogłoby mi to rozpisać na prosty algorytm. Nie wiem czemu miałoby być ograniczenie (w Twoim algorytmie) odnośnie liczby okresów i zakresu liczenia? Rozumiem, że przesunięcia wychodzące poza zakres zbioru próbek pomijam - czyli nic nie dodaję do bieżącej sumy Atk? robiw
  • #4 7500095
    ALL-IN
    Poziom 10  
    Algorytm w środowisku MATLAB (może pomoże autorowi):

    N=ilosc_probek_sygnalu;
    for k=0:N-1
         autokor(k+1)=sum( x(1:N-1).*x(1+k:N) )/(N-k);
    end
    autokor=[ fliplr(autokor) autokor(2:N) ];


    Oczywiście jest to autokorelacja już unormowana.

    xcorr
  • #5 7502671
    robiw
    Poziom 26  
    ALL-IN napisał:
    Algorytm w środowisku MATLAB (może pomoże autorowi):

    N=ilosc_probek_sygnalu;
    for k=0:N-1
         autokor(k+1)=sum( x(1:N-1).*x(1+k:N) )/(N-k);
    end
    autokor=[ fliplr(autokor) autokor(2:N) ];




    Te zapisy wyglądają dla mnie dość obco: 1:N-1, 1+k:N - można prościej? W składni Basica lub podobnej? Rozumiem, że pętla for sumuje elementy od k=0 do k=N-1? Nie rozumiem, gdzie znajduje się druga pętla - sumująca elementy z przesunięciem aby wyznaczyć kolejny element tablicy korelacji? robiw

    PS.
    OK to - "sum( x(1:N-1).*x(1+k:N) )" jest suma iloczynów elementów x[1..N-1] i x[1+k..N] i tu pojawia się problem bo trudno to rozpisać na pętlę for... ale chyba się da ;-)

    Rozumie, że zapis "autokor=[ fliplr(autokor) autokor(2:N) ];" to wyłącznie rysowanie?
  • #6 7515414
    ALL-IN
    Poziom 10  
    Cytat:
    Te zapisy wyglądają dla mnie dość obco: 1:N-1, 1+k:N - można prościej?

    Iteracja od 1 do N z krokiem 1.

    Cytat:
    i tu pojawia się problem bo trudno to rozpisać na pętlę for... ale chyba się da

    Np. 2 pętle, jedna w drugiej.

    Cytat:
    Rozumie, że zapis "autokor=[ fliplr(autokor) autokor(2:N) ];" to wyłącznie rysowanie?

    Nie, fliplr obraca dowolną macierz o jeden w prawo. Jeżeli mamy do czynienia z pojedyńczym wierszem 1 2 3 4 to otrzymamy 4 3 2 1.
REKLAMA