이 페이지의 내용은 이전 릴리스에 관한 것입니다. 해당 영문 페이지는 최신 릴리스에서 제거되었습니다.

xcorr

상호상관(Cross-correlation)

구문

r = xcorr(x,y)
r = xcorr(x)
r = xcorr(___,maxlag)
r = xcorr(___,scaleopt)
[r,lags] = xcorr(___)

설명

예제

r = xcorr(x,y)는 2개의 이산시간 시퀀스 xy의 상호상관을 반환합니다. 상호상관은 xy의 이동된(지연된) 복사본 사이의 유사성을 그 지연 시간의 함수로 측정합니다. xy의 길이가 다르면 이 함수는 더 짧은 벡터의 끝부분에 0을 추가하여 상대 벡터와 동일한 길이 N을 가지도록 합니다.

예제

r = xcorr(x)x의 자기상관 시퀀스를 반환합니다. x가 행렬이면 r도 행렬이 되며, 반환된 행렬의 열에는 x의 열의 모든 조합에 대한 자기상관 및 상호상관 시퀀스가 포함됩니다.

예제

r = xcorr(___,maxlag)는 지연 범위를 –maxlag에서 maxlag까지로 제한합니다. 이 구문은 하나 또는 두 개의 입력 시퀀스를 받습니다. maxlag는 기본적으로 N – 1로 설정됩니다.

예제

r = xcorr(___,scaleopt)는 상호상관이나 자기상관에 대한 정규화 옵션을 추가로 지정합니다. 'none'(디폴트 값)이 아닌 다른 옵션을 사용하려면 xy의 길이가 같아야 합니다.

예제

[r,lags] = xcorr(___)은 상관이 계산되는 지연으로 구성된 벡터도 반환합니다.

예제

모두 축소

서로 다른 위치에 있는 두 개의 센서가 자동차가 다리를 건널 때 자동차로 인해 발생하는 진동을 측정합니다.

신호와 샘플 레이트 를 불러옵니다. 시간 벡터를 생성하고 신호를 플로팅합니다. 센서 2의 신호가 센서 1의 신호보다 먼저 도착합니다.

load sensorData

t1 = (0:length(s1)-1)/Fs;
t2 = (0:length(s2)-1)/Fs;

subplot(2,1,1)
plot(t1,s1)
title('s_1')

subplot(2,1,2)
plot(t2,s2)
title('s_2')
xlabel('Time (s)')

두 측정값의 상호상관은 도착이 늦어지는 만큼의 지연에서 최대에 도달합니다.

상호상관을 플로팅합니다. 도착 차이를 샘플 개수와 초 단위로 표현합니다.

[acor,lag] = xcorr(s2,s1);

[~,I] = max(abs(acor));
lagDiff = lag(I)
lagDiff = -350
timeDiff = lagDiff/Fs
timeDiff = -0.0317
figure
plot(lag,acor)
a3 = gca;
a3.XTick = sort([-3000:1000:3000 lagDiff]);

두 신호를 정렬하고 다시 플로팅합니다. MATLAB®에서 사용되는, 1부터 시작하는 인덱싱을 처리하기 위해 지연값 차이에 1을 더합니다.

s1al = s1(-lagDiff+1:end);
t1al = (0:length(s1al)-1)/Fs;

subplot(2,1,1)
plot(t1al,s1al)
title('s_1, aligned')

subplot(2,1,2)
plot(t2,s2)
title('s_2')
xlabel('Time (s)')

음성 녹음에는 벽에서 반사해 발생하는 에코가 포함됩니다. 자기상관을 사용하여 에코를 제거합니다.

녹음에서, 한 사람이 MATLAB®이라는 단어를 말합니다. 이 데이터와 샘플 레이트 를 불러옵니다.

load mtlb

% To hear, type soundsc(mtlb,Fs)

개 샘플로 지연되고 알려진 인자 로 감쇠된 신호의 복사본을 녹음에 추가하여 에코를 모델링합니다(). 시간 지연값 0.23초와 감쇠 인자 0.5를 지정합니다.

timelag = 0.23;
delta = round(Fs*timelag);
alpha = 0.5;

orig = [mtlb;zeros(delta,1)];
echo = [zeros(delta,1);mtlb]*alpha;

mtEcho = orig + echo;

