ฉันจะตรวจสอบได้อย่างไรว่าสัญญาณไม่ต่อเนื่องเป็นระยะ ๆ


12

ฉันต้องการทราบวิธีที่ฉันสามารถตรวจสอบว่าชุดของข้อมูลเป็นระยะหรือไม่

ฉันต้องการใช้การแปลงฟูริเยร์ / ซีรีส์ ข้อมูลของฉันมีลักษณะเป็นช่วง ๆ

[111100001111000110010101010000101]

หรือเป็นระยะ

[11001100110011001100]

และฉันต้องตัดสินใจว่ามันคืออะไรโดยอัตโนมัติ ฉันสามารถทำการวิเคราะห์หรือคำนวณประเภทใดเพื่อตรวจสอบว่าสัญญาณเป็นระยะหรือไม่

คำตอบ:


14

ฉันจะทำการหาค่าเฉลี่ยอัตโนมัติเพื่อหาค่าระยะเวลา หากเป็นคาบที่มีคาบคุณควรเห็นจุดสูงสุดในตัวอย่างPทุกอันในผลลัพธ์ ผลลัพธ์ปกติของ "1" หมายถึงช่วงเวลาที่สมบูรณ์แบบ "0" หมายถึงไม่มีช่วงเวลาเลยในช่วงเวลานั้นและค่าระหว่างระยะเวลาไม่สมบูรณ์ที่บอกเป็นนัย ลบค่าเฉลี่ยของลำดับข้อมูลออกจากลำดับข้อมูลก่อนที่จะทำการหาค่าสัมพันธ์โดยอัตโนมัติเพราะมันจะทำให้เกิดผลลัพธ์ที่มีอคติPP

ยอดเขาจะมีแนวโน้มที่จะลดลงห่างจากจุดศูนย์กลางที่พวกเขาได้รับเพียงเพราะมีตัวอย่างที่ทับซ้อนกันน้อยลง คุณสามารถลดผลกระทบนั้นได้โดยการคูณผลลัพธ์ด้วยค่าผกผันของเปอร์เซ็นต์ของตัวอย่างที่ทับซ้อนกัน

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

แก้ไข: นี่คือตัวอย่างของวิธีการที่จะบอกว่าลำดับเป็นระยะ ต่อไปนี้เป็นรหัส 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'))

พารามิเตอร์ "ไม่เอนเอียง" ไปยังฟังก์ชัน xcorr บอกให้ทำมาตราส่วนที่อธิบายไว้ในสมการของฉันด้านบน ความสัมพันธ์แบบอัตโนมัตินั้นไม่ได้ทำให้เป็นมาตรฐาน แต่นั่นคือสาเหตุที่จุดสูงสุดที่จุดศูนย์กลางอยู่ที่ประมาณ 0.25 แทนที่จะเป็น 1 นั่นไม่สำคัญเลยตราบใดที่เราจำไว้ว่าจุดสูงสุดของศูนย์กลางนั้นสัมพันธ์กันอย่างสมบูรณ์แบบ เราเห็นว่าไม่มียอดเขาอื่นที่เกี่ยวข้องยกเว้นที่ขอบด้านนอกสุด สิ่งเหล่านั้นไม่สำคัญเพราะมีเพียงตัวอย่างเดียวที่ซ้อนทับกันดังนั้นจึงไม่มีความหมาย

Non-ระยะ

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

ที่นี่เราจะเห็นว่าลำดับเป็นระยะ ๆ เนื่องจากมีจุดยอด autocorrelation หลายจุดที่เป็นกลางโดยมีขนาดเท่ากับจุดสูงสุดตรงกลาง

เป็นระยะ


3
A(n)

1
@PeterK จุดที่ดี
Jim Clay

เฮ้จิมขอบคุณ .. ฉันสับสนนิดหน่อยว่าจะเริ่มต้นเขียนโปรแกรมนี้ได้อย่างไรเพราะเมื่อใดที่ฉันเคยค้นหาเกี่ยวกับออโตคอร์เรชั่นฉันพบสูตรที่ซับซ้อนฉันไม่เข้าใจเลยว่าจะเริ่มจากจุดไหนและหาจุดสูงสุดในช่วงรหัส P อย่างไร . กับฉันฉันมีรายการของค่า V [] = {110011001100 .. } ตอนนี้วิธีที่จะนำพวกเขาในสูตร autocorrelation และกำหนดว่าเป็นระยะหรือไม่ ... คุณช่วยให้ฉันเริ่มง่ายหน่อย ... ขอบคุณมาก
safzam

@safzam หากคุณใช้ Matlab หรือ Python (numpy) พวกเขามีฟังก์ชั่น autocorrelation อยู่แล้ว หากคุณต้องการอะไรใน C / C ++ / Java / อะไรก็ตามลองที่นี่ - dsprelated.com/showmessage/59527/1.php
Jim Clay

ตัวอย่างเช่นฉันใช้สองสัญญาณต่อไปนี้ s1 ans s2: s1 = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1] s2 = [1, 0, 1, 1, 1, 1, 0 , 1, 0, 0, 0, 1] r1 = numpy.correlate (s1, s1, โหมด = 'เต็ม') r2 = numpy.correlate (s2, s2, โหมด = 'เต็ม') ฉันใช้สี่บรรทัดนี้ใน รหัสหลาม ฉันได้ r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] และ r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 6 2 3 1 2 1 1 0 1] ทั้ง R1 และ R2 ช่วยให้เส้นโค้งสีรุ้งเช่นเดียวกับรูปร่าง .. ฉันจะตรวจสอบในรหัสที่หนึ่งสัญญาณ peroidc หรือเกือบเป็นระยะ ๆ หรือไม่เป็นระยะที่ทุกคนขอบคุณ
safzam

4

คำตอบของจิมส่งให้ฉันคิดเกี่ยวกับวิธีทดสอบสถิตินี้ นี้นำฉันไปทดสอบอัตเดอร์บินวัตสัน

ลักษณะทั่วไปของมันคือรูปแบบ:

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

และความพยายามของฉันที่จะใช้สิ่งนี้ใน scilab คือ:

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

ถ้าฉันพล็อตผลลัพธ์สำหรับสองตัวอย่างของเรา:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเป็นที่ชัดเจนว่าลำดับที่สองแสดงความสัมพันธ์ที่ความล่าช้าของ 4, 8 เป็นต้นและการต่อต้านความสัมพันธ์ที่ความล่าช้าของ 2, 6 และอื่น ๆ

DW(τ)


ขอบคุณสำหรับข้อมูลนี้ Infact ฉันกำลังสร้างโปรแกรมในหลามที่ฉันได้รับรายการจำนวนมากจาก 0s และ 1s ฉันต้องการแยกประเภทซีรีย์เป็นระยะสุ่มและต่อเนื่อง ฉันลองใช้ตรรกะข้างต้นในไพ ธ อน แต่ฟังก์ชั่น "xcorr" ไม่ได้อยู่ในไพ ธ อนจากนั้นฉันใช้ฟังก์ชั่น numpy.correlate (lst, lst, mode = 'full') นอกจากนี้รายการยังประกอบด้วยรายการ 70,000 รอบของ 0s และ 1s .. ฉันแค่ต้องการตรวจสอบว่ารายการนี้เป็นระยะหรือไม่ ... หากมีระยะเวลาไม่แน่นอนเล็กน้อยฉันสามารถหลีกเลี่ยงได้ คำใบ้เพิ่มเติมใด ๆ ขอบคุณล่วงหน้า.
Safzam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.