Ayrık bir sinyalin periyodik olup olmadığını nasıl belirlerim?


12

Bir dizi verinin periyodik olup olmadığını nasıl belirleyebileceğimi bilmek istiyorum.

Fourier dönüşümünü / serisini kullanmak istiyorum. Verilerim ya periyodik değil

[111100001111000110010101010000101]

veya periyodik

[11001100110011001100]

ve hangisinin otomatik olduğuna karar vermeliyim. Bir sinyalin periyodik olup olmadığını belirlemek için ne tür analizler veya hesaplamalar yapabilirim?

Yanıtlar:


14

Periyodikliği belirlemek için normalleştirilmiş bir otokorelasyon yapardım . periyodu ile periyodikse, sonuçtaki her P örneğinde pikler görmelisiniz . "1" in normalleştirilmiş bir sonucu mükemmel periyodiklik anlamına gelir, "0" o dönemde hiç periyodiklik anlamına gelmez ve kusurlu periyodiklik arasındaki değerler anlamına gelir. Otokorelasyon yapmadan önce veri dizisinin ortalamasını veri dizisinden çıkarın, çünkü sonuçlara ağırlık verir.PP

Tepe noktaları, üst üste binen daha az örneğe sahip oldukları için aldıkları merkezden uzaklaştıkça azalacaktır. Sonuçları çakışan örneklerin yüzdesinin tersi ile çarparak bu etkiyi azaltabilirsiniz.

buradaU(n)önyargısız otokorelasyon,A(n)normalleştirilmiş otokorelasyon,nofset veNveri dizisindeki periyodikliği kontrol ettiğiniz örnek sayısıdır.

U(n)=A(n)N|Nn|
U(n)A(n)nN

DÜZENLEME: Bu, dizilerin periyodik olup olmadığını anlamanın bir örneğidir. Aşağıdaki Matlab kodu.

s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
plot(xcorr(s1n, 'unbiased'))

Xcorr işlevinin "nötr" parametresi, yukarıdaki denklemimde açıklanan ölçeklendirmeyi yapmasını söyler. Ancak, otomatik korelasyon normalleştirilmemiştir, bu nedenle merkezdeki tepe 1 yerine 0.25 civarındadır. En dıştaki kenarlar dışında karşılık gelen başka zirve olmadığını görüyoruz. Bunlar önemli değil çünkü üst üste binen sadece bir örnek var, bu yüzden anlamlı değil.

Düzenli olmayan

s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
plot(xcorr(s2n, 'unbiased'))

Burada dizinin periyodik olduğunu görüyoruz, çünkü merkez pik ile aynı büyüklükte çok sayıda nötr otokorelasyon tepe noktası var.

Periyodik


3
A(n)

1
@PeterK İyi bir nokta.
Jim Clay

Hey Jim, teşekkürler ... Bunu programlamaya nasıl başlayacağım konusunda biraz kafam karıştı, çünkü otokorelasyon hakkında her arama yaptığımda karmaşık formüller bulduğumda, gerçekten nereden başlayacağımı ve koddaki P periyodu ile zirveyi nasıl tespit edeceğimi bilmiyorum. . Benimle V değer değerlerinin bir listesi var [] = {110011001100 ..} Şimdi onları otokorelasyon formüllerine nasıl koyacağım ve periyodik olup olmadığını nasıl belirleyeceğim ... Lütfen bana biraz kolay bir başlangıç ​​yapabilir misiniz ... Çok teşekkürler
safzam

@safzam Matlab veya Python (numpy) kullanıyorsanız, otokorelasyon fonksiyonları zaten vardır. C / C ++ / Java / neyse bir şeye ihtiyacınız varsa, buradan deneyin- dsprelated.com/showmessage/59527/1.php
Jim Clay

Örneğin şu iki sinyali kullandım s1 ans s2: s1 = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1] s2 = [1, 0, 1, 1, 1, 0 , 1, 0, 0, 0, 1] r1 = numpy.correlate (s1, s1, mode = 'full') r2 = numpy.correlate (s2, s2, mode = 'full') Bu dört satırı bir python kodu. R1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] ve r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] hem r1 hem de r2, şekil gibi aynı gökkuşağı eğrisini verir .. Kodda bir sinyalin peroidc veya neredeyse periyodik olduğunu veya hiç periyodik olmadığını nasıl belirleyebilirim, teşekkürler
safzam

4

Jim'in cevabı bana bunu istatistiksel olarak nasıl test edeceğimi düşündürdü. Bu beni Durbin-Watson otokorelasyon testine götürdü .

Genelleştirilmesi:

DW(τ)=n=τN1[U(n)U(nτ)]2n=0N1U(n)2

ve bunu scilab'da uygulama girişimim:

// http://en.wikipedia.org/wiki/Durbin%E2%80%93Watson_statistic
s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
xs1 = xcorr(s1n,"unbiased");
N1 = length(xs1);

s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
xs2 = xcorr(s2n,"unbiased");
N2 = length(xs2);

dwstat1 = [];
dwstat2 = [];

for lag = 1:15,

    dxs1 = xs1((lag+1):N1) - xs1(1:(N1-lag));
    dxs2 = xs2((lag+1):N2) - xs2(1:(N2-lag));


    dwstat1 = [dwstat1 sum(dxs1.^2) / sum(xs1.^2)];
    dwstat2 = [dwstat2 sum(dxs2.^2) / sum(xs2.^2)];

end;

DW(τ)τ

İki örnek dizimiz için sonucu çizersem:

resim açıklamasını buraya girin

Daha sonra, ikinci sekansın 4, 8, vb. Gecikmelerde korelasyon ve 2, 6 vb. Gecikmelerde anti-korelasyon gösterdiği açıktır.

DW(τ)


bu bilgi için teşekkürler. Infact Python 0 ve 1 lerin bir sürü listesini almak bir program yapıyorum. Periyodik, rastgele, seri çekim serilerini ayırmak istiyorum. Yukarıdaki mantığı python'da deniyorum ama "xcorr" işlevi python'da değil, sonra numpy.correlate (lst, lst, mode = 'full') işlevini kullandım. Ayrıca listeler yuvarlak 70.000 0s ve 1s listesi içerir .. Ben sadece bu listenin periyodik olup olmadığını belirlemek istiyorum ... Eğer biraz un periyodiklik varsa ben bunu önleyebilirsiniz. başka ipucu plz. şimdiden teşekkürler.
safzam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.