function [trainingDataEEG,trainingDataEMG,kinPerSec] = generateTrainingData(signal,kin,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq)
bci_sf=params.SamplingRate.NumericValue;
signalWindowEMG=bci_sf*windowEMG;
signalWindowEEG=bci_sf*windowEEG;
tempEEG=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shift+1),maxEEGFreq-minEEGFreq+1]);
tempEMG=zeros(fix([6,fix(size(signal,1)/signalWindowEMG-1)*windowEMG/shift+1]));
%Filter around 50Hz and below 2 Hz
[A,B]= butter(2,[48 52]/(bci_sf/2),'stop');
[C,D]= butter(2,1/(bci_sf/2),'high');
[E,F]= butter(2,[148 152]/(bci_sf/2),'stop');
parfor i=1:32 %filter single channel, w/o EMG, HEOG, Synchro and 0s
tempEEG(i,:,:)=shiftingPburg(filtfilt(double(E),double(F),filtfilt(double(C),double(D),filtfilt(double(A),double(B),double(signal(:,i))))),bci_sf,windowEEG,shift,pburgOrder,minEEGFreq,maxEEGFreq);
%filtfilt stat filter
end % TODO: 8-30Hz, pburg bei kurzen Fenstern (Ordnung: Je nach SamplingRate, bei 2500: 32-50, Alpha, Beta peaks sollten sichtbar sein)
trainingDataEEG=permute(tempEEG,[2 1 3]);
usedChannels={'AbdPolLo','Biceps','Triceps','FrontDelt','MidDelt','BackDelt'};
emgchannels=find(ismember(params.ChannelNames.Value,usedChannels));
for i=1:6;
tempEMG(i,:)=waveformLength(filtfilt(double(E),double(F),filtfilt(double(C),double(D),filtfilt(double(A),double(B),double(signal(:,emgchannels(i)))))),bci_sf,windowEMG,shift);
end
trainingDataEMG=permute(tempEMG,[2 1 3]);
%shift kin according to synch channel in first minute
[~,startingPoint]=max(abs(diff(signal(1:60*bci_sf,size(signal,2)-1))));
% add time offset in ms to kin-time
offset=startingPoint/bci_sf*1000;
kin(:,1)=kin(:,1)+offset;
% disp(offset)
%add dummy timestamp at the end to fill kinematics
kin=[kin;kin(end,:)];
kin(end,1)=size(trainingDataEEG,1)*1000*shift+windowEEG*1000;
kinPerSec=shiftingKin(kin,windowEEG,shift);
end