diff --git a/usedMcode/callAll.m b/usedMcode/callAll.m index 0e333b2..896046d 100644 --- a/usedMcode/callAll.m +++ b/usedMcode/callAll.m @@ -13,6 +13,7 @@ minEEGFreq=0; maxEEGFreq=200; pause=false; +noLFsamples=5; ridgeParams=[0.1]; k=10; maxExpC=0; @@ -38,22 +39,30 @@ meanAccurancysEMG=zeros([j,1]); meanAccurancysEEG=zeros([j,1]); + meanAccurancysLF=zeros([j,1]); maxCEMG=zeros([j,k,1]); maxCEEG=zeros([j,k,1]); + maxCLF=zeros([j,k,1]); cmScaledEMG=zeros([j,5,5]); cmScaledEEG=zeros([j,5,5]); - maxRidgeParamIndex=zeros([j,3,k]); + cmScaledLF=zeros([j,5,5]); + maxRidgeParamIndexEEG=zeros([j,3,k]); + maxRidgeParamIndexEMG=zeros([j,3,k]); + maxRidgeParamIndexLF=zeros([j,3,k]); correlationEMG=zeros([j,3]); %x,y,angle correlationEEG=zeros([j,3]); + correlationLF=zeros([j,3]); parfor j=1:size(numbersMat,2) number=numbersMat(j); subject=subjectsForNumbers{j}; - savePath=readEEG(pathToFile,subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause); - [meanAccurancysEMG(j),maxCEMG(j,:),cmScaledEMG(j,:,:)]=svmEciton(savePath,~EEG,k,maxExpC,maxPerClass); - [meanAccurancysEEG(j),maxCEEG(j,:),cmScaledEEG(j,:,:)]=svmEciton(savePath,EEG,k,maxExpC,maxPerClass); - [correlationEMG(j,:),maxRidgeParamIndex(j,:,:)]=ridgeCV(savePath,false,k,ridgeParams); - [correlationEEG(j,:),maxRidgeParamIndex(j,:,:)]=ridgeCV(savePath,EEG,k,ridgeParams); + savePath=readEEG(pathToFile,subject,number,windowEMG,windowEEG,shift,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); + [correlationEMG(j,:),maxRidgeParamIndexEMG(j,:,:)]=ridgeCV(savePath,'EMG',k,ridgeParams); + [correlationEEG(j,:),maxRidgeParamIndexEEG(j,:,:)]=ridgeCV(savePath,'EEG',k,ridgeParams); + [correlationLF(j,:),maxRidgeParamIndexLF(j,:,:)]=ridgeCV(savePath,'LF',k,ridgeParams); fprintf('%s%i finished %s\n',subject,number,datestr(datetime('now'))) end @@ -63,11 +72,13 @@ number=numbersMat(j); subject=subjectsForNumbers{j}; - savePath=readEEG(pathToFile,subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause); - [meanAccurancysEMG,maxCEMG,cmScaledEMG(:,:)]=svmEciton(savePath,~EEG,k,maxExpC,maxPerClass); - [meanAccurancysEEG,maxCEEG,cmScaledEEG(:,:)]=svmEciton(savePath,EEG,k,maxExpC,maxPerClass); - [correlationEMG,maxRidgeParamIndex(:,:)]=ridgeCV(savePath,false,k,ridgeParams); - [correlationEEG,maxRidgeParamIndex(:,:)]=ridgeCV(savePath,EEG,k,ridgeParams); + savePath=readEEG(pathToFile,subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples); + [meanAccurancysEMG,maxCEMG,cmScaledEMG(:,:)]=svmEciton(savePath,'EMG',k,maxExpC,maxPerClass); + [meanAccurancysEEG,maxCEEG,cmScaledEEG(:,:)]=svmEciton(savePath,'EEG',k,maxExpC,maxPerClass); + [meanAccurancysEEG,maxCEEG,cmScaledEEG(:,:)]=svmEciton(savePath,'LF',k,maxExpC,maxPerClass); + [correlationEMG,maxRidgeParamIndexEMG(:,:)]=ridgeCV(savePath,'EMG',k,ridgeParams); + [correlationEEG,maxRidgeParamIndexEEG(:,:)]=ridgeCV(savePath,'EEG',k,ridgeParams); + [correlationLF,maxRidgeParamIndexLF(:,:)]=ridgeCV(savePath,'LF',k,ridgeParams); fprintf('%s%i finished %s\n',subject,number,datestr(datetime('now'))) save(strcat(pathToFile,sprintf('../matlabData/%s_call%s%i.mat',datestr(datetime('now')),subject,number))); diff --git a/usedMcode/downsample.m b/usedMcode/downsample.m new file mode 100644 index 0000000..8a7c04c --- /dev/null +++ b/usedMcode/downsample.m @@ -0,0 +1,4 @@ +function [out]=downsample(in,noSamples) + indices=randperm(size(in,1)); + out=in(indices(1:noSamples)); +end \ No newline at end of file diff --git a/usedMcode/generateTrainingData.m b/usedMcode/generateTrainingData.m index 3f9fda5..c348d0b 100644 --- a/usedMcode/generateTrainingData.m +++ b/usedMcode/generateTrainingData.m @@ -1,9 +1,9 @@ -function [trainingDataEEG,trainingDataEEGlf,trainingDataEMG,kinPerSec] = generateTrainingData(signal,kin,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq) +function [trainingDataEEG,trainingDataEEGlf,trainingDataEMG,kinPerSec] = generateTrainingData(signal,kin,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq,noLFsamples) 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),maxEEGFreq-minEEGFreq+1]); + tempEEGlf=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shift+1),noLFsamples]); tempEMG=zeros(fix([size(signal,2)-3-32,fix(size(signal,1)/signalWindowEMG-1)*windowEMG/shift+1])); %Filter around 50Hz and below 2 Hz @@ -17,7 +17,7 @@ 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,:,:)=filtfilt(double(X),double(Y),filtfilt(double(V),double(W),double(signal(:,i)))) + tempEEGlf(i,:,:)=shiftingDownsample(filtfilt(double(X),double(Y),filtfilt(double(V),double(W),double(signal(:,i)))),bci_sf,windowEEG,shift,noLFsamples); end trainingDataEEG=permute(tempEEG,[2 1 3]); trainingDataEEGlf=permute(tempEEGlf,[2 1 3]); diff --git a/usedMcode/readEEG.m b/usedMcode/readEEG.m index d29f41e..78f28fe 100644 --- a/usedMcode/readEEG.m +++ b/usedMcode/readEEG.m @@ -1,4 +1,4 @@ -function [savePath]=readEEG(pathToFile, subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause) +function [savePath]=readEEG(pathToFile, subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples) %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)); @@ -15,7 +15,7 @@ for i=1:maxFile [sig, stat, params] = load_bcidat(strcat(pathToFile,sprintf('%s/%s_B100%i/%s_B1S00%iR0%i.dat',subject,subject,number,subject,number,i))); tmpKin=csvread(strcat(pathToFile,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,minEEGFreq,maxEEGFreq); + [trainingDataEEGcell{i},trainingDataEEGlfCell{i},trainingDataEMGcell{i},kin{i}]=generateTrainingData(sig,tmpKin(:,1:4),windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq,noLFsamples); classesCell{i}=stat.StimulusCode; %fprintf('%ith file processed\n',i) end diff --git a/usedMcode/ridgeCV.m b/usedMcode/ridgeCV.m index 3a41e09..421641f 100644 --- a/usedMcode/ridgeCV.m +++ b/usedMcode/ridgeCV.m @@ -1,11 +1,17 @@ function [correlation,maxRidgeParamIndex]=ridgeCV(savePath,EEG,k,ridgeParams) load(savePath); clear classification; - if EEG + + if strcomp(EEG,'EEG') trainingData=trainingDataEEG; - else + elseif strcomp(EEG,'EMG') trainingData=trainingDataEMG; + elseif strcomp(EEG,'LF') + trainingData=trainingDataEEGlf; + else + error('only EEG,EMG and LF are valid inputs'); end + clear trainingDataEEG; clear trainingDataEMG; diff --git a/usedMcode/shiftingDownsample.m b/usedMcode/shiftingDownsample.m new file mode 100644 index 0000000..79850ad --- /dev/null +++ b/usedMcode/shiftingDownsample.m @@ -0,0 +1,10 @@ +function [out]=shiftingDownsample(signal,frequency,windowEEG,shift,noSamples) + signalShift=frequency*shift; + signalWindow=frequency*windowEEG; + shiftProp=windowEEG/shift; + noOfWindows=fix(floor(size(signal,1)/signalWindow-1)*shiftProp+1); + out=zeros([noOfWindows,noSamples]); + for j=1:noOfWindows + out(j,:)=downsample(signal((j-1)*signalShift+1:(j-1)*signalShift+signalWindow),noSamples); + end +end \ No newline at end of file diff --git a/usedMcode/shiftingPburg.m b/usedMcode/shiftingPburg.m index e43fbaa..cd89da2 100644 --- a/usedMcode/shiftingPburg.m +++ b/usedMcode/shiftingPburg.m @@ -4,8 +4,9 @@ signalShift=frequency*shift; signalWindow=frequency*windowEEG; shiftProp=windowEEG/shift; - EEG=zeros([fix(floor(size(signal,1)/signalWindow)-1)*shiftProp+1,fix(maxEEGFreq-minEEGFreq+1)]); - for j=1:fix(floor(size(signal,1)/signalWindow-1)*shiftProp+1) + noOfWindows=fix(floor(size(signal,1)/signalWindow-1)*shiftProp+1); + EEG=zeros([noOfWindows,fix(maxEEGFreq-minEEGFreq+1)]); + for j=1:noOfWindows [EEG(j,:),~]=pburg(signal((j-1)*signalShift+1:(j-1)*signalShift+signalWindow),order,minEEGFreq:maxEEGFreq,frequency); end end diff --git a/usedMcode/svmEciton.m b/usedMcode/svmEciton.m index 0295064..18b1b39 100644 --- a/usedMcode/svmEciton.m +++ b/usedMcode/svmEciton.m @@ -4,12 +4,18 @@ addpath('/nfs/wsi/ti/messor/hohlochj/libsvm/matlab'); %choose to estimate based on EEG or EMG - if EEG + if strcomp(EEG,'EEG') trainingData=trainingDataEEG; - else + elseif strcomp(EEG,'EMG') trainingData=trainingDataEMG; + elseif strcomp(EEG,'LF') + trainingData=trainingDataEEGlf; + else + error('only EEG,EMG and LF are valid inputs'); end + clear trainingDataEEG; + clear trainingDataEEGlf; clear trainingDataEMG; accurancy=zeros(k,3);