Phalow_amphigh
Help ft_freqsimulation
% In the method 'phalow_amphigh' the signal is build up of 4 components; s1, s2, s3 and nois
% s1: amplitude modulation (AM), frequency of this signal should be lower than s2
% s2: second frequency, frequncy that becomes amplitude modulated
% s3: DC shift of s1, should have frequency of 0
% and the output consists of the following channel
% 1st channel: mixed signal = (s1 + s3)*s2 + noise,
% 2nd channel: s1
% 3rd channel: s2
% 4th channel: s3
% 5th channel: noise
Simulating the data
clear all; close all;
cfg = [];
cfg.method = 'phalow_amphigh';
cfg.fsample = 1000;
cfg.trllen = 10;
cfg.numtrl = 10;
cfg.output = 'all';
% amplitude modulation
cfg.s1.freq = 6;
cfg.s1.phase = 'random'; %phase differs over trials
cfg.s1.ampl = 1;
% frequency that becomes modulated
cfg.s2.freq = 40;
cfg.s2.phase = 'random'; %phase differs over trials
cfg.s2.ampl = 1;
% DC shift of S1
cfg.s3.freq = 0;
cfg.s3.phase = 0;
cfg.s3.ampl = 1; %determines amount of modulation, should be at least s1.ampl
% noise
cfg.noise.ampl = 0.5;
What does the signal look like?
data = ft_freqsimulation(cfg);
figure;
sel = 1:1000;
subplot(3,3,1); plot(data.trial{1}(1,sel)); title(data.label{1})
subplot(3,3,2); plot(data.trial{1}(2,sel)); title(data.label{2})
subplot(3,3,3); plot(data.trial{1}(3,sel)); title(data.label{3})
subplot(3,3,4); plot(data.trial{1}(4,sel)); title(data.label{4})
subplot(3,3,5); plot(data.trial{1}(5,sel)); title(data.label{5})
print -dpng phalow_amphigh_fig1.png
% show powerspectrum simulated data
cfg = [];
cfg.method = 'mtmfft';
cfg.channel = 'mix';
cfg.output = 'pow';
cfg.taper = 'hanning';
cfg.foilim = [2 60];
fft_data = ft_freqanalysis(cfg,data);
figure; ft_singleplotER([],fft_data);
print -dpng phalow_amphigh_fig2.png
Analysis Methods
Calculate power of power
% mtmconvol
cfg = [];
cfg.method = 'mtmconvol';
cfg.channel = 'mix';
cfg.output = 'pow';
cfg.taper = 'hanning';
cfg.foi = 2:2:60;
cfg.toi = data.time{1}(3001:7000); %power is calculated at every sample
cfg.t_ftimwin = 4./cfg.foi; %timewindow used to calculated power is 4 cycles long and therefore differs over frequencies
cfg.keeptrials = 'yes';
freq1 = ft_freqanalysis(cfg,data);
figure; imagesc(freq1.time, freq1.freq, squeeze(freq1.powspctrm(1,1,:,:)))
axis xy
print -dpng phalow_amphigh_fig3.png
% mtmfft output power
cfg = [];
cfg.method = 'mtmfft';
cfg.output = 'pow';
cfg.taper = 'hanning';
cfg.foilim = [2 60];
cfg.keeptrials = 'no';
freq2 = ft_freqanalysis(cfg,freq1); %FieldTrip automatically converts the freq1 data to raw data.
%Every frequency in the powerspectrum is converted to a a channel labeled mix@xxHz
freq2.freq2 = [2:2:60];
figure; imagesc(freq2.freq, freq2.freq2, freq2.powspctrm)
axis xy
print -dpng phalow_amphigh_fig4.png
Calculate coherence between power and raw
% mtmconvol
cfg = [];
cfg.method = 'mtmconvol';
cfg.channel = 'mix';
cfg.output = 'pow';
cfg.taper = 'hanning';
cfg.foi = 2:2:60;
cfg.toi = data.time{1}(3001:7000); %power is calculated at every sample
cfg.t_ftimwin = 4./cfg.foi; %timewindow used to calculated power is 4 cycles long and therefore differs over frequencies
cfg.keeptrials = 'yes';
freq1 = ft_freqanalysis(cfg,data);
% Make data same length as freq1
data_cut = data;
for iTr = 1:length(data.trial)
data_cut.trial{iTr} = data.trial{iTr}(:,3001:7000);
data_cut.time{iTr} = data.time{iTr}(3001:7000);
end
data_app = ft_appenddata([],data_cut, freq1); %contains original channel and channels with power
%FieldTrip automatically converts the freq1 data to raw data.
% mtmfft output cross-spectral-density between mix(raw) and freq1
cfg = [];
cfg.method = 'mtmfft';
cfg.output = 'powandcsd';
cfg.taper = 'hanning';
cfg.foilim = [2 60];
cfg.keeptrials = 'no';
cfg.pad = 4;
cfg.channelcmb = {'mix' 'mix@2Hz'; 'mix' 'mix@4Hz'; 'mix' 'mix@6Hz'; 'mix' 'mix@8Hz'; 'mix' 'mix@10Hz'; 'mix' 'mix@12Hz'; 'mix' 'mix@14Hz'; 'mix' 'mix@16Hz'; 'mix' 'mix@18Hz'; 'mix' 'mix@20Hz'; 'mix' 'mix@22Hz'; 'mix' 'mix@24Hz'; 'mix' 'mix@26Hz'; 'mix' 'mix@28Hz'; 'mix' 'mix@30Hz'; 'mix' 'mix@32Hz'; 'mix' 'mix@34Hz'; 'mix' 'mix@36Hz'; 'mix' 'mix@38Hz'; 'mix' 'mix@40Hz'; 'mix' 'mix@42Hz'; 'mix' 'mix@44Hz'; 'mix' 'mix@46Hz'; 'mix' 'mix@48Hz'; 'mix' 'mix@50Hz'; 'mix' 'mix@52Hz'; 'mix' 'mix@54Hz'; 'mix' 'mix@56Hz'; 'mix' 'mix@58Hz'; 'mix' 'mix@60Hz';};
freq2 = ft_freqanalysis(cfg,data_app);
% calculate coherence
coh = ft_freqdescriptives([],freq2);
coh.freq2 = [2:2:60];
figure; imagesc(coh.freq, coh.freq2, coh.powspctrm)
axis xy
print -dpng phalow_amphigh_fig5.png
% mtmfft output cross-spectral-density between s1 (AM)(raw) and freq1
cfg = [];
cfg.method = 'mtmfft';
cfg.output = 'powandcsd';
cfg.taper = 'hanning';
cfg.foilim = [2 60];
cfg.keeptrials = 'no';
cfg.pad = 4;
cfg.channelcmb = {'s1 (AM)' 'mix@2Hz'; 's1 (AM)' 'mix@4Hz'; 's1 (AM)' 'mix@6Hz'; 's1 (AM)' 'mix@8Hz'; 's1 (AM)' 'mix@10Hz'; 's1 (AM)' 'mix@12Hz'; 's1 (AM)' 'mix@14Hz'; 's1 (AM)' 'mix@16Hz'; 's1 (AM)' 'mix@18Hz'; 's1 (AM)' 'mix@20Hz'; 's1 (AM)' 'mix@22Hz'; 's1 (AM)' 'mix@24Hz'; 's1 (AM)' 'mix@26Hz'; 's1 (AM)' 'mix@28Hz'; 's1 (AM)' 'mix@30Hz'; 's1 (AM)' 'mix@32Hz'; 's1 (AM)' 'mix@34Hz'; 's1 (AM)' 'mix@36Hz'; 's1 (AM)' 'mix@38Hz'; 's1 (AM)' 'mix@40Hz'; 's1 (AM)' 'mix@42Hz'; 's1 (AM)' 'mix@44Hz'; 's1 (AM)' 'mix@46Hz'; 's1 (AM)' 'mix@48Hz'; 's1 (AM)' 'mix@50Hz'; 's1 (AM)' 'mix@52Hz'; 's1 (AM)' 'mix@54Hz'; 's1 (AM)' 'mix@56Hz'; 's1 (AM)' 'mix@58Hz'; 's1 (AM)' 'mix@60Hz';};
freq2 = ft_freqanalysis(cfg,data_app);
%calculate coherence
coh = ft_freqdescriptives([],freq2);
coh.freq2 = [2:2:60];
figure; imagesc(coh.freq, coh.freq2, coh.powspctrm)
axis xy
print -dpng phalow_amphigh_fig6.png
Power spectrum of amplitude envelope (by Hilbert transform)
% bandpass and hilbert (is automaticly abs of hilbert in ft_preprocessing)
cfg = [];
cfg.channel = 'mix';
cfg.bpfilter = 'yes';
cfg.bpfreq = [30 50];
cfg.hilbert = 'yes';
cfg.keeptrials = 'yes';
data_hilbert = ft_preprocessing(cfg,data);
figure
plot(data.time{1}(sel),data.trial{1}(1,sel))
hold on
plot(data_hilbert.time{1}(sel),data_hilbert.trial{1}(sel),'r', 'linewidth', 2)
print -dpng phalow_amphigh_fig7.png
% calculate powerspectrum of hilbert data
cfg = [];
cfg.method = 'mtmfft';
cfg.channel = 'mix';
cfg.output = 'pow';
cfg.taper = 'hanning';
cfg.foilim = [2 60];
fft_hilbert = ft_freqanalysis(cfg,data_hilbert);
% plot powerspectrum
cfg = []
cfg.xlim = [1 20];
figure; ft_singleplotER(cfg,fft_hilbert);
print -dpng phalow_amphigh_fig8.png