2009-12-02 12 views
0

나는 시간 영역에서 두 개의 파형을 가지고 있는데 그 중 MATLAB에서 cross-correlation 계수를 측정해야합니다. max(abs(xcorr(m,n,'coeff'))) 시도했지만 제대로 작동하지 않는 것 같습니다.교차 상관 계수

또한 파형의 여러 섹션에 대한 상호 상관 계수를 측정해야합니다. 1 분 간격으로 상호 상관 계수를 측정하십시오. 그리고 가능한 경우이 값을 행렬 또는 다른 것으로 출력하십시오.

나는 이것이 많이 묻는 것을 알고 있지만 나는 MATLAB 초보자이며이 작업을 어렵게 생각한다!
이 질문의 어떤 부분에서 나에게 줄 수있는 도움은 감사하게 받아 들여질 것입니다.


EDIT : 이 I는 상관 코드를 테스트하는 데 사용하는 코드이다 (xcorr (m를 I가 최대 시도

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcorr(x,y,'coeff'))) 
+0

"제대로 작동하지 않는 것"보다 자세한 내용이 필요합니다. * 당신은 무엇을 얻었으며, 당신은 무엇을 기대 했습니까? – gnovice

답변

0

(절대치가, N 'COEFF'))) 제대로 작동하지 않는 것 같습니다.

그게 무슨 뜻인가요? 무엇이 출력되고, 무엇을 기대합니까?

교차 상관 관계에서 가능한 한 가지 잡아 당김은 파형의 DC 바이어스가 결과를 손상시킬 수 있다는 것입니다. 그리고 내가 아는 한 그것에 대해 아무 것도 할 수있는 보편적 인 방법이 없습니다. 파형에 DC 바이어스가 포함되지 않도록해야합니다. 이 방법으로 교차 상관 계수 셀 수 this article에 방정식에 따르면

+0

음, 0에서 1 사이의 값을 기대하고 있습니다. 신호가 시각적으로 매우 유사하고 약간의 지연이 있습니다. 그러나 위에 입력 한 코드는 0.77의 값을 제공합니다. 그러나 Matlab에서 만드는 두 개의 무작위 신호에이 코드를 사용하면 약 0.83의 높은 상관 계수가 얻어지며 매우 유사하다는 것을 알 수 있습니다. – Scott

+0

위의 질문을 편집하여 코드를 게시하십시오. 2 개의 무작위 신호 사이의 상관 계수는 1) 매우 짧거나 2) DC 바이어스가없는 한 거의 0이 아닌 것으로 생각하는 것이 어렵습니다. –

5

: 당신은 단지 신호의 일부에 대한 계수를 계산하려면

% Assuming: m and n are your signals organized as row vectors 
r = cov([m;n])/(std(m)*std(n)); 

을 바로 사용

r = cov([m(1:100);n(1:100)])/(std(m(1:100))*std(n(1:100))); 
는 또한 corrcoef 기능을 시도 했습니까?

편집 좋아, 살펴 나는 corrcoef 기능을 확인하고 제대로 작동하는 것 같군 :

>> x = 100*randn(1000,1); 
>> y=34*randn(1000,1); 
>> corrcoef(x,y) 

ans = 

    1.0000 -0.0543 
    -0.0543 1.0000 

그래서 상관 계수가 동일 -0.0543입니다 - 작은 유사성 (예상대로) .
그을 확인하기 위해, 동일한 신호에 대한 계수를 계산하자

예상대로
>> y=x; 
>> corrcoef(x,y) 

ans = 

    1  1 
    1  1 

되면 1

편집 동일이다.메인 대각선 외부 요소들 중 하나를 선택해야 상호 상관 이처럼

 x  y 
x 1.0000 -0.0543 
y -0.0543 1.0000 

(

있다 : 보시 , corrcoef의 결과는이 두 신호 간의 가능한 모든 상관 계수의 행렬은 자기 상관 계수를 위치 시키며,이 경우 항상 항상 1이다).
ans (2,1) 또는 ans (1,2)를 선택하면 차이가 없습니다. x와 y의 상관 관계 또는 y와 x의 상관 관계를 계산하면 차이가 없습니다.

그래서 최종 코드는 다음과 유사합니다 :

R = corrcoef(x,y); % Correlation matrix 
r = R(2,1); % this is your Cross-Correlation coefficient 
+0

안녕하세요, 고마워요,하지만이 중 많은 숫자가 하나를 넘습니다. 유사성을 나타내는 단일 값을 찾고 있습니다. 다른 도움이 될만한 제안이 있습니까? – Scott

+0

너는 ans (1,2)가 필요하다. –

+0

Scott은 자기 자신을 위해서 똑똑하다.) OK -> Edit – Gacek

0

이 내가 상관 코드를 테스트하는 데 사용되는 코드는 다음과 같습니다

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcorr(x,y,'coeff'))) 

문제는 rand 반환 간격은 (0,1)에 균등하게 분포 된 입니다. 즉, DC 바이어스 (평균)가 0.5입니다! 그래서 무작위적인 신호에 대해 높은 상관 계수를 얻습니다. 각 계수는 상관 계수에 나타나는 상수 성분이 유사하기 때문에 무작위 적이 지 않습니다.

따라서 randn을 대신 사용해보십시오. 이 평균 0으로 정규 분포 된 임의의 숫자를 반환합니다. 이것은 원하는 것입니다.

+0

DC 바이어스를 다음과 같이 제거한다 : x = rand (1,14400) - 0.5; y = 랜드 (1,14400) - 0.5; r = max (abs (xcorr (x, y, 'coeff'))) 이 "문제"가 수정됩니다. 그러나, randn을 사용하는 것이 좋습니다. 대략 정규/가우스 잡음은 실제 신호에서 매우 일반적입니다 (주로 중앙 한계 정리로 인해). 반면 균일 한 잡음은 그렇지 않습니다. – musicinmybrain

1

대신

x = rand(1,14400); 
y = rand(1,14400); 
r = max(abs(xcov(x,y,'coeff'))) 

크로스 공분산 서열은 평균 제거 시퀀스들의 상호 - 상관은 크로스 공분산 사용해보십시오. Joonas가 언급했듯이 rand의 DC 오프셋은 0.5이며 "잘못된"결과를 나타냅니다.