diff --git a/usedMcode/callAll.m b/usedMcode/callAll.m index dd68567..804c944 100644 --- a/usedMcode/callAll.m +++ b/usedMcode/callAll.m @@ -10,7 +10,8 @@ windowEMG=0.2; windowEEG=1; -shift=0.05; +shiftEMG=0.05; +shiftEEG=0.2; pburgOrder=50; minEEGFreq=0; maxEEGFreq=200; @@ -76,7 +77,7 @@ parfor j=1:size(numbersMat,2) number=numbersMat(j); subject=subjectsForNumbers{j}; - savePath=readAll(pathToFile,subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples); + savePath=readAll(pathToFile,subject,number,windowEMG,windowEEG,shiftEMG,shiftEEG,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples); % [meanAccurancysEMG(j),maxCEMG(j,:),cmScaledEMG(j,:,:)]=svmEciton(savePath,'EMG',k,maxExpC,maxPerClass); % [meanAccurancysEEG(j),maxCEEG(j,:),cmScaledEEG(j,:,:)]=svmEciton(savePath,'EEG',k,maxExpC,maxPerClass); % [meanAccurancysLF(j),maxCLF(j,:),cmScaledLF(j,:,:)]=svmEciton(savePath,'LF',k,maxExpC,maxPerClass); @@ -101,7 +102,7 @@ number=numbersMat(j); subject=subjectsForNumbers{j}; - savePath=readAll(pathToFile,subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples,EMGChannels,noSynergiesergies); + savePath=readAll(pathToFile,subject,number,windowEMG,windowEEG,shiftEMG,shiftEEG,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples,EMGChannels,noSynergiesergies); [meanAccurancysEMG,maxCEMG,cmScaledEMG(:,:)]=svmEciton(savePath,'EMG',k,maxExpC,maxPerClass); [meanAccurancysEEG,maxCEEG,cmScaledEEG(:,:)]=svmEciton(savePath,'EEG',k,maxExpC,maxPerClass); [meanAccurancysLF,maxCLF,cmScaledLF(:,:)]=svmEciton(savePath,'LF',k,maxExpC,maxPerClass); diff --git a/usedMcode/generateTrainingData.m b/usedMcode/generateTrainingData.m index 0d5ca7a..745d301 100644 --- a/usedMcode/generateTrainingData.m +++ b/usedMcode/generateTrainingData.m @@ -1,10 +1,10 @@ -function [trainingDataEEG,trainingDataEEGlf,trainingDataEMG,kinPerSec] = generateTrainingData(signal,kin,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq,noLFsamples,EMGChannels) +function [trainingDataEEG,trainingDataEEGlf,trainingDataEMG,kinPerSec] = generateTrainingData(signal,kin,windowEMG,windowEEG,shiftEMG,shiftEEG,params,pburgOrder,minEEGFreq,maxEEGFreq,noLFsamples,EMGChannels) 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]); - tempEEGlf=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shift+1),noLFsamples]); - tempEMG=zeros(fix([6,fix(size(signal,1)/signalWindowEMG-1)*windowEMG/shift+1])); + tempEEG=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shiftEEG+1),maxEEGFreq-minEEGFreq+1]); + tempEEGlf=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shiftEEG+1),noLFsamples]); + tempEMG=zeros(fix([6,fix(size(signal,1)/signalWindowEMG-1)*windowEMG/shiftEMG+1])); %Filter around 50Hz and below 2 Hz [A,B]= butter(2,[48 52]/(bci_sf/2),'stop'); @@ -16,22 +16,21 @@ [X,Y]= butter(2,1/(bci_sf/2),'low'); 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); - tempEEGlf(i,:,:)=shiftingDownsample(filtfilt(double(X),double(Y),filtfilt(double(V),double(W),double(signal(:,i)))),bci_sf,windowEEG,shift,noLFsamples); + tempEEG(i,:,:)=shiftingPburg(filtfilt(double(E),double(F),filtfilt(double(C),double(D),filtfilt(double(A),double(B),double(signal(:,i))))),bci_sf,windowEEG,shiftEEG,pburgOrder,minEEGFreq,maxEEGFreq); + tempEEGlf(i,:,:)=shiftingDownsample(filtfilt(double(X),double(Y),filtfilt(double(V),double(W),double(signal(:,i)))),bci_sf,windowEEG,shiftEEG,noLFsamples); end trainingDataEEG=permute(tempEEG,[2 1 3]); trainingDataEEGlf=permute(tempEEGlf,[2 1 3]); - trainingDataEMG=waveformLengthAll(signal(:,ismember(params.ChannelNames.Value,EMGChannels)),bci_sf,windowEMG,shift); + trainingDataEMG=waveformLengthAll(signal(:,ismember(params.ChannelNames.Value,EMGChannels)),bci_sf,windowEMG,shiftEMG); %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); + kin(end,1)=size(trainingDataEMG,1)*1000*shiftEMG+windowEMG*1000; + kinPerSec=shiftingKin(kin,windowEMG,shiftEMG); end diff --git a/usedMcode/readAll.m b/usedMcode/readAll.m index 6cc4fe8..c011a13 100644 --- a/usedMcode/readAll.m +++ b/usedMcode/readAll.m @@ -1,10 +1,10 @@ -function [savePath]=readAll(pathToFile, subject,number,windowEMG,windowEEG,shift,maxFile,... +function [savePath]=readAll(pathToFile, subject,number,windowEMG,windowEEG,shiftEMG,shiftEEG,maxFile,... threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples,EMGChannels,noSynergies) %fprintf('start read %s%i %s\n',subject,number,datestr(datetime('now'))); savePath=strcat(pathToFile,... - sprintf('../matlabData/%s%i%imsWindowEMG%isWindowEEG%imsShiftFreq%ito%iPause%ipBurg%i.mat',... - subject,number,windowEMG*1000,windowEEG,shift*1000,minEEGFreq,maxEEGFreq,pause,pburgOrder)); + sprintf('../matlabData/%s%i%imsWindowEMG%isWindowEEG%imsShiftEMG%imsShiftEEGFreq%ito%iPause%ipBurg%i.mat',... + subject,number,windowEMG*1000,windowEEG,shiftEMG*1000,shiftEEG*1000,minEEGFreq,maxEEGFreq,pause,pburgOrder)); %only create file if it doesn't exist yet if exist(savePath, 'file') ~= 2 @@ -23,7 +23,7 @@ sprintf('kin/%s_B1S00%iR0%i.txt',subject,number,i)),1,0); [trainingDataEEGcell{i},trainingDataEEGlfCell{i},... trainingDataEMGcell{i},kin{i}]=generateTrainingData(sig,... - tmpKin(:,1:4),windowEMG,windowEEG,shift,params,pburgOrder,... + tmpKin(:,1:4),windowEMG,windowEEG,shiftEMG,shiftEEG,params,pburgOrder,... minEEGFreq,maxEEGFreq,noLFsamples,EMGChannels); classesCell{i}=stat.StimulusCode; %fprintf('%ith file processed\n',i) @@ -40,23 +40,29 @@ clear trainingDataEEGcell trainingDataEMGcell classesCell kin classificationWithPause=classifyAccordingToEMG(size(... - trainingDataEEG,1), trainingDataEMG,classesMat,shift,... + trainingDataEEG,1), trainingDataEMG,classesMat,shiftEMG,... bci_sf,threshold,pause); clear classesMat - smoothClassification=zeros(size(classificationWithPause)); + smoothClassificationEMG=zeros(size(classificationWithPause)); for i=1:size(classificationWithPause,1) - smoothClassification(i)=round(mode(classificationWithPause(... + smoothClassificationEMG(i)=round(mode(classificationWithPause(... max(i-fix(bci_sf/1000),1):min(i+fix(bci_sf/1000),end)))); end clear classificationWithPause + + smoothClassificationEEG=zeros([size(trainingDataEEG,1),1]); + for i=1:size(smoothClassificationEEG,1) + smoothClassificationEEG(i)=mode(smoothClassificationEMG(fix(round(shiftEEG/shiftEMG*(i-1))+1):fix(round(shiftEEG/shiftEMG*i)))); + end - trainingDataEEG=trainingDataEEG(smoothClassification~=-1,:,:); - trainingDataEEGlf=trainingDataEEGlf(smoothClassification~=-1,:,:); - trainingDataEMG=trainingDataEMG(smoothClassification~=-1,:); - classification=smoothClassification(smoothClassification~=-1); - kinematics=kinMat(smoothClassification~=-1,:); + trainingDataEEG=trainingDataEEG(smoothClassificationEEG~=-1,:,:); + trainingDataEEGlf=trainingDataEEGlf(smoothClassificationEEG~=-1,:,:); + trainingDataEMG=trainingDataEMG(smoothClassificationEMG~=-1,:); + classificationEMG=smoothClassificationEMG(smoothClassificationEMG~=-1); + classificationEEG=smoothClassificationEEG(smoothClassificationEEG~=-1); + kinematics=kinMat(smoothClassificationEMG~=-1,:); ae=trainAutoencoder(trainingDataEMG',noSynergies,'ShowProgressWindow',false); synergiesAutoenc=encode(ae,trainingDataEMG')'; COEFF=pca(trainingDataEMG,'Centered',false); @@ -66,7 +72,7 @@ clear smoothClassification i save(savePath,'trainingDataEEG','trainingDataEEGlf','trainingDataEMG',... - 'classification','kinematics','synergiesAutoenc','synergiesPCA',... + 'classificationEMG','classificiationEEG','kinematics','synergiesAutoenc','synergiesPCA',... 'synergiesNNMF','-v7.3'); diff --git a/usedMcode/ridgeCV.m b/usedMcode/ridgeCV.m index d9af8f9..a9aea0c 100644 --- a/usedMcode/ridgeCV.m +++ b/usedMcode/ridgeCV.m @@ -28,25 +28,27 @@ error('only kin, Autoenc, PCA and NNMF are valid inputs for goal'); end + clear kinematics; + clear synergies*; + correlation=zeros(size(predicted,2),1); maxRidgeParamIndex=zeros(size(predicted,2),k); for j=1:size(predicted,2) randMap=randperm(size(trainingData,1)); - kin=predicted(:,j); + pred=predicted(:,j); correlations=zeros([k,1]); for i=1:k leaveData=trainingData(mod(randMap,k)==i-1,:); - leaveKin=kin(mod(randMap,k)==i-1); + leavePerd=pred(mod(randMap,k)==i-1); remainingData=trainingData(mod(randMap,k)~=i-1,:); - remainingKin=kin(mod(randMap,k)~=i-1); - %fprintf('%s create %ith model\n',datestr(datetime('now')),i) + remainingPred=pred(mod(randMap,k)~=i-1); - [coeffs,maxRidgeParamIndex(j,i)]=kFoldRidge(remainingData,remainingKin,k,ridgeParams); + [coeffs,maxRidgeParamIndex(j,i)]=kFoldRidge(remainingData,remainingPred,k,ridgeParams); - correlations(i)=ridgeCorrelation(leaveData,leaveKin,coeffs); + correlations(i)=ridgeCorrelation(leaveData,leavePerd,coeffs); end correlation(j)=mean(correlations); diff --git a/usedMcode/shiftingKin.m b/usedMcode/shiftingKin.m index f549076..d997a8d 100644 --- a/usedMcode/shiftingKin.m +++ b/usedMcode/shiftingKin.m @@ -1,10 +1,10 @@ -function [kinPerSec]=shiftingKin(kin, windowEEG, shift) - kinPerSec=zeros(fix((max(kin(:,1))-windowEEG*1000)/(shift*1000)),3); +function [kinPerSec]=shiftingKin(kin, windowEMG, shiftEMG) + kinPerSec=zeros(fix((max(kin(:,1))-windowEMG*1000)/(shiftEMG*1000)),3); for j=1:size(kinPerSec,1) - tmp=sum(diff(kin(kin(:,1)>(j-1)*shift*1000 & kin(:,1)<=(j-1)*shift*1000+windowEEG*1000,2:4))); + tmp=sum(diff(kin(kin(:,1)>(j-1)*shiftEMG*1000 & kin(:,1)<=(j-1)*shiftEMG*1000+windowEMG*1000,2:4))); i=j; while isnan(tmp) %interval is empty - tmp=sum(diff(kin(kin(:,1)>(i-1)*shift*1000 & kin(:,1)<=(i-1)*shift*1000+windowEEG*1000,2:4))); + tmp=sum(diff(kin(kin(:,1)>(i-1)*shiftEMG*1000 & kin(:,1)<=(i-1)*shiftEMG*1000+windowEMG*1000,2:4))); i=i+1; end kinPerSec(j,:)=tmp; diff --git a/usedMcode/svmEciton.m b/usedMcode/svmEciton.m index a4b40d0..c9456f2 100644 --- a/usedMcode/svmEciton.m +++ b/usedMcode/svmEciton.m @@ -6,17 +6,21 @@ %choose to estimate based on EEG or EMG if strcmp(EEG,'EEG') trainingData=trainingDataEEG; + classification=classificationEEG; elseif strcmp(EEG,'EMG') trainingData=trainingDataEMG; + classification=classificationEMG; elseif strcmp(EEG,'LF') trainingData=trainingDataEEGlf; + classification=classificationEEG; else error('only EEG, EMG and LF are valid inputs'); end - clear trainingDataEEG; - clear trainingDataEEGlf; - clear trainingDataEMG; + clear trainingDataE*; + clear classifiactionE*; + clear kinematics; + clear synergies*; accurancy=zeros(k,3); maxC=zeros(k,1); @@ -24,13 +28,11 @@ cm=zeros(noClasses); randMap=randperm(size(trainingData,1)); %disp('startCV') - classes=classification; %necessary since otherwise classes are not passed to workers - clear classification; parfor i=1:k leaveOut=trainingData(mod(randMap,k)==i-1,:,:); - leaveClasses=classes(mod(randMap,k)==i-1); + leaveClasses=classification(mod(randMap,k)==i-1); remaining=trainingData(mod(randMap,k)~=i-1,:,:); - remainingClasses=classes(mod(randMap,k)~=i-1); + remainingClasses=classification(mod(randMap,k)~=i-1); %fprintf('%s create %ith model\n',datestr(datetime('now')),i) [model,maxC(i)]=kfoldCV(remainingClasses,remaining,k,maxExpC,maxPerClass);