diff --git a/classifyAccordingToEMG.m b/classifyAccordingToEMG.m index 8805818..4937188 100644 --- a/classifyAccordingToEMG.m +++ b/classifyAccordingToEMG.m @@ -11,7 +11,7 @@ classification(j)=-1; %code for pause end for j=max(fix(i-0.5/shift),1):i % half a second before executed movement there should be activity (esp. EEG) - classification(j)=-1; + classification(j)=-1; %if -1 there is a pause of 1s befor movement onset end oldclass=class; end diff --git a/generateTrainingData.m b/generateTrainingData.m index fa16f55..5a04b26 100644 --- a/generateTrainingData.m +++ b/generateTrainingData.m @@ -1,16 +1,16 @@ -function [trainingDataEEG,trainingDataEMG] = generateTrainingData(signal,NFFT,windowEMG,windowEEG,shift,params,pburgOrder) +function [trainingDataEEG,trainingDataEMG] = generateTrainingData(signal,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq) frequency=params.SamplingRate.NumericValue; signalWindowEMG=frequency*windowEMG; signalWindowEEG=frequency*windowEEG; - tempEEG=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shift+1),NFFT/2+1]); + tempEEG=zeros([32,fix(floor(size(signal,1)/signalWindowEEG-1)*windowEEG/shift+1),maxEEGFreq-minEEGFreq]); tempEMG=zeros(fix([size(signal,2)-3-32,fix(size(signal,1)/signalWindowEMG-1)*windowEMG/shift+1])); %Filter around 50Hz and below 2 Hz [A,B]= butter(2,[48 52]/(frequency/2),'stop'); - [C,D]= butter(2,2/(frequency/2),'high'); + [C,D]= butter(2,1/(frequency/2),'high'); parfor i=1:32 %filter single channel, w/o HEOG, Synchro and 0s - tempEEG(i,:,:)=shiftingPburg(filter(C,D,filter(A,B,signal(:,i))),frequency,windowEEG,shift,NFFT,pburgOrder); + tempEEG(i,:,:)=shiftingPburg(filter(C,D,filter(A,B,signal(:,i))),frequency,windowEEG,shift,pburgOrder,minEEGFreq,maxEEGFreq); 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]); diff --git a/read.m b/read.m index 6f0b938..6210be3 100644 --- a/read.m +++ b/read.m @@ -1,9 +1,8 @@ close all -clear all +clear variables %params disp('start') disp(datestr(datetime('now'))) -NFFT=2048; windowEMG=0.2; windowEEG=1; shift=0.2; @@ -12,6 +11,8 @@ maxFile=5; threshold=7500; pburgOrder=32; +minEEGFreq=0; %Hz +maxEEGFreq=200; %Hz trainingDataEEGcell=cell(maxFile,1); @@ -20,7 +21,7 @@ for i=1:maxFile [sig, stat, params] = load_bcidat(sprintf('/home/jph/Uni/masterarbeit/Block1_ReachingMovements/AO/AO_B1001/AO_B1S001R0%i.dat',i)); - [trainingDataEEGcell{i},trainingDataEMGcell{i}]=generateTrainingData(sig,NFFT,windowEMG,windowEEG,shift,params,pburgOrder); + [trainingDataEEGcell{i},trainingDataEMGcell{i}]=generateTrainingData(sig,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq); classesCell{i}=stat.StimulusCode; fprintf('%ith file processed\n',i) end diff --git a/shiftingPburg.m b/shiftingPburg.m index fe32166..e43fbaa 100644 --- a/shiftingPburg.m +++ b/shiftingPburg.m @@ -1,13 +1,12 @@ -function [ EEG ] = shiftingPburg( signal,frequency,window,windowShift,NFFT,order) +function [ EEG ] = shiftingPburg( signal,frequency,windowEEG,shift,order,minEEGFreq,maxEEGFreq) %shiftingPburg uses pburg to calculate the power spectrum % Detailed explanation goes here - signalShift=frequency*windowShift; - signalWindow=frequency*window; - shiftProp=window/windowShift; - EEG=zeros([fix(floor(size(signal,1)/signalWindow)-1)*shiftProp+1,NFFT/2+1]); + 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) - EEG(j,:)=pburg(signal((j-1)*signalShift+1:(j-1)*signalShift+signalWindow),order,NFFT); + [EEG(j,:),~]=pburg(signal((j-1)*signalShift+1:(j-1)*signalShift+signalWindow),order,minEEGFreq:maxEEGFreq,frequency); end - end diff --git a/svm.m b/svm.m index c662231..44c78a5 100644 --- a/svm.m +++ b/svm.m @@ -1,5 +1,5 @@ close all -clear all +clear variables clc load('/home/jph/Uni/masterarbeit/data/AO1200msEMGWindow1sEEGWindow200msShift1sPause.mat'); @@ -8,7 +8,7 @@ %maxExpC=0; % c\in {2^i|i=-maxExpC:1:maxExpC} %choose to estimate based on EEG or EMG -trainingData=trainingDataEEG; +trainingData=trainingDataEMG; clear trainingDataEEG; clear trainingDataEMG; @@ -25,7 +25,7 @@ remainingClasses=classification(mod(randMap,k)~=i-1); disp(datestr(datetime('now'))) fprintf('create %ith model\n',i) - [model,maxC(i)]=kfoldCV(remainingClasses,remaining,k,maxExpC,100); + [model,maxC(i)]=kfoldCV(remainingClasses,remaining,k,maxExpC,1000); disp(datestr(datetime('now'))) [predictions,accurancy(i,:),pvalues]=svmpredict(leaveClasses,leaveOut(:,:),model); @@ -34,9 +34,11 @@ end meanAccurancy=mean(accurancy(:,1)) +fig=figure; cmScaled=zeros(size(cm)); for i=1:size(cm,1) cmScaled(i,:)=cm(i,:)/sum(cm(i,:)); end imagesc(cmScaled) colorbar(); +saveas(fig,'/home/jph/Uni/masterarbeit/plots/cmEMG200ms1sPause.fig','fig');