2014-02-19 2 views
0

Matlab의 두 데이터 세트 사이의 샘플에 오프셋을 가져오고 싶습니다 (시간이 동기화 됨). 이는 매우 일반적인 문제입니다. 따라서 교차 상관 함수 xcorr 또는 교차 공분산 함수 xcov를 사용합니다 (둘 다 이와 같은 결과를 얻을 수 있습니다). 인위적인 데이터를 사용하면 정상적으로 작동하지만 실제로는 거의 동일해야하지만 실제 데이터로는 어려움을 겪습니다. Matlab은 오프셋이 0이라고 항상 말합니다. Code with data on pastebinMatlab : 교차 공분산을 사용하여 데이터 정렬

편집은 : 다운 샘플링 된 발췌 한 것 같다 내가 페이스트 빈에 다운 샘플링 데이터 발췌와 완전히 runable 예를 들어 m-파일을 게시 한

[crossCorr] = xcov(b, c); 
[~, peakIndex] = max(crossCorr()) 
offset = peakIndex - length(b) 

: 나는 코드의 간단한 조각을 사용하고 있습니다 효과를 평가하기에 충분히 적합하지 않다. Here's a much larger sample with the original frequency, pease use this one instead. 불행하게도 그것은 pastebin을 위해 너무 컸다.

플롯이 보여 주듯이 교차 공분산을 통해 오프셋을 얻는 것은 전혀 문제가되지 않습니다. 또한 수치적인 문제를 피하기 위해 더 나은 데이터의 크기를 조정하려고 시도했지만 전혀 변경되지 않았습니다.

누군가 내 실수를 말할 수 있다면 좋을 것입니다. 그때 나는 아래 오프셋의 허용 범위 주위에 창 표시 할 수 수 있기 때문에 내 데이터에 대해 뭔가를 알고있는 경우

+0

이론 데이터는 어떻게 보였습니까? 나는 여기에서 완전히 확신하지는 않지만, 데이터에 몇 개의 기간이 있어야 할 수도 있습니다. 한 세트에서 0에 피크가 있고 다른 세트에서 5에 피크가 있다고 가정 해 봅시다. 그렇다면 5는 나머지와 비교하여 매우 높은 상관 관계를 가져야합니다. 그러나 귀하의 데이터는 긴 경사와 같습니다. 0의 값은 5의 값과 비교할 수 있습니다.이 값은 전체적으로 매우 낮은 상관 관계를 나타냅니다. 이 기술은 어쨌든 작동해야 할 수도 있지만 그건 내 추측입니다. 당신은 다른 이론적 인 자료를 비교하려고 시도 할 수 있습니다. – patrik

+0