원래 신호, 에코, 그리고 결과로 생성된 신호를 플로팅합니다.

t = (0:length(mtEcho)-1)/Fs;

subplot(2,1,1)
plot(t,[orig echo])
legend('Original','Echo')

subplot(2,1,2)
plot(t,mtEcho)
legend('Total')
xlabel('Time (s)')

% To hear, type soundsc(mtEcho,Fs)

신호 자기상관에 대한 비편향(Unbiased) 추정값을 계산합니다. 0보다 큰 지연에 해당되는 섹션을 선택하고 플로팅합니다.

[Rmm,lags] = xcorr(mtEcho,'unbiased');

Rmm = Rmm(lags>0);
lags = lags(lags>0);

figure
plot(lags/Fs,Rmm)
xlabel('Lag (s)')

자기상관은 에코가 도착한 지연에서 선명한 피크를 가집니다. IIR 시스템을 통해 신호를 필터링하고 에코를 소거합니다. IIR 시스템에서는 출력값 을 따르게 됩니다.

[~,dl] = findpeaks(Rmm,lags,'MinPeakHeight',0.22);

mtNew = filter(1,[1 zeros(1,dl-1) alpha],mtEcho);

필터링된 신호를 플로팅하고 원래 신호와 비교합니다.

subplot(2,1,1)
plot(t,orig)
legend('Original')

subplot(2,1,2)
plot(t,mtNew)
legend('Filtered')
xlabel('Time (s)')

% To hear, type soundsc(mtNew,Fs)

, , ()으로 지정된 11개 샘플로 이루어진 지수 시퀀스 3개를 생성합니다. stem3을 사용하여 시퀀스를 나란히 플로팅합니다.

N = 11;
n = (0:N-1)';

a = 0.4;
b = 0.7;
c = 0.999;

xabc = [a.^n b.^n c.^n];

