Làm cách nào để xác định xem tín hiệu rời có định kỳ hay không?


12

Tôi muốn biết làm thế nào tôi có thể xác định liệu một loạt dữ liệu có định kỳ hay không.

Tôi muốn sử dụng biến đổi / loạt Fourier. Dữ liệu của tôi trông có vẻ định kỳ

[111100001111000110010101010000101]

hoặc định kỳ

[11001100110011001100]

và tôi cần phải quyết định nó tự động. Những loại phân tích hoặc tính toán nào tôi có thể thực hiện để xác định xem tín hiệu có định kỳ hay không?

Câu trả lời:


14

Tôi sẽ thực hiện tự động chuẩn hóa để xác định định kỳ. Nếu đó là định kỳ với chu kỳ bạn sẽ thấy các đỉnh ở mọi mẫu P trong kết quả. Một kết quả được chuẩn hóa của "1" ngụ ý tính tuần hoàn hoàn hảo, "0" ngụ ý không có tính tuần hoàn ở giai đoạn đó và các giá trị ở giữa ngụ ý tính chu kỳ không hoàn hảo. Trừ trung bình của chuỗi dữ liệu khỏi chuỗi dữ liệu trước khi thực hiện tự động tương quan vì nó sẽ làm sai lệch kết quả.PP

Các đỉnh sẽ có xu hướng giảm dần ra xa trung tâm mà chúng nhận được chỉ vì có ít mẫu chồng chéo hơn. Bạn có thể giảm thiểu hiệu ứng đó bằng cách nhân kết quả với tỷ lệ nghịch của tỷ lệ phần trăm mẫu chồng lấp.

Trong đóU(n)là tự động tương quan không thiên vị,A(n)là tự động tương quan chuẩn hóa,nlà phần bù vàNlà số lượng mẫu trong chuỗi dữ liệu mà bạn đang kiểm tra tính định kỳ.

Bạn(n)= =Một(n)*N|N-n|
Bạn(n)Một(n)nN

EDIT: Đây là một ví dụ về cách nhận biết các chuỗi có định kỳ hay không. Sau đây là mã 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'))

Tham số "không thiên vị" cho hàm xcorr bảo nó thực hiện chia tỷ lệ được mô tả trong phương trình của tôi ở trên. Tuy nhiên, mối tương quan tự động không được chuẩn hóa, đó là lý do tại sao đỉnh ở trung tâm là khoảng 0,25 thay vì 1. Tuy nhiên, điều đó không quan trọng, miễn là chúng ta nhớ rằng đỉnh trung tâm là tương quan hoàn hảo. Chúng ta thấy rằng không có các đỉnh tương ứng khác ngoại trừ ở các cạnh ngoài cùng. Những điều đó không quan trọng bởi vì chỉ có một mẫu chồng chéo, vì vậy điều đó không có ý nghĩa.

Không định kỳ

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

Ở đây chúng ta thấy rằng chuỗi là định kỳ vì có nhiều đỉnh tự tương quan không thiên vị với cùng độ lớn với đỉnh trung tâm.

Định kỳ


3
Một(n)

1
@PeterK Điểm tốt.
Jim Clay

Xin chào Jim, cảm ơn..Tôi hơi bối rối khi bắt đầu lập trình cái này, bởi vì bất cứ khi nào tôi tìm kiếm về tự động tương quan tôi đều tìm thấy các công thức phức tạp, tôi không thực sự biết ý tưởng bắt đầu từ đâu và làm thế nào để phát hiện đỉnh với giai đoạn P trong mã . Với tôi, tôi có một danh sách các giá trị V [] = {110011001100 ..} bây giờ làm thế nào để đưa chúng vào công thức tự tương quan và xác định thời tiết của nó theo định kỳ hay không ... Bạn có thể vui lòng cho tôi một chút dễ dàng bắt đầu không ... Cảm ơn rất nhiều
safzam

@safzam Nếu bạn đang sử dụng Matlab hoặc Python (numpy) thì họ đã có chức năng tự tương quan rồi. Nếu bạn cần một cái gì đó bằng C / C ++ / Java / bất cứ điều gì, thì hãy thử tại đây- dsprelated.com/showmessage/59527/1.php
Jim Clay

Ví dụ: tôi đã sử dụng hai tín hiệu 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') Tôi đã sử dụng bốn dòng này trong a mã trăn. Tôi có r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] và r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] cả r1 và r2 đều có cùng một đường cong cầu vồng giống như hình dạng .. Làm thế nào tôi có thể xác định trong mã rằng một tín hiệu là peroidc hoặc gần như định kỳ hoặc không theo định kỳ, cảm ơn
safzam

4

Câu trả lời của Jim khiến tôi suy nghĩ về cách kiểm tra thống kê này. Điều này dẫn tôi đến bài kiểm tra tự tương quan Durbin-Watson .

Khái quát của nó là hình thành:

DW(τ)= =Σn= =τN-1[Bạn(n)-Bạn(n-τ)]2Σn= =0N-1Bạn(n)2

và nỗ lực của tôi trong việc thực hiện điều này trong scilab là:

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

Nếu tôi vẽ kết quả cho hai chuỗi ví dụ của chúng tôi:

nhập mô tả hình ảnh ở đây

Sau đó, rõ ràng là chuỗi thứ hai thể hiện mối tương quan ở độ trễ 4, 8, v.v. và chống tương quan ở độ trễ 2, 6, v.v.

DW(τ)


cảm ơn bạn vì thông tin này. Nguyên vẹn Tôi đang thực hiện một chương trình trong python nơi tôi nhận được rất nhiều danh sách 0 và 1. Tôi muốn tách loại định kỳ, ngẫu nhiên, bùng nổ của loạt. Tôi đang thử logic trên trong python nhưng hàm "xcorr" không có trong python, sau đó tôi đã sử dụng hàm numpy.correlate (lst, lst, mode = 'full'). Ngoài ra các danh sách chứa vòng 70.000 danh sách 0 và 1 .. Tôi chỉ muốn xác định xem danh sách này có định kỳ hay không ... nếu có một chút không định kỳ tôi có thể tránh nó. bất kỳ gợi ý thêm plz. cảm ơn trước.
safzam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.