2017-01-29 9 views
1

MATLAB Я хочу, чтобы вычислить ИМК в соответствии с инструкциями нижемнимая часть когерентной

How calculate Imaginary part of coherence

я написал ниже код в MATLAB, но результат не то, что я ожидал. Является ли этот код действительной реализацией вышеуказанных инструкций? Может ли кто-нибудь помочь мне с лучшим кодом?

function [ imag_coherence] = imcoh(x,y) 
xy=xcorr(fft(x),fft(y)); 
xx=xcorr(fft(x)); 
yy=xcorr(fft(y)); 
imag_coherence=imag(xy./sqrt(xx.*yy)); 
end 
+0

В вашем коде нет комплексного сопряжения или ожидания, не так ли? –

+0

Я думаю, что xcorr сделает это, внутри себя. –

+0

Ваш код выглядит правильно, считаете ли вы его неправильным, потому что вывод является реальным числом? imag() возвращает только мнимую компоненту как действительное число (т. е. imag (3 + 4i) => 4). –

ответ

0

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)).

 Смежные вопросы

  • Нет связанных вопросов^_^