Кросс-корреляция в Matlab без использования встроенной функции? - PullRequest
8 голосов
/ 13 сентября 2011

Может кто-нибудь сказать, как сделать взаимную корреляцию двух речевых сигналов (каждый из 40000 сэмплов) в MATLAB без использования встроенной функции xcorr и коэффициента корреляции?

Заранее спасибо.

Ответы [ 3 ]

28 голосов
/ 13 сентября 2011

Вы можете сделать взаимные корреляции, используя 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
4 голосов
/ 13 сентября 2011

Если есть веская причина, по которой вы не можете использовать встроенный, вы можете использовать вместо этого свертку. Кросс-корреляция - это просто свертка без реверса, поэтому, чтобы «отменить» реверсирование интеграла корреляции, вы можете сначала применить дополнительный реверс к одному из ваших сигналов (который будет отменен в свертке).

3 голосов
/ 13 сентября 2011

Ну, йода дал хороший ответ, но я все равно упомянул об этом на всякий случай. Возвращаясь к определению дискретной взаимной корреляции, вы можете вычислить ее, не используя (слишком много) встроенных функций 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.

ОБНОВЛЕНИЕ: забыл упомянуть, что, на мой взгляд, Matlab не является подходящим инструментом для проведения кросс-корреляции в реальном времени больших наборов данных, я бы лучше попробовал его на C или других скомпилированных языках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...