감사합니다. 여기가 내 [이론 시험] (http://pastebin.com/tteXKqmy)이었습니다. 무작위 신호와 동일한 진폭을 가진 잡음조차도 전혀 문제가되지 않는다는 사실에 상당히 감동했습니다. 실제 데이터는 정기 간행물이 아니지만 발췌 내용이 약간 짧습니다. [여기에 더 많은 발췌 부분이 있습니다.] (http://pastebin.com/AHjXY5Rz), 불행히도 그것을 받아들이는 pastebin을 위해 더 많은 것을 다운 샘플링해야했습니다. – user3296542

답변

1

원칙적으로 방법에 문제가 없으므로 같은 신호의 여러 오디오 녹음을 시간에 맞게 정렬하는 데 정확히 동일한 접근 방식을 사용했습니다.

그러나 시계열의 경우 상관 관계 (또는 공분산)가 단순히 전체 길이와 비슷한 시간 척도의 구성 요소를 포함하기 때문에 이동 된 버전을 비교하는 올바른 방법이 아닙니다. 다른 대안은 잔류 분산, 즉 시프트 된 버전 간의 차이의 분산을 사용하는 것이다. 당신 (이상) 데이터 세트에 대한

lags = -1000 : 1000; 
v = nan(size(lags)); 
for i = 1 : numel(lags) 
    lag = lags(i); 
    if lag >= 0 
     v(i) = var(b(1 + lag : end) - c(1 : end - lag)); 
    else 
     v(i) = var(b(1 : end + lag) - c(1 - lag : end)); 
    end 
end 
[~, ind] = min(v); 
minlag = lags(ind); 

, 이것은 minlag = 169 결과 : 여기이 아이디어의 (특히 우아하지 않음) 구현이다. 시차 위에 잔여 분산을 세우고 준다 : 두 개의 신호 샘플들의 비 - 정수 개수, 예를 들어 잘못 정렬함으로써

lag-vs-var

+0

감사합니다. 그 접근 방식이 저에게 효과적입니다. 이 구현에서는 합리적인 범위 (예상했던)에 대해 xcov 함수보다 훨씬 오래 걸리지 만 예상되는 결과를 반환합니다. – user3296542

+0

좋아요! 속도를 높일 수 있어야하지만, 지금 당장은 분명하지 않습니다. –

0

귀하의 데이터는 5 주위에 작은 피크 (101)

주변의 주요 피크를 가지고있다. 초기 탐사

코드 :

figure; clc; 
subplot(2,1,1) 
plot(1:numel(b), b); 
hold on 
plot(1:numel(c), c, 'r'); 
legend('b','c') 

subplot(2,1,2) 
plot(crossCorr,'.b-') 
hold on 
plot(peakIndex,crossCorr(peakIndex),'or') 
legend('crossCorr','peak') 

초기 이미지 : 첫 번째 피크를 확대하면

enter image description here

을 당신은 단지 높은 약 5 아니라고 볼 수 있지만 그것이 하위 요소 오프셋을 허용하는 다항식 "충분 함" 편리합니다.

이미지를 보여주는 :

여기

enter image description here

곡선 피팅 도구는 입방에 대한 분석으로주는 것입니다 :

Linear model Poly3: 
    f(x) = p1*x^3 + p2*x^2 + p3*x + p4 
Coefficients (with 95% confidence bounds): 
     p1 = 8.515e-013 (8.214e-013, 8.816e-013) 
     p2 = -3.319e-011 (-3.369e-011, -3.269e-011) 
     p3 = 2.253e-010 (2.229e-010, 2.277e-010) 
     p4 = -4.226e-012 (-7.47e-012, -9.82e-013) 

Goodness of fit: 
    SSE: 2.799e-024 
    R-square: 1 
    Adjusted R-square: 1 
    RMSE: 6.831e-013 

당신은 SSE가 반올림에 맞는 참고 할 수 있습니다. 루트를 계산하면 (근처 N = 4) 다음 MATLAB 코드 사용

% Coefficients 
     p1 = 8.515e-013 
     p2 = -3.319e-011 
     p3 = 2.253e-010 
     p4 = -4.226e-012 
% Linear model Poly3: 
syms('x') 
f = p1*x^3 + p2*x^2 + p3*x + p4 

xz1=fzero(@(y) subs(diff(f),'x',y), 4) 

을하고 4.01420240431444에서 분석 루트를 얻을.

편집 : 흠. 가우시안 혼합 모델을 회선에 맞추는 것은 어떻습니까? 구성 요소 수의 범위가 다양하고 10 회에서 30 회까지 반복 할 수 있으며 BIC가 가장 높거나 낮은 구성 요소 수를 확인할 수 있습니다. 따라서 gmdistribution을 첫 번째 그림의 하위 하위 집합에 맞춘 다음 구성 요소의 평균값에서 공분산을 테스트합니다.

나는 평균에서 오프셋을 시도하고, 합계 제곱 오류를 봅니다. 그런 다음 가장 낮은 오류가있는 오프셋을 선택합니다.

절차 :

  • 컴퓨팅 상호 상관 관계
  • 적합 교차 상관 가우시안 혼합 모델에
    • 구성 요소의 합리적인 범위를 쓸어
    • 합리적인 번호를 사용 (1-10로 시작) 반복 실행 횟수 (run-to-run 변화에 따라 10에서 30까지)
    • 각 레벨에 대한 Bayes Information Criterion (BIC) 오류 및 매개 변수 수의 합리적인 균형을 나타 내기 때문에 가장 낮습니다.
  • 각 구성 요소는 평균을 가지므로 해당 평균을 후보 오프셋으로 계산하고 오프셋 할 때 sum-squared 오류 (sse)를 계산합니다.

나 그 작동 방법을 잘 알려 SSE 최고의주는 구성 요소의 오프셋을 선택합니다.

+0

답변 해 주셔서 감사합니다. 불행하게도이 효과는 일반적으로 적용 할 수없는 것처럼 보입니다. 여기서는 무작위로 작동합니다. 필자는 pastebin에 멋지게 넣기 위해 데이터를 다운 샘플링하고 단축했습니다. 올바른 결정이 아닌 것 같습니다.[원래 샘플링 빈도가있는 훨씬 더 큰 샘플입니다] (http://en.file-upload.net/download-8639254/variables.mat.html). 이 샘플에서는 효과가 나타나지 않습니다. 오프셋이 약 160 인 동안 샘플 20000 이후의 첫 번째 최대 값입니다. – user3296542

0

하면 3.7 샘플이면 xcorr 메소드는 4 샘플에서 최대 값을 찾을 수 있습니다. 정확한 시간 이동을 찾을 수 없습니다. 이 경우 "통합 변경 감지"라는 방법을 시도해야합니다. 논문의 웹 링크는 다음과 같습니다. [http://www.phmsociety.org/node/1404/]

행운을 빕니다.

관련 문제