Autokorelacja sygnału dyskretnego x(n) o długości N

0

Witam na początku chciałbym zaznaczyć że jestem zielony jeśli chodzi o tego typu teorie ale pisze program w Javie i żeby on był ok muszę zrozumieć zasadę działania jednego wzoru na którym się opieram:
Autokorelacja sygnału dyskretnego x(n) o długości N
R(m)= ∑ x(n) * x(n-m) suma dla n=0 do N ,

no i mam taki problem chce poznać zasadę liczenia autokorelacji żeby dobrze program napisać, a nie jestem do końca pewien czy dobrze ja rozumiem . Na Google same wzory tylko są które mi nic nie mówia a ja potrzebuje rady kogoś kto to liczył.

I teraz powiedzcie czy dobrze myślę generuje losowa liczbę np. m=2 i N=2

no według wzoru robię to tak dla R(m)=0*(0-0)+1*(1-0)+2*(2-0)+0*(0-1)+1*(1-1)+2*(2-1)+0*(0-2)+1*(1-2)+2*(2-2)=6 ???

0

Moim zdaniem pod warunkiem że x(n)= n i m = 2 ja bym to liczył tak

R(m) = 0*(0-0)+1*(1-0)+2*(2-0)+3*(3-2)+4*(4-2)+5*(5-2) ...

problematyczna jest ta częśc gdzie różnica n-m ma wartości ujemne 0*(0-0)+1*(1-0)+2*(2-0)
Oznacza to że dla zbioru wartosci dyskretnych nie masz skąd pobrać wartosci.

0
javauser napisał(a)

Moim zdaniem pod warunkiem że x(n)= n i m = 2 ja bym to liczył tak

R(m) = 0*(0-0)+1*(1-0)+2*(2-0)+3*(3-2)+4*(4-2)+5*(5-2) ...

problematyczna jest ta cześć gdzie różnica n-m ma wartości ujemne 0*(0-0)+1*(1-0)+2*(2-0)
Oznacza to że dla zbioru wartości dyskretnych nie masz skąd pobrać wartości.

ale dlaczego ominąłeś m=1 [???] w obliczeniach, m=2 oznacza przeskok co 2 ? i dlaczego jeśli N=2 następne 3 wyrazy liczysz z kolejnymi n=3,4,5 [???]

mam też pytanie czy skoro przy znaku Sumy jest n=0 do N to m tez jest od m=0..N czy już m=0..M przy czym M generuje losowo jestem zielony z tej korelacji wiec proszę prostym językiem:)

0

Coś w tym wzorze brakuje jakiejś normy. Poza tym najwyraźniej twój wzór zakłada wartość średnią x równą zero.
Może lepiej podaj materiały z jakich korzystasz.

Same rachunki wszystkim powyżej strasznie się pomieszały.

Mniej więcej powinno być to mniej więcej tak (liczenie normy sobie wymyśliłem - tak wiem, że jest nieoptymalnie):

double R(int m, Tablica x)
{
     double sum = 0;
     double norma = 0;
     const int n = min(x.lenght(), x.lenght()+m);

     for (int i=max(0, m);i<n; ++i) {
          sum += x[i]*x[i-m];
          norma +=(x[i]*x[i]+x[i-m]*x[i-m])/2;
     }
     return suma/norma;
}

Dla tablicy int może być trochę zabawy.

0

Witam

Losowanie "m" ( "M" ) czy też "N" nie ma tu nic do rzeczy ( choć w szczególnym przypadku może
być uzasadnione ). Właśnie cały urok autokorelacji polega na tym, że ciąg "x(i)" może przyjmować
zarówno wartości dodatnie, jak i wartości ujemne ( ciąg ten może być np. ciągiem próbek sygnału
na wyjściu przetwornika analogowo - cyfrowego ). Algorytm ten służy do badania powtarzalności
sygnału. Niech "m > 0" ; wówczas mnoży się ciąg 'bieżący' przez ciąg przesunięty ( względem niego )
w czasie. Wówczas uzyskujemy ciąg par - ciąg iloczynów "elementarnych". Niektóre z tych iloczynów
mają znak dodatni ( jeżeli mnożymy próbkę dodatnią przez próbkę dodatnią lub próbkę ujemną przez
próbkę ujemną ), natomiast inne iloczyny mają znak ujemny ( jeżeli mnożymy próbkę dodatnia przez
próbkę ujemną lub próbkę ujemną przez próbkę dodatnią ). Suma takich iloczynów przyjmuje jakąś tam wartość, mniejszą od wartości maksymalnej ( możliwej do osiągnięcia ), ponieważ obecność iloczynów ujemnych zaniża wynik takiego sumowania. Inaczej ma się sprawa, jeżeli "m = 0" ; wówczas mnożymy 'to samo przez to samo', a zatem wszystkie iloczyny przyjmują wartość dodatnią. Wówczas suma takich iloczynów przyjmuje wartość maksymalną ( ponieważ brakuje składników ujemnych, które zaniżałyby wynik sumowania ). Zatem w przypadku sygnału nieokresowego ( "niepowtarzalnego" ), którego reprezentację stanowi ów ciąg próbek, funkcja autokorelacji będzie przyjmowała wartość maksymalną dla względnego opóźnienia równego zeru. Sytuacja staje się ciekawsza, kiedy ów ciąg próbek reprezentuje sygnał okresowy. Jeżeli opóźnienie "m" będzie równe okresowi tego sygnału ( "m = T" ), to dla takiego opóźnienia mamy sytuację identyczną jak dla "m = 0" , ponieważ w takim przypadku również mnożymy "to samo przez to samo" ( próbki ciągu opoźnionego o okres posiadają identyczne wartość jak próbki ciągu "podstawowego" ). Taki jest sens funkcji autokorelacji. Pozwala ona wykryć obecność sygnału okresowego ( np. słabego przebiegu sinusoidalnego ) na tle zakłóceń, np. na tle "niepowtarzalnego" szumu.

                                                            Pozdrawiam
                                                         
                                                                JK