stem3(n,1:3,xabc','filled')
ax = gca;
ax.YTick = 1:3;
view(37.5,30)

시퀀스에 대한 자기상관과 상호상관을 계산합니다. 지연값을 출력하여, 이 지연값을 추적할 필요가 없도록 합니다. 자기상관이 영차 지연에서 단위 값을 갖도록 결과를 정규화합니다.

[cr,lgs] = xcorr(xabc,'coeff');

for row = 1:3
    for col = 1:3
        nm = 3*(row-1)+col;
        subplot(3,3,nm)
        stem(lgs,cr(:,nm),'.')
        title(sprintf('c_{%d%d}',row,col))
        ylim([0 1])
    end
end

계산을 에서 사이의 지연값으로 제한합니다.

[cr,lgs] = xcorr(xabc,5,'coeff');

for row = 1:3
    for col = 1:3
        nm = 3*(row-1)+col;
        subplot(3,3,nm)
        stem(lgs,cr(:,nm),'.')
        title(sprintf('c_{%d%d}',row,col))
        ylim([0 1])
    end
end

자기상관과 상호상관에 대한 비편향 추정값을 계산합니다. 기본적으로, 지연값은 에서 사이입니다.

cu = xcorr(xabc,'unbiased');

for row = 1:3
    for col = 1:3
        nm = 3*(row-1)+col;
        subplot(3,3,nm)
        stem(-(N-1):(N-1),cu(:,nm),'.')
        title(sprintf('c_{%d%d}',row,col))
    end
end

으로 정의되는 28개 샘플로 이루어진 지수 시퀀스의 자기상관 함수를 계산합니다. 입니다.

a = 0.95;

N = 28;
n = 0:N-1;
lags = -(N-1):(N-1);

x = a.^n;
c = xcorr(x);

를 해석적으로 확인하여 결과의 정확성을 확인합니다. 더 큰 샘플 레이트를 사용하여 연속 상황을 시뮬레이션합니다. , 조건의 시퀀스 에 대한 자기상관 함수는 다음과 같습니다.

fs = 10;
nn = -(N-1):1/fs:(N-1);

dd = (1-a.^(2*(N-abs(nn))))/(1-a^2).*a.^abs(nn);

동일한 Figure에 시퀀스를 플로팅합니다.

stem(lags,c);
hold on
plot(nn,dd)
xlabel('Lag')
legend('xcorr','Analytic')
hold off

계산을 반복하되, 이번에는 자기상관에 대한 비편향 추정값을 구합니다. 비편향 추정값이 으로 해석될 수 있는지 확인합니다.

cu = xcorr(x,'unbiased');

du = dd./(N-abs(nn));

stem(lags,cu);
hold on
plot(nn,du)
xlabel('Lag')
legend('xcorr','Analytic')
hold off

계산을 반복하되, 이번에는 자기상관에 대한 편향 추정값을 구합니다. 편향 추정값이 으로 해석될 수 있는지 확인합니다.

cb = xcorr(x,'biased');

db = dd/N;

stem(lags,cb);
hold on
plot(nn,db)
xlabel('Lag')
legend('xcorr','Analytic')
hold off

영차 지연에서 단위(1) 값을 가지는 자기상관에 대한 추정값을 구합니다.

cz = xcorr(x,'coeff');

dz = dd/max(dd);

stem(lags,cz);
hold on
plot(nn,dz)
xlabel('Lag')
legend('xcorr','Analytic')
hold off

각각 16개 샘플로 구성된 두 개의 지수 시퀀스 에 대한 상호상관을 계산하고 플로팅합니다. 입니다.

N = 16;
n = 0:N-1;

a = 0.84;
b = 0.92;

xa = a.^n;
xb = b.^n;

r = xcorr(xa,xb);

stem(-(N-1):(N-1),r)

를 해석적으로 확인하여 결과의 정확성을 확인합니다. 더 큰 샘플 레이트를 사용하여 연속 상황을 시뮬레이션합니다. , 조건의 시퀀스 에 대한 상호상관 함수는 다음과 같습니다.

fs = 10;
nn = -(N-1):1/fs:(N-1);

cn = (1 - (a*b).^(N-abs(nn)))/(1 - a*b) .* ...
     (a.^nn.*(nn>0) + (nn==0) + b.^-(nn).*(nn<0));

동일한 Figure에 시퀀스를 플로팅합니다.

hold on
plot(nn,cn)

xlabel('Lag')
legend('xcorr','Analytic')

피연산자의 순서를 바꾸면 시퀀스가 역순으로 바뀌는지 확인합니다.

figure

stem(-(N-1):(N-1),xcorr(xb,xa))

hold on
stem(-(N-1):(N-1),fliplr(r),'--*')

xlabel('Lag')
legend('xcorr(x_b,x_a)','fliplr(xcorr(x_a,x_b))')

20개 샘플로 구성된 지수 시퀀스 을 생성합니다. 와의 상호상관을 계산하고 플로팅합니다. 플로팅이 더 용이하도록 지연값을 출력합니다. xcorr은 더 짧은 시퀀스의 끝부분에 0을 추가하여 더 긴 시퀀스와 길이가 같아지도록 합니다.

xc = 0.77.^(0:20-1);

[xca,la] = xcorr(xa,xc);
[xcb,lb] = xcorr(xb,xc);

figure

subplot(2,1,1)
stem(la,xca)
subplot(2,1,2)
stem(lb,xcb)
xlabel('Lag')

이 예제를 수행하려면 Parallel Computing Toolbox™가 필요합니다. 지원되는 GPU를 보려면 GPU Support by Release (Parallel Computing Toolbox) 항목을 참조하십시오.

1kHz로 샘플링되고 10Hz 사인파로 구성된 잡음 있는 신호를 생성합니다. gpuArray를 사용하여 컴퓨터의 GPU에 저장되는 gpuArray 객체를 생성합니다.

t = 0:0.001:10-0.001;
x = cos(2*pi*10*t) + randn(size(t));
X = gpuArray(x);

지연값 200까지 정규화된 자기상관 시퀀스를 구합니다. 출력값 xcgpuArray 객체입니다.

[xc,lags] = xcorr(X,200,'coeff');

데이터를 gather를 사용하여 GPU에서 MATLAB® 작업 공간으로 배정밀도 벡터 형식으로 전달합니다.

xc = gather(xc);

입력 인수

모두 축소

입력 배열로, 벡터, 행렬 또는 gpuArray 객체로 지정됩니다.

gpuArray 객체에 xcorr을 사용하는 방법에 대한 자세한 내용은 Run MATLAB Functions on a GPU (Parallel Computing Toolbox) 항목 및 GPU Support by Release (Parallel Computing Toolbox) 항목을 참조하십시오.

예: sin(2*pi*(0:9)/10) + randn([1 10])/10은 잡음이 있는 정현파를 행 벡터로 지정합니다.

예: sin(2*pi*[0.1;0.3]*(0:39))' + randn([40 2])/10은 잡음이 있는 2채널 정현파를 지정합니다.

예: gpuArray(sin(2*pi*(0:9)/10) + randn([1 10])/10)은 잡음이 있는 정현파를 gpuArray 객체로 지정합니다.

데이터형: single | double
복소수 지원 여부:

입력 배열로, 벡터나 gpuArray 객체로 지정됩니다.

데이터형: single | double
복소수 지원 여부:

최대 지연값으로, 정수 스칼라로 지정됩니다. maxlag를 지정할 경우, 반환된 상호상관 시퀀스의 범위는 –maxlag에서 maxlag까지입니다. maxlag를 지정하지 않으면 지연 범위가 2N – 1이 되며, 여기서 N은 xy 중 더 긴 쪽 길이입니다.

데이터형: single | double

정규화 옵션으로, 다음 중 하나로 지정됩니다.

  • 'none' — 스케일링되지 않은 원시 상호상관입니다. 이는 xy의 길이가 다른 경우 유일하게 허용되는 옵션입니다.

  • 'biased' — 상호상관의 편향 추정값입니다.

    R^xy,biased(m)=1NR^xy(m).

  • 'unbiased' — 상호상관의 비편향 추정값입니다.

    R^xy,unbiased(m)=1N|m|R^xy(m).

  • 'coeff' — 영차 지연에서 자기상관이 1이 되도록 시퀀스를 정규화합니다.

    R^xy,coeff(m)=1R^xx(0)R^yy(0)R^xy(m).

출력 인수

모두 축소

상호상관 시퀀스로, 벡터, 행렬 또는 gpuArray 객체로 반환됩니다.

x가 열에서 N개 채널을 나타내는 M × N 신호 행렬이면 xcorr(x)x의 채널에 대한 자기상관과 상호상관을 갖는 (2M – 1) × N2 행렬을 반환합니다. maxlag를 지정하면 r의 크기는 (2 × maxlag – 1) × N2이 됩니다.

예를 들어, S가 3채널 신호 S=(x1x2x3)이면 R = xcorr(S)의 결과는 다음과 같이 구성됩니다.

R=(Rx1x1Rx1x2Rx1x3Rx2x1Rx2x2Rx2x3Rx3x1Rx3x2Rx3x3).

지연값 인덱스로, 벡터로 반환됩니다.

세부 정보

모두 축소

상호상관과 자기상관

xcorr의 결과는 두 난수열 간의 상관 추정값으로 해석되거나 두 결정적 신호 간의 결정론적 상관으로 해석될 수 있습니다.

결합 정상 확률 과정 xn과 yn의 실제 상호상관 시퀀스는 다음과 같이 지정됩니다.

Rxy(m)=E{xn+myn*}=E{xnynm*},

여기서 −∞ < n < ∞입니다. 별표는 켤레 복소수를 나타내고, E는 기대값 연산자입니다. xcorr은 실제로 무한 길이 확률 과정의 한 실현에서 유한 부분만 사용 가능하기 때문에 시퀀스만 추정할 수 있습니다.

기본적으로, xcorr은 정규화 없이 원시 상관을 계산합니다.

R^xy(m)={n=0Nm1xn+myn,m0,R^yx*(m),m<0.

출력 벡터 c는 다음으로 지정되는 요소를 가집니다.

c(m)=R^xy(mN),m=1,2,,2N1.

일반적으로 상관 함수가 정확한 추정값을 생성하려면 정규화가 필요합니다. 입력 인수 scaleopt를 사용하여 상관의 정규화를 제어할 수 있습니다.

참고 문헌

[1] Buck, John R., Michael M. Daniel, and Andrew C. Singer. Computer Explorations in Signals and Systems Using MATLAB®. 2nd Edition. Upper Saddle River, NJ: Prentice Hall, 2002.

[2] Stoica, Petre, and Randolph Moses. Spectral Analysis of Signals. Upper Saddle River, NJ: Prentice Hall, 2005.

확장 기능

R2006a 이전에 개발됨