diff --git a/usedMcode/callAll.m b/usedMcode/callAll.m index b31acb6..2f2508b 100644 --- a/usedMcode/callAll.m +++ b/usedMcode/callAll.m @@ -14,12 +14,14 @@ windowEEG=1; shiftEMG=0.05; shiftEEG=0.2; + eegOffset=0; %predict actions x*shiftEEG after EEG measurement pburgOrder=250; minEEGFreq=2; %[Hz] maxEEGFreq=49; pause=false; % is all data 1s befor movement dropped? noLFsamples=5; + % Parameters tried for ridge regression ridgeParams=100; k=10; % k-fold CV (usually 10) @@ -28,7 +30,7 @@ maxPerClass=250; poolObj=parpool(32); -% structer data of runs +% structure data of runs [subjects,numbers]=namesAndNumbers(pathToFile); numbersMat=cell2mat(numbers); subjectsForNumbers=cell(size(numbersMat,2),1); @@ -130,7 +132,7 @@ save(strcat(pathToFile,sprintf('../matlabData/%s_callAll-%s.mat',datestr(datetime('now')),name))); else - % runn only for one random run + % run only for one random run j=fix(rand()*size(numbersMat,2)+1); number=numbersMat(j); diff --git a/usedMcode/callAllPos.m b/usedMcode/callAllPos.m index a6a2aa0..4654eed 100644 --- a/usedMcode/callAllPos.m +++ b/usedMcode/callAllPos.m @@ -8,22 +8,28 @@ allSubjects=true; %run all subjects and days or only one random day for one random subject name='Via2Syn'; %suffix for the output, has to be valid name for file (no space, /, ...) -windowEMG=0.2; + +% window and shift given in seconds +windowEMG=0.2; windowEEG=1; shiftEMG=0.05; shiftEEG=0.2; + eegOffset=0; %predict actions x*shiftEEG after EEG measurement pburgOrder=250; minEEGFreq=2; maxEEGFreq=49; pause=false; noLFsamples=5; +% Parameters tried for ridge regression ridgeParams=100; -k=1; +k=10; % k-fold CV (usually 10) +% Parameters tried for SVM: 2^-x to 2^x in steps of 1 in x maxExpC=0; maxPerClass=250; poolObj=parpool(32); +% structure data of runs [subjects,numbers]=namesAndNumbers(pathToFile); numbersMat=cell2mat(numbers); subjectsForNumbers=cell(size(numbersMat,2),1); @@ -37,7 +43,7 @@ end j=j-1; %number of trial-days for all subjects - +% run for all 51 runs if allSubjects % maxRidgeParamIndexEEGpos=zeros([j,3,k]); % maxRidgeParamIndexEMGpos=zeros([j,3,k]); @@ -74,6 +80,7 @@ save(strcat(pathToFile,sprintf('../matlabData/%s_callAll-%s.mat',datestr(datetime('now')),name))); else + % run only for one random run j=fix(rand()*size(numbersMat,2)+1); number=numbersMat(j); diff --git a/usedMcode/correlation2.m b/usedMcode/correlation2.m index 5fa53b2..6405984 100644 --- a/usedMcode/correlation2.m +++ b/usedMcode/correlation2.m @@ -1,4 +1,6 @@ function [R2]=correlation2(A,B) +% correlation2 calculates the elementwise squared correlation of two +% matrices if size(A)~=size(B) error('dimension mismatch') end diff --git a/usedMcode/evaluation.m b/usedMcode/evaluation.m index 6f5dee3..1558984 100644 --- a/usedMcode/evaluation.m +++ b/usedMcode/evaluation.m @@ -1,3 +1,4 @@ +% Collection of calls to create .mat for evaluation load('/home/jph/Uni/masterarbeit/evaluation.mat') % the data for the corresponding setting has to be loaded diff --git a/usedMcode/evaluationAccuracys.m b/usedMcode/evaluationAccuracys.m index ddb3690..f460e86 100644 --- a/usedMcode/evaluationAccuracys.m +++ b/usedMcode/evaluationAccuracys.m @@ -1,3 +1,4 @@ +% Collection of calls to evaluate the accuracys load('/home/jph/Uni/masterarbeit/evaluation.mat') figureSavePath='/home/jph/Uni/masterarbeit/text/thesis/pictures/results/'; diff --git a/usedMcode/evaluationCorrelations.m b/usedMcode/evaluationCorrelations.m index 60fcaf3..cfefdcc 100644 --- a/usedMcode/evaluationCorrelations.m +++ b/usedMcode/evaluationCorrelations.m @@ -1,3 +1,4 @@ +% Collection of calls to evaluate the correlations load('/home/jph/Uni/masterarbeit/evaluation.mat') figureSavePath='/home/jph/Uni/masterarbeit/text/thesis/pictures/results/'; diff --git a/usedMcode/evaluationSynergies.m b/usedMcode/evaluationSynergies.m index 2c48a9a..a11751b 100644 --- a/usedMcode/evaluationSynergies.m +++ b/usedMcode/evaluationSynergies.m @@ -1,3 +1,4 @@ +% Collection of calls to evaluate the synergies load('/home/jph/Uni/masterarbeit/evaluation.mat') synergies.Autoenc.Default3=correlations.EEG.Autoenc.Default; diff --git a/usedMcode/generateTrainingData.m b/usedMcode/generateTrainingData.m index 5409540..d959c3a 100644 --- a/usedMcode/generateTrainingData.m +++ b/usedMcode/generateTrainingData.m @@ -1,4 +1,6 @@ function [trainingDataEEG,trainingDataEEGlf,trainingDataEMG,kinPerSec] = generateTrainingData(signal,kin,windowEMG,windowEEG,shiftEMG,shiftEEG,params,pburgOrder,minEEGFreq,maxEEGFreq,noLFsamples,EMGChannels) +% generateTrainingData filters and transforms the signal and creates +% according velocities bci_sf=params.SamplingRate.NumericValue; signalWindowEEG=bci_sf*windowEEG; tempEEG=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shiftEEG+1),201]); diff --git a/usedMcode/generateTrainingDataPos.m b/usedMcode/generateTrainingDataPos.m index 6bb7d97..1c8249b 100644 --- a/usedMcode/generateTrainingDataPos.m +++ b/usedMcode/generateTrainingDataPos.m @@ -1,4 +1,6 @@ function [trainingDataEEG,trainingDataEEGlf,trainingDataEMG,kinPerSec] = generateTrainingDataPos(signal,kin,windowEMG,windowEEG,shiftEMG,shiftEEG,params,pburgOrder,minEEGFreq,maxEEGFreq,noLFsamples,EMGChannels) +% generateTrainingData filters and transforms the signal and creates +% according positions bci_sf=params.SamplingRate.NumericValue; signalWindowEEG=bci_sf*windowEEG; tempEEG=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shiftEEG+1),201]); diff --git a/usedMcode/kFoldRidge.m b/usedMcode/kFoldRidge.m index 7f69fab..8a15767 100644 --- a/usedMcode/kFoldRidge.m +++ b/usedMcode/kFoldRidge.m @@ -1,4 +1,6 @@ function [coeffs,maxRidgeParamIndex]=kFoldRidge(data,kin,k,ridgeParams) +% kFoldRidge does a k-fold Crossvalidation of parameter lambda for Ridge +% Regression if any(size(ridgeParams)>1) correlationPerParam=zeros(size(ridgeParams)); @@ -9,6 +11,7 @@ correlations=zeros(k,1); parfor i=1:k + %split into training and test set trainData=data(mod(randomMapping,k)+1~=i,:); testData=data(mod(randomMapping,k)+1==i,:); trainKin=kin(mod(randomMapping,k)+1~=i); @@ -17,8 +20,8 @@ coeffs=ridge(trainKin,trainData,param,0); correlations(i)=ridgeCorrelation(testData,testKin,coeffs); end - - correlationPerParam(ridgeParams==param)=mean(correlations); + % use mean correlation as correlation for the current parameter + correlationPerParam(ridgeParams==param)=mean(correlations); end [~,maxRidgeParamIndex]=max(correlationPerParam); else diff --git a/usedMcode/kfoldCV.m b/usedMcode/kfoldCV.m index 3b422f5..5fc6ea7 100644 --- a/usedMcode/kfoldCV.m +++ b/usedMcode/kfoldCV.m @@ -1,14 +1,16 @@ function [model,maxC] = kfoldCV(classification,trainingData,k,cExpMax,maxDataPerClass) +% kfoldCV does a k-fold Crossvalidation of parameter c for SVM noClasses=size(unique(classification),1); if cExpMax>0 %CV only if necessary cvAccuracy=zeros(2*cExpMax+1,1); - for cExp=1:2*cExpMax+1 + for cExp=1:2*cExpMax+1 % try different values for c c=2^(cExp-cExpMax-1); randomMapping=transpose(randperm(size(trainingData,1))); accuracy=zeros(k,3); parfor i=1:k + % split in training and test set trainData=trainingData(mod(randomMapping,k)+1~=i,:,:); testData=trainingData(mod(randomMapping,k)+1==i,:,:); trainClasses=classification(mod(randomMapping,k)+1~=i); @@ -19,7 +21,7 @@ model=svmtrain(trainClasses,trainData(:,:),sprintf('-t 0 -c %f -q',c)); [~, accuracy(i,:), ~]=svmpredict(testClasses, testData(:,:), model,'-q'); end - + %for each value for c take mean accuracy as accuracy cvAccuracy(cExp)=mean(accuracy(:,1)); end [~,maxC]=max(cvAccuracy); diff --git a/usedMcode/myDownsample.m b/usedMcode/myDownsample.m index b626167..8113abd 100644 --- a/usedMcode/myDownsample.m +++ b/usedMcode/myDownsample.m @@ -1,4 +1,5 @@ function [out]=myDownsample(in,noSamples) +% myDownsample samples in as noSamples equidistant values stepSize=max(size(in))/noSamples; out=in(fix((0:noSamples-1)*stepSize)+1); end \ No newline at end of file diff --git a/usedMcode/mySaveFigure.m b/usedMcode/mySaveFigure.m index 504c07e..c52c2aa 100644 --- a/usedMcode/mySaveFigure.m +++ b/usedMcode/mySaveFigure.m @@ -1,5 +1,5 @@ function []=mySaveFigure(fig,filename) - +% mySaveFigure saves fig (e.g. gcf) as filename set(fig,'Position',[251 49 1105 636]); axes = findobj(fig,'type','axes'); set(axes,'FontSize',12); diff --git a/usedMcode/namesAndNumbers.m b/usedMcode/namesAndNumbers.m index cedd10a..79cf196 100644 --- a/usedMcode/namesAndNumbers.m +++ b/usedMcode/namesAndNumbers.m @@ -1,4 +1,6 @@ function [names,numbers]=namesAndNumbers(pathToFile) +% namesAndNubers returns names and numbers of subjects and runs according +% to the file given (created by bashscript) fileID=fopen(strcat(pathToFile,'dirs.txt')); text=textscan(fileID,'%s','Delimiter','\n'); text=text{1}; diff --git a/usedMcode/noOfSynergies.m b/usedMcode/noOfSynergies.m index 761158e..8d76d0c 100644 --- a/usedMcode/noOfSynergies.m +++ b/usedMcode/noOfSynergies.m @@ -1,3 +1,4 @@ +% plots performance (squared elementwise correlation) for 1 to 6 synergies for Autoencoder, PCA and NNMF addpath('/home/hohlochj/masterarbeit/usedMcode') pathToFile='/nfs/wsi/ti/messor/hohlochj/origData/'; % pathToFile='/home/jph/Uni/masterarbeit/origData/'; diff --git a/usedMcode/overview.m b/usedMcode/overview.m index 625e15b..85cd814 100644 --- a/usedMcode/overview.m +++ b/usedMcode/overview.m @@ -1,3 +1,4 @@ +% outputs mean, std, min and max of declared input input=correlations.EEG.emg.Default; m=mean(input) diff --git a/usedMcode/plotCM.m b/usedMcode/plotCM.m index c0d291c..fd9d69b 100644 --- a/usedMcode/plotCM.m +++ b/usedMcode/plotCM.m @@ -1,4 +1,5 @@ function [fig] = plotCM(cm,figureTitle) +% plotCM plots a confusion matrix with the given title imagesc(squeeze(mean(cm,1))) colorbar(); fig=gcf; diff --git a/usedMcode/psdPlot.m b/usedMcode/psdPlot.m index a50a44b..af7b7a7 100644 --- a/usedMcode/psdPlot.m +++ b/usedMcode/psdPlot.m @@ -1,3 +1,4 @@ +% compares pwelch and pburg [sig, state, params] = load_bcidat(strcat(pathToFile,... sprintf('%s/%s_B100%i/%s_B1S00%iR02.dat',subject,subject,... number,subject,number))); diff --git a/usedMcode/readAll.m b/usedMcode/readAll.m index d732d04..1d18cab 100644 --- a/usedMcode/readAll.m +++ b/usedMcode/readAll.m @@ -1,6 +1,8 @@ function [savePath]=readAll(pathToFile, subject,number,windowEMG,windowEEG,shiftEMG,shiftEEG,maxFile,... threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples,EMGChannels,noSynergies) - +% readAll reads the data for given subject and run and saves it with the +% according parameters; savePath is returned +% if the file exists, nothing is done %fprintf('start read %s%i %s\n',subject,number,datestr(datetime('now'))); savePath=strcat(pathToFile,... sprintf('../matlabData/%s%i%imsWindowEMG%isWindowEEG%imsShiftEMG%imsShiftEEGFreq%ito%iPause%ipBurg%inoSyn%i.mat',... @@ -14,7 +16,8 @@ trainingDataEMGcell=cell(maxFile,1); classesCell=cell(maxFile,1); kin=cell([maxFile,1]); - + + % accumulate preprocessed data in cells for i=1:maxFile [sig, stat, params] = load_bcidat(strcat(pathToFile,... sprintf('%s/%s_B100%i/%s_B1S00%iR0%i.dat',subject,subject,... @@ -31,7 +34,8 @@ bci_sf=params.SamplingRate.NumericValue; clear sig - + + % reformat to matrices trainingDataEEG=cell2mat(trainingDataEEGcell); trainingDataEEGlf=cell2mat(trainingDataEEGlfCell); trainingDataEMG=cell2mat(trainingDataEMGcell); @@ -39,10 +43,12 @@ kinMat=cell2mat(kin); clear trainingDataEEGcell trainingDataEMGcell classesCell kin + % reclassification according to EMG classificationWithPause=classifyAccordingToEMG(trainingDataEMG,... classesMat,shiftEMG,bci_sf,threshold,pause); clear classesMat + % Smoother classifcation smoothClassificationEMG=zeros(size(classificationWithPause)); for i=1:size(classificationWithPause,1) smoothClassificationEMG(i)=round(mode(classificationWithPause(... @@ -59,6 +65,7 @@ shiftEEG/shiftEMG*i)),max(size(smoothClassificationEMG))))); end + % drop data according to classification trainingDataEEG=trainingDataEEG(smoothClassificationEEG~=-1,:,:); trainingDataEEGlf=trainingDataEEGlf(smoothClassificationEEG~=-1,:,:); trainingDataEMG=trainingDataEMG(smoothClassificationEMG~=-1,:); diff --git a/usedMcode/readAllPos.m b/usedMcode/readAllPos.m index d68bf85..92d214f 100644 --- a/usedMcode/readAllPos.m +++ b/usedMcode/readAllPos.m @@ -1,6 +1,8 @@ function [savePath]=readAllPos(pathToFile, subject,number,windowEMG,windowEEG,shiftEMG,shiftEEG,maxFile,... threshold,pburgOrder,minEEGFreq,maxEEGFreq,pause,noLFsamples,EMGChannels,noSynergies) - +% readAllPos reads the data for given subject and run and saves it with the +% according parameters; savePath is returned +% if the file exists, nothing is done %fprintf('start read %s%i %s\n',subject,number,datestr(datetime('now'))); savePath=strcat(pathToFile,... sprintf('../matlabData/%s%i%imsWindowEMG%isWindowEEG%imsShiftEMG%imsShiftEEGFreq%ito%iPause%ipBurg%inoSyn%iPos.mat',... @@ -15,6 +17,7 @@ classesCell=cell(maxFile,1); kin=cell([maxFile,1]); + % accumulate preprocessed data in cells for i=1:maxFile [sig, stat, params] = load_bcidat(strcat(pathToFile,... sprintf('%s/%s_B100%i/%s_B1S00%iR0%i.dat',subject,subject,... @@ -32,6 +35,7 @@ clear sig + % reformat to matrices trainingDataEEG=cell2mat(trainingDataEEGcell); trainingDataEEGlf=cell2mat(trainingDataEEGlfCell); trainingDataEMG=cell2mat(trainingDataEMGcell); @@ -39,10 +43,12 @@ kinMat=cell2mat(kin); clear trainingDataEEGcell trainingDataEMGcell classesCell kin + % reclassification according to EMG classificationWithPause=classifyAccordingToEMG(trainingDataEMG,... classesMat,shiftEMG,bci_sf,threshold,pause); clear classesMat + % Smoother classifcation smoothClassificationEMG=zeros(size(classificationWithPause)); for i=1:size(classificationWithPause,1) smoothClassificationEMG(i)=round(mode(classificationWithPause(... @@ -59,6 +65,7 @@ shiftEEG/shiftEMG*i)),max(size(smoothClassificationEMG))))); end + % drop data according to classification trainingDataEEG=trainingDataEEG(smoothClassificationEEG~=-1,:,:); trainingDataEEGlf=trainingDataEEGlf(smoothClassificationEEG~=-1,:,:); trainingDataEMG=trainingDataEMG(smoothClassificationEMG~=-1,:); diff --git a/usedMcode/readEMGSig.m b/usedMcode/readEMGSig.m index 8998eb7..e58b117 100644 --- a/usedMcode/readEMGSig.m +++ b/usedMcode/readEMGSig.m @@ -1,4 +1,5 @@ function [EMG]=readEMGSig(pathToFile,subject,number,maxFile,windowEMG,windowShift,EMGChannels) +% readEMGSig reads the EMG only EMGcell=cell(maxFile,1); for i=1:maxFile diff --git a/usedMcode/ridgeCV.m b/usedMcode/ridgeCV.m index b03226c..4d92c5f 100644 --- a/usedMcode/ridgeCV.m +++ b/usedMcode/ridgeCV.m @@ -1,6 +1,7 @@ function [correlation,maxRidgeParamIndex]=ridgeCV(savePath,data,goal,k,ridgeParams,eegOffset) +% ridgeCV runs a ridge regression to predict 'goal' from 'data' load(savePath); - clear classification; + clear classification; %classification is not need eeg=false; if strcmp(data,'EEG') eeg=true; @@ -15,7 +16,7 @@ else error('only EEG, EMG and LF are valid inputs for data'); end - + % if data is smaller then goal, goal is scaled down factor=size(trainingDataEMG,1)/(size(trainingData,1)+eegOffset); @@ -38,12 +39,14 @@ clear trainingDataEMG; clear synergies*; clear kinematics; - + + % is eeg Offset applied? if eeg predicted=predicted(1:end-eegOffset,:); end - disp([size(trainingData),size(predicted)]) + %disp([size(trainingData),size(predicted)]) + %adjust small errors when unsung down scaling minSize=min([size(trainingData,1),size(predicted,1)]); if minSize+5 via viaDataPredictedLeave=viaDataPredicted(mod(randMap,k)==i-1,:); viaDataPredictedRemaining=viaDataPredicted(mod(randMap,k)~=i-1,:); diff --git a/usedMcode/ridgeCorrelation.m b/usedMcode/ridgeCorrelation.m index 8929a02..b4ac947 100644 --- a/usedMcode/ridgeCorrelation.m +++ b/usedMcode/ridgeCorrelation.m @@ -1,6 +1,7 @@ function [correlation]=ridgeCorrelation(data,kin,coeffs) +% ridgeCorrelation calculates the correlation with given coefficients for +% ridge regression prediction=coeffs(1)+data*coeffs(2:end); correlation=corr(kin,prediction); - end \ No newline at end of file diff --git a/usedMcode/shiftingDownsample.m b/usedMcode/shiftingDownsample.m index 22da433..e923b60 100644 --- a/usedMcode/shiftingDownsample.m +++ b/usedMcode/shiftingDownsample.m @@ -1,4 +1,5 @@ function [out]=shiftingDownsample(signal,frequency,windowEEG,shift,noSamples) +% shiftingDownsample downsamples in shifting windows signalShift=frequency*shift; signalWindow=frequency*windowEEG; shiftProp=windowEEG/shift; diff --git a/usedMcode/shiftingKin.m b/usedMcode/shiftingKin.m index d997a8d..b5a14fb 100644 --- a/usedMcode/shiftingKin.m +++ b/usedMcode/shiftingKin.m @@ -1,4 +1,5 @@ function [kinPerSec]=shiftingKin(kin, windowEMG, shiftEMG) +% calculates velocity from kinematic data in shifting window 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)*shiftEMG*1000 & kin(:,1)<=(j-1)*shiftEMG*1000+windowEMG*1000,2:4))); diff --git a/usedMcode/shiftingPburg.m b/usedMcode/shiftingPburg.m index cd89da2..c6c1daf 100644 --- a/usedMcode/shiftingPburg.m +++ b/usedMcode/shiftingPburg.m @@ -1,6 +1,5 @@ function [ EEG ] = shiftingPburg( signal,frequency,windowEEG,shift,order,minEEGFreq,maxEEGFreq) %shiftingPburg uses pburg to calculate the power spectrum -% Detailed explanation goes here signalShift=frequency*shift; signalWindow=frequency*windowEEG; shiftProp=windowEEG/shift; diff --git a/usedMcode/shiftingPos.m b/usedMcode/shiftingPos.m index dfd263b..901c555 100644 --- a/usedMcode/shiftingPos.m +++ b/usedMcode/shiftingPos.m @@ -1,4 +1,5 @@ function [kinPerSec]=shiftingPos(kin, windowEMG, shiftEMG) +% shiftingPos calculates position in window by taking the mean kinPerSec=zeros(fix((max(kin(:,1))-windowEMG*1000)/(shiftEMG*1000)),3); for j=1:size(kinPerSec,1) tmp=mean(kin(kin(:,1)>(j-1)*shiftEMG*1000 & kin(:,1)<=(j-1)*shiftEMG*1000+windowEMG*1000,2:4)); diff --git a/usedMcode/shiftingSum.m b/usedMcode/shiftingSum.m index 7ad40b4..9495598 100644 --- a/usedMcode/shiftingSum.m +++ b/usedMcode/shiftingSum.m @@ -1,6 +1,6 @@ function [ output ] = shiftingSum( data,factor ) -%shiftingMean downsampling by taking the mean -% taking the mean of $factor data as new datum +%shiftingSum downsampling by taking the sum +% taking the sum of $factor data as new datum dataSize=size(data); output=zeros([fix(dataSize(1)/factor),dataSize(2:end)]); for i=1:size(output,1) diff --git a/usedMcode/svmEciton.m b/usedMcode/svmEciton.m index aceca35..a55d904 100644 --- a/usedMcode/svmEciton.m +++ b/usedMcode/svmEciton.m @@ -1,4 +1,5 @@ function [meanAccurancy,maxC, cmScaled]= svmEciton(savePath,EEG,k,maxExpC,maxPerClass,eegOffset,moveRest) +% svmEciton runs SVM in parallel to decide class for data with different Cs load(savePath) % fprintf('%i,%i,%i',size(trainingDataEMG,1),size(trainingDataEEG,1),size(classification,1)) addpath('/nfs/wsi/ti/messor/hohlochj/libsvm/matlab'); @@ -22,6 +23,7 @@ clear kinematics; clear synergies*; + % only intersting whether moving or resting if moveRest classification=double(classification~=0); end @@ -32,7 +34,8 @@ cm=zeros(noClasses); randMap=randperm(size(trainingData,1)); %disp('startCV') - parfor i=1:k + parfor i=1:k %k-fold CV + % split data into training and test set leaveOut=trainingData(mod(randMap,k)==i-1,:,:); leaveClasses=classification(mod(randMap,k)==i-1); remaining=trainingData(mod(randMap,k)~=i-1,:,:); @@ -44,9 +47,9 @@ [predictions,accuracy(i,:),~]=svmpredict(leaveClasses,leaveOut(:,:),model); cm=cm+confusionmat(leaveClasses,predictions); %confusion matrix end - meanAccurancy=mean(accuracy(:,1)); + meanAccurancy=mean(accuracy(:,1)); % accuracy is the mean of accuracys - cmScaled=zeros(size(cm)); + cmScaled=zeros(size(cm)); % scale confusion matrix to 0-1 for i=1:size(cm,1) cmScaled(i,:)=cm(i,:)/sum(cm(i,:)); end diff --git a/usedMcode/waveformLengthAll.m b/usedMcode/waveformLengthAll.m index 34eadcc..04e19d4 100644 --- a/usedMcode/waveformLengthAll.m +++ b/usedMcode/waveformLengthAll.m @@ -1,4 +1,5 @@ function [EMG]=waveformLengthAll(sig,bci_sf,windowEMG,shiftEMG) +% waveformLengthAll computes waveformlength after filtering sig %Filter around 50Hz and below 2 Hz [A,B]= butter(2,[48 52]/(bci_sf/2),'stop');