0

moje całe materiały to ten wzór: R(m)= ? x(n) * x(n-m) pod znakiem sumy jest "n=0" a nad nim "N" , mój program nie musi liczyć autokorelacji tak jak to w rzeczywistości jest, chodzi po prostu o samo liczenie przedstawienie idei wykonywania obliczeń dla n=0..N czyli po prostu x(n) przyjmuje kolejne wartości 0..N tylko nie wiem jak to jest z tą zmienna "m" bo podobno ona też nie jest tak po prostu podstawiona pod wzór tylko dąży do jakieś N-tej wartości co daje masę obliczeń. wszelakie dane będą generowane losowo

jakbyście widzieli obliczenie autokorelacji dla danych np. N=3 i m=2 bo ogólnie mój program pisany w Javie będzie przedstawiał obsługę wątków autokorelacja jest tylko po to żeby było dużo obliczeń ponieważ napisałem to w oparciu o strukturę producent-konsument tylko nie mogę zrozumieć zasady działania autokorelacji i nie wiem jak to przedstawić w konsumencie nie wiem jak wygląda algorytm obliczeń autokorelacji. jestem zielony w elektronice i nie wiele rozumiem z opisów o sygnałach.

0

mam jeszcze takie pytanie w jakiej postaci jest przedstawiony wynik autokorelacji jest to jedna liczba czy ciąg liczb analogicznych do tych podanych

0

Witam ponownie

Autokorelacja jest liczbą, jeżeli jest policzona dla pojedynczej wartości "m" ( np. dla "m=0" ) ; jeżeli jest policzona dla całego zbioru wartości 'm', to wówczas staje się funkcją ( zmienną niezależną stanowią właśnie wartość m ).

                                                                                    Pozdrawiam

                                                                                             JK
0

czyli dla ciągu liczb m=0..N:
dla każdego pojedynczego m liczymy wartość z wzoru dla liczb n..N

dla m=0 R(m)= ∑ x(n) * x(n-m) n..N
dla m=1 R(m)= ∑ x(n) * x(n-m) n..N
dla m=2 R(m)= ∑ x(n) * x(n-m) n..N

to jest pętla licząca wzór czyli wystarczy ja jeszcze zapętlić żeby była liczona dla każdego m..N dobrze rozumiem???

while (i<N) {	
			try {
				n= (int)pobierz_n();
				
				k= n*(n-m);
			    W=W+k;
				konsumuj(W,o++);
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			i++;
		}
0

Jeżeli ma być liczona funkcja, to oczywiście trzeba użyć podwójnej pętli, tzn. "pętli w pętli' ;
pętla "zewnętrzna" przewija ten algorytm względem kolejnych wartości "m".

                                                                                    Pozdrawiam

                                                                                             JK
0

I oto mi chodziło wielkie dzięki koniaku czyli założę sobie jeszcze jedną pętle na to żeby liczyło ciąg wartości n..N dla każdego m i gitara. Jeszcze raz wielkie dzięki wszystkim za pomoc.
Pozdro

0

Panowie, autokorelacji tak się nie liczy
Correlation and Autocorrelation Using the FFT

0

Obliczanie autokorelacji poprzez korzystanie z FFT jest tylko możliwością ( jedną z opcji ) ; korzysta się
wówczas z twierdzenia Wienera - Chinczyna. Dotychczas dyskutowaliśmy "bezpośrednie" liczenie autokorelacji.

                                         JK

1 użytkowników online, w tym zalogowanych: 0, gości: 1