Bagaimana saya menentukan apakah sinyal diskrit itu periodik atau tidak?

12

Saya ingin tahu bagaimana saya bisa menentukan apakah serangkaian data periodik atau tidak.

Saya ingin menggunakan transformasi / seri Fourier. Data saya terlihat aperiodik

[111100001111000110010101010000101]

atau berkala

[11001100110011001100]

dan saya perlu memutuskan mana yang secara otomatis. Jenis analisis atau perhitungan apa yang dapat saya lakukan untuk menentukan apakah suatu sinyal periodik atau tidak?

safzam
sumber

Jawaban:

14

Saya akan melakukan autokorelasi yang dinormalisasi untuk menentukan periodisitas. Jika periodik dengan periode Anda akan melihat puncak di setiap sampel P dalam hasil. Hasil normal dari "1" menyiratkan periodisitas sempurna, "0" tidak menyiratkan periodisitas sama sekali pada periode itu, dan nilai-nilai di antaranya menyiratkan periodisitas yang tidak sempurna. Kurangi rata-rata urutan data dari urutan data sebelum melakukan autokorelasi karena akan membiaskan hasilnya.PP

Puncak akan cenderung semakin jauh dari pusat yang mereka dapatkan hanya karena memiliki lebih sedikit sampel yang tumpang tindih. Anda dapat mengurangi efek itu dengan mengalikan hasilnya dengan kebalikan dari persentase sampel yang tumpang tindih.

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

EDIT: Ini adalah contoh bagaimana cara mengetahui apakah urutannya periodik. Berikut ini adalah kode Matlab.

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'))

Parameter "tidak bias" ke fungsi xcorr memberitahukannya untuk melakukan penskalaan yang dijelaskan dalam persamaan saya di atas. Korelasi otomatis tidak dinormalisasi, itulah sebabnya mengapa puncak di pusat sekitar 0,25 dan bukannya 1. Namun, itu tidak masalah, asalkan kita tetap ingat bahwa puncak pusat adalah korelasi sempurna. Kita melihat bahwa tidak ada puncak lain yang sesuai kecuali di ujung terluar. Itu tidak masalah karena hanya ada satu sampel yang tumpang tindih, sehingga tidak bermakna.

Non-periodik

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'))

Di sini kita melihat bahwa urutannya periodik karena ada beberapa puncak autokorelasi yang tidak bias dengan besaran yang sama dengan puncak pusat.

Berkala

Jim Clay
sumber
3
A(n)
1
@PeterK Poin bagus.
Jim Clay
Hei Jim, terima kasih .. Saya agak bingung bagaimana memulai pemrograman ini, karena di mana pun saya mencari tentang autokorelasi, saya menemukan rumus yang rumit, saya tidak benar-benar mendapatkan ide dari mana memulai dan bagaimana mendeteksi puncak dengan periode P dalam kode. . Dengan saya, saya memiliki daftar nilai V [] = {110011001100 ..} sekarang bagaimana menempatkannya dalam formula autokorelasi dan menentukan apakah periodiknya atau tidak ... Bisakah Anda memberi saya sedikit permulaan yang mudah ... Terima kasih banyak
safzam
@safzam Jika Anda menggunakan Matlab atau Python (numpy), mereka sudah memiliki fungsi autokorelasi. Jika Anda membutuhkan sesuatu di C / C ++ / Java / apa pun, maka coba di sini- dsprelated.com/showmessage/59527/1.php
Jim Clay
Misalnya saya menggunakan dua sinyal s1 ans s2 berikut: s1 = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1] s2 = [1, 0, 1, 1, 1, 1, 0 , 1, 0, 0, 0, 1] r1 = numpy.correlate (s1, s1, mode = 'full') r2 = numpy.correlate (s2, s2, mode = 'full') Saya menggunakan empat baris ini dalam kode python. Saya mendapat r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] dan r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] baik r1 dan r2 memberikan kurva pelangi yang sama seperti bentuk .. Bagaimana saya bisa menentukan dalam kode bahwa satu sinyal adalah peroidc atau hampir periodik atau tidak periodik sama sekali, terima kasih
safzam
4

Jawaban Jim membuat saya berpikir bagaimana cara menguji ini secara statistik. Ini membawa saya ke tes autokorelasi Durbin-Watson .

Generalisasi itu adalah untuk membentuk:

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

dan upaya saya untuk mengimplementasikan ini di scilab adalah:

// 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(τ)τ

Jika saya memplot hasilnya untuk dua contoh urutan kami:

masukkan deskripsi gambar di sini

Maka jelas bahwa urutan kedua menunjukkan korelasi pada keterlambatan 4, 8, dll. Dan anti-korelasi pada keterlambatan 2, 6, dll.

DW(τ)

Peter K.
sumber
terima kasih atas info ini. Infact saya membuat program dengan python di mana saya mendapatkan banyak daftar 0s dan 1s. Saya ingin memisahkan jenis seri berkala, acak, dan meledak. Saya mencoba logika di atas dalam python tetapi fungsi "xcorr" tidak dalam python, maka saya menggunakan fungsi numpy.correlate (lst, lst, mode = 'full'). Juga daftar berisi putaran 70.000 daftar 0s dan 1s .. Saya hanya ingin menentukan apakah daftar ini periodik atau tidak ... jika ada sedikit un periodisitas saya dapat menghindarinya. ada petunjuk lebih lanjut plz. Terima kasih sebelumnya.
safzam