diff --git a/cutMovements.m b/cutMovements.m new file mode 100644 index 0000000..bcd0132 --- /dev/null +++ b/cutMovements.m @@ -0,0 +1,22 @@ +function [ splitSignals, code ] = cutMovements( stimulusCodes, signal ) +%cut Trials only, ignore resting phases + +noSamplesPerTrial=15000; +% count how many recorded values belong to one trial +changeIndices=[find(diff(double(stimulusCodes)));size(stimulusCodes,1)]; +codeCount=[diff(changeIndices); size(stimulusCodes,1)-sum(diff(changeIndices))]; + +splitSignals=[]; +code=[]; + +c=1; + +for i=1:size(codeCount,1) + if(codeCount(i)==noSamplesPerTrial && stimulusCodes(c)~=0) + splitSignals=cat(3,splitSignals,signal(c:c+codeCount(i)-1,:)); + code=cat(1,code,stimulusCodes(c)); + end + c=c+codeCount(i); +end +end + diff --git a/cutTrials.m b/cutTrials.m deleted file mode 100644 index 18b87bd..0000000 --- a/cutTrials.m +++ /dev/null @@ -1,22 +0,0 @@ -function [ splitSignals, code ] = cutTrials( states, signal ) -%cut Trials only, ignore resting phases - -noSamplesPerTrial=15000; -% count how many recorded values belong to one trial -changeIndices=[find(diff(double(states.StimulusCode)));size(states.StimulusCode,1)]; -codeCount=[diff(changeIndices); size(states.StimulusCode,1)-sum(diff(changeIndices))]; - -splitSignals=[]; -code=[]; - -c=1; - -for i=1:size(codeCount,1) - if(codeCount(i)==noSamplesPerTrial) - splitSignals=cat(3,splitSignals,signal(c:c+codeCount(i)-1,:)); - code=cat(1,code,states.StimulusCode(c)); - end - c=c+codeCount(i); -end -end - diff --git a/cutWindows.m b/cutWindows.m index 2430ffe..61b5b46 100644 --- a/cutWindows.m +++ b/cutWindows.m @@ -1,5 +1,5 @@ -function [ splitSignals, code ] = cutWindows( states, signal, params, t ) - changeIndices=cat(1,0,find(diff(double(states.StimulusCode)))); +function [ splitSignals, code ] = cutWindows( stimulusCodes, signal, params, t ) + changeIndices=cat(1,0,find(diff(double(stimulusCodes)))); codeCount=diff(changeIndices); interval=t*params.SamplingRate.NumericValue; @@ -12,7 +12,7 @@ tempc=0; while codeCount(i)-tempc >= interval splitSignals=cat(3,splitSignals,signal(c+tempc:c+tempc+interval-1,:)); - code=cat(1,code,double(states.StimulusCode(c+tempc))); + code=cat(1,code,double(stimulusCodes(c+tempc))); tempc=tempc+interval; end c=c+codeCount(i); diff --git a/generateTrainingData.m b/generateTrainingData.m index a467afc..33ea013 100644 --- a/generateTrainingData.m +++ b/generateTrainingData.m @@ -1,7 +1,7 @@ -function [trainingDataEEG,trainingDataEMG] = generateTrainingData(splitSignals,NFFT,window,shift,params) +function [trainingDataEEG,trainingDataEMG] = generateTrainingData(splitSignals,NFFT,window,shift,params,secs) frequency=params.SamplingRate.NumericValue; tempEEG2=zeros([32,size(splitSignals,3),NFFT/2+1]); - tempEMG2=zeros([size(splitSignals,2)-3-32,size(splitSignals,3),(floor(size(splitSignals,1)/(frequency*window))-1)*window/shift+1]); + tempEMG2=zeros(fix([size(splitSignals,2)-3-32,size(splitSignals,3),fix(floor(size(splitSignals,1)/(frequency*window))-1)*window/shift+1])); %Filter around 50Hz and below 2 Hz [A,B]= butter(2,[48 52]/(frequency/2),'stop'); @@ -10,14 +10,14 @@ parfor i=1:32 %filter single channel, w/o HEOG, Synchro and 0s tempEEG=zeros(size(splitSignals,3),NFFT/2+1); for j=1:size(splitSignals,3) %filter single trial - tempEEG(j,:)=pwelch(filter(C,D,filter(A,B,splitSignals(:,i,j))),[],[],NFFT,frequency); + tempEEG(j,:)=pwelch(filter(C,D,filter(A,B,splitSignals(1:secs*frequency,i,j))),[],[],NFFT,frequency); end tempEEG2(i,:,:)=tempEEG; end trainingDataEEG=permute(tempEEG2,[2 1 3]); parfor i=33:size(splitSignals,2)-3 - tempEMG=zeros([size(splitSignals,3),(floor(size(splitSignals,1)/(frequency*window))-1)*window/shift+1]); + tempEMG=zeros(fix([size(splitSignals,3),(floor(size(splitSignals,1)/(frequency*window))-1)*window/shift+1])); for j=1:size(splitSignals,3) %filter single trial tempEMG(j,:)=waveformLength(filter(C,D,filter(A,B,splitSignals(:,i,j))),frequency,window,shift); end diff --git a/kfoldCV.m b/kfoldCV.m index 7a7e62f..29deb48 100644 --- a/kfoldCV.m +++ b/kfoldCV.m @@ -1,8 +1,8 @@ function [model] = kfoldCV(classification,trainingData,k,cExpMax) noClasses=size(unique(classification),2); randMap=randperm(size(trainingData,1)); - leaveOut=trainingData(mod(randMap,k+1)==0,:,:); - leaveClasses=classification(mod(randMap,k+1)==0); + leaveOut=trainingData; + leaveClasses=classification; remaining=trainingData(mod(randMap,k+1)~=0,:,:); remainingClasses=classification(mod(randMap,k+1)~=0); cvAccurancy=zeros(2*cExpMax+1,1); diff --git a/read.m b/read.m new file mode 100644 index 0000000..d13a0ff --- /dev/null +++ b/read.m @@ -0,0 +1,7 @@ +signal=[]; +stimulusCodes=[]; +for i=1:5 + [sig, stat, params] = load_bcidat(sprintf('/home/jph/Uni/masterarbeit/Block1_ReachingMovements/AO/AO_B1001/AO_B1S001R0%i.dat',i)); + signal=cat(1,signal,sig); + stimulusCodes=cat(1,stat.StimulusCode,stimulusCodes); +end diff --git a/readme.m b/readme.m index fb22dd8..28b94dd 100644 --- a/readme.m +++ b/readme.m @@ -52,8 +52,13 @@ % cross validation (selber impelmentieren) % Aufteilung EMG xor EEG (done) -% danach dann Bewegungen aufteilen -% -> testen ob mit EMG besser -% Ideen: -% - alle Daten, zumindest von einer PErson einlesen +% danach dann Bewegungen aufteilenC + +% von einer Person und einem Tag zusammen (done) +% nur die ersten zwei Sekunden der Bewegung (done [generateTrainingData]) +% für WL keine Fenster sondern ganze Bewegung (done s.o.) +% äußere Crossvalidation +% Confusion +% Ruhe / Bewegung aufteilen EEG EMG +% -> testen ob mit EMG besser diff --git a/svm.m b/svm.m index 9bf653f..3780e04 100644 --- a/svm.m +++ b/svm.m @@ -1,19 +1,20 @@ %params NFFT=2048; -cutWindow=2; +cutWindowEEG=2; window=0.2; shift=0.05; k=10; -rounds=10; -maxExpC=5; +rounds=1; +maxExpC=7; %svm -[signal, states, params] = load_bcidat('/home/jph/Uni/masterarbeit/Block1_ReachingMovements/AO/AO_B1001/AO_B1S001R01.dat'); -% [ splitSignals, code ] = cutTrials( states, signal ); -[ splitSignals, code ] = cutWindows( states, signal, params, cutWindow ); +load('/home/jph/Uni/masterarbeit/data/AO1.mat'); + +[ splitSignals, code ] = cutMovements( stimulusCodes, signal ); +%[ splitSignals, code ] = cutWindows( stimulusCodes, signal, params, cutWindow ); %trainingData has format trial x ch x powerSpectrum -[trainingDataEEG,trainingDataEMG]=generateTrainingData(splitSignals,NFFT,window,shift,params); +[trainingDataEEG,trainingDataEMG]=generateTrainingData(splitSignals,NFFT,window,shift,params,cutWindowEEG); %classify for different movements and rest classification=zeros(size(code)); @@ -25,11 +26,13 @@ end end + %classify for move/rest +% cann't use cutMovements then %classification=double(code<=5); %choose to estimate based on EEG or EMG -trainingData=trainingDataEMG; +trainingData=trainingDataEEG; accurancy=zeros(rounds,3); @@ -44,7 +47,8 @@ model=kfoldCV(remainingClasses,remaining,k,maxExpC); [predictions,accurancy(i,:),pvalues]=svmpredict(leaveClasses,leaveOut(:,:),model); - means(i)=mean(leaveClasses-predictions); + means(i)=mean(leaveClasses-predictions); %confusion matrix + %cf: for each cue what was the prediction (maybe colourCoded) end m=mean(accurancy(:,1)) mm=mean(means) \ No newline at end of file diff --git a/waveformLength.m b/waveformLength.m index cfc0298..8239c05 100644 --- a/waveformLength.m +++ b/waveformLength.m @@ -5,7 +5,7 @@ signalWindow=frequency*window; shiftProp=window/windowShift; WL=zeros((floor(size(signal,1)/signalWindow)-1)*shiftProp+1,1); - parfor j=1:(size(signal,1)/signalWindow-1)*shiftProp+1 + for j=1:(size(signal,1)/signalWindow-1)*shiftProp+1 WL(j)=sum(diff(signal((j-1)*signalShift+1:(j-1)*signalShift+signalWindow))); end end