How to calculate covariance using the wcoherence function
Afficher commentaires plus anciens
QUESTION:
Hi everyone
Is it possible to calculate the covariance of two signals, not by the standard cov function, but by wcoherence instead? Below is a code example:
% make data
rng default;
t = 0:0.001:2;
x = cos(2*pi*10*t).*(t>=0.5 & t<1.1)+cos(2*pi*50*t).*(t>= 0.2 & t< 1.4)+0.25*randn(size(t));
y = sin(2*pi*10*t).*(t>=0.6 & t<1.2)+sin(2*pi*50*t).*(t>= 0.4 & t<1.6)+ 0.35*randn(size(t));
% calculate cross-spectrum
[~,wcs,f,coi] = wcoherence(x,y,1/0.001);
wcs=real(wcs);
% covariances
cc_cov=cov(x,y);cc_cov=cc_cov(2);
cc_wcoh=trapz(t,trapz(f,wcs)); %????!
% plot results
figure
h = pcolor(t,log10(f),wcs);
h.EdgeColor = 'none';
ax = gca;
hold on;
plot(ax,t,log10(coi),'k--','linewidth',2);
colorbar;
ax.XLabel.String='Time (s)';
ax.YLabel.String='Logarithmic frequency';
ax.Title.String = {'Wavelet cross spectrum';['cov(x,y)=',num2str(cc_cov),' | cov_{wavelet}=',num2str(cc_wcoh)]};
Now, obviously my understanding of how to calculate the covariance from the wcoherence output (cov_wav) is flawed.
Can anyone help me get this right?
Essentially what I am trying to do is to calculate the cross spectrum of two signals and determine which regions in the resulting scalogram to include in an estimate of a covariance, as opposed to including everything (as is the case with the cov function).
Thanks in advance!
Cheers
Jakob
12 commentaires
Jan
le 26 Fév 2019
I dislike offering money in the forum and I'm happy, that this does not belong to the usual behavior here.
Jakob Sievers
le 26 Fév 2019
Modifié(e) : Jakob Sievers
le 26 Fév 2019
John D'Errico
le 4 Mar 2019
Modifié(e) : John D'Errico
le 4 Mar 2019
This is not a web site where services/solutions are offered for pay.
Jakob Sievers
le 4 Mar 2019
John D'Errico
le 4 Mar 2019
Then I'll see about getting that added to the guidelines in the next meeting.
Jakob Sievers
le 4 Mar 2019
Guillaume
le 5 Mar 2019
Mathworks probably needs to tidy up their guidelines page. I wasn't aware of the above community guideline page, which doesn't really match the Matlab Central Terms of Use which you can find in the footer of every page.
The terms of use are clear, under 2.iv:
"Content that you submit must be offered free of charge. You may not use the Site to sell or market your products or services to others."
Bjorn Gustavsson
le 6 Mar 2019
Just to add my 5 p to this discussion of principles: Neither the OP nor I have broken that term. I have offered the advice (for what they're worth) free of charge, he asked a question where he indicated he might pay for replies he would/might find useful. If Mathworks deem it preferable to prohibit posters to throw their money away using their forum that's their absolute right - but something about such a restriction rubs me the wrong way.
The value I've extracted from the matlab-news-group and file-exchange the last 20 odd years by far outweigh what any sensible person would consider paying for my advice, and I would never be cheap or vain enough to peddle them for money, nor do I care too much about the community brownie-points either (as an illustration: John d'Errico was a matlab-guru already 20 years ago and no amount of additional brownie-points will change that).
Beyond any guidelines, we have Kant's idea:
Act only according to that maxim whereby you can, at the same time, will that it should become a universal law.
Then we have two aspects:
- Someone offers money for a solution. If this is usual in the forum, say 90% of the questoins will cause a transer of money, the main idea of the forum would degrade soon: The voluntary mutual assistance and the interaction as a community. We would get advertising, envy and competition. The forum would not be a list of the best solutions anymore, but of the most aggressively advertised questions and answers.
- Someone offers money for a solution as a very rare exception. This will not influence the nature and efficiency of the forum. Maybe it has a positive effect on this single thread.
I've voted for the question, because I really like the discussion about offering money in the forum. I apperciate, that this will be a rare exception. In my opinion the OP Jakob did not offend anybody and did not break any rules or guidelines.
Some or many of the frequent contributors earn money with professional programming. It is very useful and likable, that this forum is not a colletions of cries to "buy me!", but that commercial interests are not discussed in public here.
Jakob Sievers
le 6 Mar 2019
Guillaume
le 6 Mar 2019
@Jakob,
Probably, your question is about a topic that few of us regular contributors know. And possibly, the very few that know about that topic didn't see your question. I doubt the addition of a monetary reward changed anything to that and you were just lucky that Bjorn saw it that time.
This particular question attracted more attention than usual because the monetary reward triggered a discussion off-Answers. I don't think there was any ruffled feathers. Just a bit more clucking than usual.
@Bjorn, Jan,
I think that the consensus of the regular contributors is that we don't want Answers to be a market place. And I believe that Mathworks don't want that (you can pay them for support). However, Mathworks do listen to our input, so Bjorn, I'd be interested to know why you don't like that restriction.
Bjorn Gustavsson
le 7 Mar 2019
The main objection is that it would restrict "how loud someone can shout for help" and there is something repugnant with that. If you aren't allowed to shout "a kingdom for a horse" we will never know that you're 5 minutes from dying from dehydration...
That's why I don't like the idea of a restriction, it has not till now been difficult to judge whether a help-me-Ill-pay-plea comes from an undergraduate that's been too lazy to learn or from someone with a real (more interesting) problem. It seems as the community culture of persistent tutting at those that do have been good enough to keep this at a very small fraction of the questions. As long as there is a restriction againg "selling" there will be no market, and I think that is enough to keep this at an unproblematic level. I see myself as a regular contributor, even though I no longer participate as actively as during the news-group-days, and though I dont want this forum to convert to a buying-selling consultation afair I certainly am no part of a consensus for a ban.
Finally, you're completely correct in that I only saw this question and not the previous ones - and I realised that I actually knew something about the topic.
Réponses (1)
Bjorn Gustavsson
le 19 Fév 2019
Well, to me it looks as if the wcoherence function returns a normalized cross-spectra, i.e. something like
WC = FT(A).*FT(B)/sqrd(|FT(A)|*|FT(B)|)
Since the covariance are not normalized like that (the correlation-matrix is), you cant go from WC - COV. Perhaps you can select periods to include in covariance clculations from time-periods with interesting coherence.
HTH
8 commentaires
Jakob Sievers
le 19 Fév 2019
Bjorn Gustavsson
le 19 Fév 2019
Well why wouldnt you calculate a cross-spectrum like:
fta = fft(A);
ftb = fft(B);
Xspec = fta*conj(ftb)
Or with help of the spectrogram function:
[SA,F,T] = spectrogram(A,WINDOW,NOVERLAP,F,Fs);
[SB,F,T] = spectrogram(B,WINDOW,NOVERLAP,F,Fs);
XAB = SA.*conj(SB);
That should give you something to calculate time-variations for covariances...
Jakob Sievers
le 23 Fév 2019
Bjorn Gustavsson
le 25 Fév 2019
OK, I think I made a typo for the cross-spectrum over the entire data-set. The moultiplication should be element-wise:
fta = fft(A);
ftb = fft(B);
Xspec = fta.*conj(ftb);
That said, you certainly can tell the spectrogram function what frequencies to use:
[S,F,T] = spectrogram(X,WINDOW,NOVERLAP,F,Fs);
There you can give it an array for F - granted you have to use a long enough window to capture variations at your frequencies of interest. If you want something like 0:(1/4):20, you should have a window over at least ~4 s. If you try spectrogram first for your data then you should get a feel for how a standard short-time FT works - if that doesn't give you enough resolution at higher frequencies then you proceed to wavelets or multi-taper versions. I'm "very pedestrian" so I have to aproach this on a step-by-step path.
HTH
Jakob Sievers
le 26 Fév 2019
Bjorn Gustavsson
le 26 Fév 2019
Your choise of frequencies seems a bit odd to me. If you just take the inverse of the first few frequencies you get the corresponding period-times of the low-frequency Fourier-component:
2400 2375.9 2352 2328.4 2305
That is very long period-times compared to the time of your window of 200 samples (10 s). Your entire measurement time is 2400 s, if I got it rights. If you want to separate variations with such periods you'll have to have data from a longer observation-period. Would this be something that gives good enough cross-spectra?
Fin = linspace(0,10,400);
[SA,F,T,PA] = spectrogram(A,400,200,Fin,20);
[SB,F,T,PB] = spectrogram(B,400,200,Fin,20);
XAB = real(SA.*conj(SB));
subplot(3,1,1)
pcolor(T,F,asinh(XAB)),shading flat
colorbar
subplot(3,1,2)
pcolor(T,F(5:end),XAB(5:end,:)),shading flat
colorbar
subplot(3,1,3)
pcolor(T,F(1:15),XAB(1:15,:)),shading flat
colorbar
HTH
Jakob Sievers
le 4 Mar 2019
Bjorn Gustavsson
le 5 Mar 2019
Well dont jump to that conclusion, the power-spectra is the Fourier-transform of the autocorrelation function, likewise for the cross-covariance and cross-spectra:
x = 0:100;
K = exp(-(x-20).^2/5^2) + exp(-(x-70).^2/12^2);
a = randn(5000,1);
b = randn(5000,1);
A = conv2(a,K','full');
B = conv2(b,K','full');
clf
subplot(2,1,1)
plot(fftshift(ifft((fft(A).*conj(fft(A)))))/numel(A),'r')
hold on
plot(xcorr(A,numel(A)/2,'unbiased'))
subplot(2,1,2)
xcAB = xcorr([A,B],numel(A)/2,'unbiased');
plot(fftshift(ifft((fft(A).*conj(fft(B)))))/numel(A),'r')
hold on
plot(xcAB(:,2))
The "only" difference between this and what you get with the spectrogram/wavelet spectra is that those methods cuts the data into shorter (possibly overlapping segments) and applies the same functions to those data-segements. Thus making it possible to see temporal variations in spectral content/covariance.
Catégories
En savoir plus sur Correlation and Convolution dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


