How do I create a matrix that is only the frequencies within the COI of a wavelet transform coherence?

4 ビュー (過去 30 日間)
I am measuring the wavelet transform coherence of two signals (x and y). I then am trying to take the average coherence within various frequency ranges. However, I only want to measure the coherence values within the cone of influence COI. How do I do this?
Currently I have the two signals and then conduct the wtc. The signals are attached as files
% define parameterts and signals
ts = 0.1; % time step
fs = 10; % frequency in Hz
t = (0:length(x) - 1)/10; % time vector
[wtc, f, coi] = wcoherence(x, y,fs);
Next, I assume I would create the matrix that is the coherence values within the cone of influence.
coiDatamatrix = ?? % a matrix of only the wtc values within the coi
Finaly, I would take the average coherence within the frequency range 0.125-0.3 Hz
freqRange = [0.125 0.3];
% % Find indices corresponding to the frequency range
freqIndices = find(f >= freqRange(1) & f <= freqRange(2));
% Extract coherence values in the frequency range within the COI
coherenceInRange = coiDatamatrix(freqIndices)
% Calculate average coherence (ignoring NaNs)
averageCoherence = mean(coherenceInRange);
  5 件のコメント
FsC
FsC 2023 年 11 月 17 日
Yes, of course. I've attached the coherence matric (wtc), coi array, and frequency array (f). The original signal is 2 minutes long and sampled at 10 Hz. Attached is also an image of the graphical output for this data.
Thank you for your help!
Mathieu NOE
Mathieu NOE 2023 年 11 月 20 日
ok I think I got it to work now , see in the answer section below

サインインしてコメントする。

採用された回答

Mathieu NOE
Mathieu NOE 2023 年 11 月 20 日
so now the final code
the idea is to create a mask so that wtc values that lies below the coi curve are zeroed
% specific code (to remove)
load('f.mat')
load('coi.mat')
load('wtc.mat')
n = numel(coi);
t = (0:n - 1)*ts; % time vector
% define parameterts and signals
fs = 10; % frequency in Hz
ts = 1/fs; % time step
% t = (0:length(x) - 1)*ts; % time vector
% [wtc, wcs, f, coi] = wcoherence(x, y,fs);
% create a mask (coi) so data below coi curve are zeroed
[m,n] = size(wtc);
mask = ones(m,n);
tmp = mask;
ind = round(m*coi/max(f));
for ci =1:n
mask(1:ind(ci),ci) = 0;
end
mask = flipud(mask);
% apply Coi mask
wtc = wtc.*mask;
% plot wtc within coi bounds
imagesc(t,f,abs(wtc));
set(gca,'YDir','normal');
title('X1');
xlabel('Time (samples)')
ylabel('Frequency (Hz)')
colormap('jet')
colorbar('vert')
hold on
plot(t,coi,'--w','linewidth',3);
% Finaly, I would take the average coherence within the frequency range 0.125-0.3 Hz
freqRange = [0.125 0.3];
% % Find indices corresponding to the frequency range
freqIndices = find(f >= freqRange(1) & f <= freqRange(2));
% Extract coherence values in the frequency range within the COI
coherenceInRange = abs(wtc(freqIndices,:));
% Calculate average coherence (ignoring NaNs)
averageCoherence = mean(coherenceInRange,'all','omitnan');
on your side you simply have to remove these lines
% specific code (to remove)
load('f.mat')
load('coi.mat')
load('wtc.mat')
n = numel(coi);
t = (0:n - 1)*ts; % time vector
and uncomment this one
% t = (0:length(x) - 1)*ts; % time vector
% [wtc, wcs, f, coi] = wcoherence(x, y,fs);
hope it helps !
  2 件のコメント
FsC
FsC 2023 年 11 月 20 日
This is perfect! Thank you so much for your help and knowledge!
Mathieu NOE
Mathieu NOE 2023 年 11 月 21 日
My pleasure !
one last thing : you can remove that line
tmp = mask;
all the best

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeContinuous Wavelet Transforms についてさらに検索

製品


リリース

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by