In Matlab and Octave, cohere(x,y,M) computes the coherence
function
using successive DFTs of length
with a Hanning
window and 50% overlap. (The window and overlap can be controlled
via additional optional arguments.) The following matlab illustrates
cohere on a simple example:
% Illustrate estimation of coherence function 'cohere'
% in Matlab, or Octave + Octave Forge:
N = 1024; % number of samples
x=randn(1,N); % Gaussian noise
y=randn(1,N); % Uncorrelated noise
f0 = 1/4; % Frequency of high coherence
nT = [0:N-1]; % Time axis
w0 = 2*pi*f0;
x = x + cos(w0*nT); % Let something be correlated
p = 2*pi*rand(1,1); % Phase is irrelevant
y = y + cos(w0*nT+p);
M = round(sqrt(N)); % Typical window length
[cxyM,w] = cohere(x,y,M); % Do the work
figure(1); clf;
stem(w/2,cxyM,'*'); % w goes from 0 to 1 (odd convention)
legend(''); % needed in Octave
grid on;
ylabel('Coherence');
xlabel('Normalized Frequency (cycles/sample)');
axis([0 1/2 0 1]);
replot; % Needed in Octave
saveplot('../eps/coherex.eps'); % compatibility utility
Figure 8.14 shows a plot of cxyM for this example.
We see a coherence peak at frequency
cycles/sample, as
expected, but there are also two rather large coherence samples on
either side of the main peak. These are expected as well, since the
true cross-spectrum for this case is a critically sampled Hanning
window transform. (A window transform is critically sampled whenever
the window length equals the FFT length.)
Note that more than one frame must be averaged to obtain a coherence less than one. For example, changing the cohere call in the above example to
cxyN = cohere(x,y,N);produces all ones in cxyN, because no averaging is performed.