xcorr
фактически вычисляет взаимную корреляцию между вычисленными спектрами (а суммирует вклады по всем частотам), а не ожидание поточечного умножения (т.е. при заданной фиксированной частоте) этих спектров. Последнее - то, что использует определение согласованности.
Предполагая, что процессы, производящие x
и y
, равны ergodic, ожидания можно оценить, вычислив среднее значение по многим блокам данных. Имея это в виду, это реализация когерентность, как описано в вашем определении может выглядеть следующим образом:
function [ result ] = coherency(x,y,N)
% divide data in N equal length blocks for averaging later on
L = floor(length(x)/N);
xt = reshape(x(1:L*N), L, N);
yt = reshape(y(1:L*N), L, N);
% transform to frequency domain
Xf = fft(xt,L,1);
Yf = fft(yt,L,1);
% estimate expectations by taking the average over N blocks
xy = sum(Xf .* conj(Yf), 2)/N;
xx = sum(Xf .* conj(Xf), 2)/N;
yy = sum(Yf .* conj(Yf), 2)/N;
% combine terms to get final result
result=xy./sqrt(xx.*yy);
end
Если вы хотите только мнимую часть, то это просто вопрос вычисления imag(coherency(x,y,N))
.
В вашем коде нет комплексного сопряжения или ожидания, не так ли? –
Я думаю, что xcorr сделает это, внутри себя. –
Ваш код выглядит правильно, считаете ли вы его неправильным, потому что вывод является реальным числом? imag() возвращает только мнимую компоненту как действительное число (т. е. imag (3 + 4i) => 4). –