/ / Кръстосана корелация в MATLAB без използване на вградена функция? - MATLAB, обработка на сигнала, кръстосана корелация

Кръстосана корелация в MATLAB без използване на вградената функция? - MATLAB, обработка на сигнала, кръстосана корелация

може ли някой да каже как да направите кръстосана корелация на два реч сигнали (всеки от 40 000 проби) в MATLAB, без да използвате вградената функция xcorr и корелационния коефициент?

Благодаря предварително.

Отговори:

26 за отговор № 1

Можете да правите кръстосани корелации fft, Кръстосаната връзка на два вектора е просто продукт на техните съответни трансформации на Фурие, като една от трансформите е конюгирана.

Пример:

a=rand(5,1);
b=rand(5,1);
corrLength=length(a)+length(b)-1;

c=fftshift(ifft(fft(a,corrLength).*conj(fft(b,corrLength))));

Сравнете резултатите:

c =

0.3311
0.5992
1.1320
1.5853
1.5848
1.1745
0.8500
0.4727
0.0915

>> xcorr(a,b)

ans =

0.3311
0.5992
1.1320
1.5853
1.5848
1.1745
0.8500
0.4727
0.0915

3 за отговор № 2

Ако има някаква добра причина, поради която не можете да използватевграден, вместо това можете да използвате конволюция. Кръстосаната корелация е просто конволюция без обръщане, така че да "отмените" обръщането на корелацията на интеграла, в която първо можете да приложите допълнително обратно към един от вашите сигнали (което ще отмените в конволюцията).


3 за отговор № 3

Добре йода даде добър отговор, но мислех, че азспоменавайте това във всеки случай. Връщайки се към определението за дискретна кръстосана корелация можете да го изчислите без да използвате (твърде много) вградени Matlab функции (което трябва да бъде това, което Matlab прави с xcorr). Разбира се, все още има място за подобрение, тъй като аз не се опитах да векторизирам това:

n=1000;
x1=rand(n,1);
x2=rand(n,1);
xc=zeros(2*n-1,1);
for i=1:2*n-1
if(i>n)
j1=1;
k1=2*n-i;
j2=i-n+1;
k2=n;
else
j1=n-i+1;
k1=n;
j2=1;
k2=i;
end
xc(i)=sum(conj(x1(j1:k1)).*x2(j2:k2));
end
xc=flipud(xc);

Кое съвпада с резултата от xcorr функция.

UPDATE: забравих да спомена, че по мое мнение Matlab не е подходящият инструмент за правене на кръстосана корелация в реално време на големи комплекти от данни, бих предпочел да опитам в C или други компилирани езици.