불연속 신호가 주기적인지 아닌지 어떻게 알 수 있습니까?


12

일련의 데이터가 주기적인지 여부를 결정하는 방법을 알고 싶습니다.

푸리에 변환 / 시리즈를 사용하고 싶습니다. 내 데이터가 비 주기적으로 보입니다.

[111100001111000110010101010000101]

또는 주기적

[11001100110011001100]

어떤 것이 자동인지 결정해야합니다. 신호가 주기적인지 아닌지를 판단하기 위해 어떤 유형의 분석 또는 계산을 수행 할 수 있습니까?

답변:


14

주기성을 결정하기 위해 정규화 된 자기 상관 을 수행합니다 . 주기 와주기적인 경우 결과의 모든 P 샘플에서 피크를 볼 수 있습니다. "1"의 정규화 된 결과는 완전한 주기성을 의미하고, "0"은 그주기에서 전혀 주기성을 의미하지 않으며 불완전한 주기성을 의미합니다. 자기 상관을 수행하기 전에 데이터 시퀀스에서 데이터 시퀀스의 평균을 빼면 결과가 바이어스됩니다.PP

겹치는 샘플 수가 적기 때문에 피크가 중심에서 멀어 질수록 피크가 감소하는 경향이 있습니다. 결과에 겹치는 샘플 비율의 역수를 곱하여 해당 효과를 완화 할 수 있습니다.

여기서U(n)은 바이어스되지 않은 자기 상관,A(n)은 정규화 된 자기 상관,n은 오프셋 및N은 데이터 시퀀스에서 주기성을 확인하는 샘플 수입니다.

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 함수에 대한 "unbiased"매개 변수는 위의 방정식에 설명 된 스케일링을 수행하도록 지시합니다. 자동 상관은 정규화되지 않기 때문에 중심점의 피크가 1이 아닌 0.25 정도입니다. 중심점이 완벽한 상관 관계라는 것을 명심하는 한 중요하지 않습니다. 가장 바깥 쪽 가장자리를 제외하고 다른 해당 피크가 없다는 것을 알 수 있습니다. 겹치는 샘플이 하나만 있기 때문에 중요하지 않으므로 의미가 없습니다.

비 주기적

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

여기서 중심 피크와 동일한 크기를 갖는 다수의 바이어스되지 않은 자기 상관 피크가 있기 때문에 시퀀스가 ​​주기적임을 알 수 있습니다.

주기적


3
A(n)

1
@PeterK 좋은 지적입니다.
Jim Clay

Jim, 고마워요 .. 자기 상관에 대해 검색 할 때 복잡한 수식을 찾을 때마다 어디서부터 시작해야하는지, 코드에서 P 기간으로 피크를 감지하는 방법을 알지 못하기 때문에 프로그래밍을 시작하는 방법이 약간 혼란 스럽습니다. . 나와 함께 V [] = {110011001100 ..} 값 목록을 가져 와서 자기 상관 공식에 넣는 방법과주기적인 여부를 결정하는 방법 ... 조금 쉽게 시작할 수 있습니까? 감사합니다.
safzam

@safzam Matlab 또는 Python (numpy)을 사용중인 경우 이미 자기 상관 기능이 있습니다. C / C ++ / Java / whatever에 무언가가 필요하면 여기에서 시도하십시오 -dsprelated.com/showmessage/59527/1.php
Jim Clay

예를 들어 다음 두 신호 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')이 네 줄을 파이썬 코드. 나는 r1 = [1212 34 3 34 34 1 3 1 3 1 2 1 2 1]을 얻었고 r2 = [110 1 2 2 3 2 6 2 3 2 3 2 3 2 3 1 0 1] r1과 r2는 모양과 같은 무지개 곡선을 제공합니다. 코드에서 한 신호가 peroidc이거나 거의 주기적이거나 전혀 주기적이지 않다는 것을 어떻게 알 수 있습니까?
safzam

4

Jim의 대답 은 이것을 통계적으로 테스트하는 방법에 대해 생각하게했습니다. 이로 인해 Durbin-Watson 자기 상관 테스트가 시작되었습니다 .

그것의 일반화는 다음을 형성하는 것입니다.

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


이 정보에 감사드립니다. 사실 나는 파이썬으로 프로그램을 만들고 있는데 0과 1의 많은 목록을 얻습니다. 주기적, 랜덤, 버스트 유형의 시리즈를 분리하고 싶습니다. 파이썬에서 위의 논리를 시도하고 있지만 "xcorr"함수가 파이썬에 없으면 numpy.correlate (lst, lst, mode = 'full') 함수를 사용했습니다. 또한 목록에는 0과 1의 둥근 70,000 목록이 포함되어 있습니다. 나는이 목록이 주기적인지 아닌지를 결정하고 싶습니다 ... 약간의 불규칙성이있는 경우 피할 수 있습니다. 추가 힌트 plz. 미리 감사드립니다.
safzam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.