Newer
Older
masterarbeit / oldMcode / upsample_kin.m
@JPH JPH on 27 Jul 2016 2 KB cleanup
function [kin_data, startingPoint]=upsample_kin(kin,bci_signal,bci_sf,bci_total_samples,channelNames)
% function for kin data upsampling to EMG data frequency (2500Hz)
%     inputs:
%     kin: kin data
%     bci_signal: signal recorded in bci (emg+eeg+eog+synchro)
%     bci_sf: sampling Frequency of bci signal
%     bci_total_samples: length of emg signal (2500Hz)
%     channelNames: names of channels recorded in bci (1:32 --> eeg, 33:42--> emg, 43: EOG, 44: synchro, 45: null)
%     
% 
%     outputs:
%     kin_data: kin data matrix (bci_total_samplesx13 kin variables) of same length as emg data, upsampled
%     startingPoint: starting point is the position point in the EMG data (2500 Hz) where
%     %kin data starts being recorded (synchronization step). the
%     %staringPoint position in EMG data corresponds to the first data point
%     %of kinematic data

    %upsampling --> get it equal to bci2000 data frequency
    kin_total_samples=length(kin_filt); % kin number of data points

    %1. find the starting point in the bci2000 data within the first 4 seconds (step in synchronization trigger)

    %look for a step in the beginning of kinematic signal
    [~,startingPoint]=max(abs(diff(bci_signal(1:4*bci_sf,(find(ismember(channelNames,'Synchro')))))));

    %2. create a new vector for kinematic data as long as the vector for EMG
    %data

    kin_data=NaN(bci_total_samples,13);%creates a new matrix of same lenght as EMG data
    
    
    %for kin variables 2-13 (not time), from 1 to startingPoint, we asign a
    %constant value, the same value that each variable has in the first
    %data point
    for j=2:13
        kin_data(1:startingPoint,j)=kin(1,j); % from 1 to startingPoint, the kinematic data 
    end
    
    %we take the time array 
    time=kin(:,1);%in ms

    for i=1:length(time) %length in kinematic data
      
       %assign the value of kin data in each time position in 17 Hz to the time
       %position that would have in 2500Hz (the rest of the positions stay with a NaN value)
        kin_data((startingPoint+floor(time(i)*bci_sf/1000)),2:13)=kin_filt(i,2:13);
     
    end

    %interpolate NaN values
    
    X=[1:bci_total_samples]';
    for i=2:13
        Y=(kin_data(1:bci_total_samples,i));
        ix=~isnan(Y);
        kin_data(1:bci_total_samples,i)=interp1(X(ix),Y(ix),X,'CUBIC');
    end

end