Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

I got this error: <Undefined function 'findSpindles' for input arguments of type 'tsd'> using the function below, but I need a tds, how can I fix it?

Asked by Ambra

Ambra (view profile)

on 22 Aug 2014
Latest activity Edited by Andrew Reibold

Andrew Reibold (view profile)

on 22 Aug 2014

My datas are in the format tds (EEG1=tsd (EEG1.t,EEG1.data)) because I need to couple the data with the time. I need to aplicate this function but it doesn't work. The function is below. I'm doing [S, E, M] = findSpindles(EEG1) but apparently I can't. What am I doing wrong? Or how can I fix the function?

function [S, E, M] = findSpindles(EEG, DetectThreshold, LimitThreshold, varargin)

% [S, E, M] = findRipples(Filt_EEG, DetectThreshold, LimitThreshold, varargin) % % INPUTS: % Filt_EEG: EEG tsd % DetectThreshold: Threshold for detection of ripples % LimitThreshold: Threshold for finding the ripple boundaries % % PARAMETERS: % Q1: number of cycles to check to find boundaries % CloseThreshold: Closeness threhshold,if two ripple events are closer than % this, lump them together % MinRippleDuration: discard theta evants shorter than this % OUTPUTS: % S: ts object with ripple events start times % E: ts object with ripple events end times % M: ts object with ripple events peak times

% copyright (c) 1999 Francesco P. Battaglia % This software is released under the GNU GPL % www.gnu.org/copyleft/gpl.html %1

% parameters Q1 = 5; CloseThreshold = 1000 * 10; MinRippleDuration = 1000 * 10;

Extract_varargin; % do it in chunks; MinRippleDuration

Filt_EEG = filter_7Hz(EEG, 7,20);

EEGStart = StartTime(Filt_EEG); EEGEnd = EndTime(Filt_EEG);

% chunk length in timestamps

LChunk = 3000000;

ChStart = EEGStart; ChEnd = min(ChStart + LChunk, EEGEnd); nChunks = (EEGEnd - EEGStart)/LChunk; TRStart = []; TREnd = []; TRMax = []; TRMaxValue = [];

i = 0; h = waitbar(0, 'Find Ripples...');

while ChStart < EEGEnd waitbar(i/nChunks, h);

Ch = Restrict(Filt_EEG, ChStart, ChEnd);
eeg = Data(Ch);
t = Range(Ch, 'ts');
sz = size(eeg);
if sz(1) ~= 1
  eeg = eeg';    % we want to work with row vectors
  t = t';
end
de = diff(eeg);
de1 = [de 0];
de2 = [0 de];
%finding peaks
upPeaksIdx = find(de1 < 0 & de2 > 0);
downPeaksIdx = find(de1 > 0 & de2 < 0);
PeaksIdx = [upPeaksIdx downPeaksIdx];
PeaksIdx = sort(PeaksIdx);
Peaks = eeg(PeaksIdx);
Peaks = abs(Peaks);
%when a peaks is above threshold, we detect a ripple
RippleDetectIdx = find(Peaks > DetectThreshold);
DetectDiff = [0 diff(RippleDetectIdx)];
RippleDetectIdx = RippleDetectIdx(find(DetectDiff > 2));
RippleDetectIdx = RippleDetectIdx(find(RippleDetectIdx < length(Peaks)- ...
					 Q1+1));
RippleDetectIdx = RippleDetectIdx(find(RippleDetectIdx > Q1 + 1));
RippleStart = zeros(1, length(RippleDetectIdx));
RippleEnd = zeros(1, length(RippleDetectIdx));
RippleMax = zeros(1, length(RippleDetectIdx));
RippleMaxValue = zeros(1, length(RippleDetectIdx));
for ii = 1:length(RippleDetectIdx) 
  CP = RippleDetectIdx(ii); % Current Peak
  % detect start of the ripple
  for j = CP-1:-1:Q1
    if all(Peaks(j-Q1+1:j) < LimitThreshold)
	
	break;
    end
  end
  RippleStart(ii) = j;
  %detect end of ripple
  for j = CP+1:length(Peaks)-Q1+1
    if all(Peaks(j:j+Q1-1)< LimitThreshold)
	
	break;
    end
  end
  RippleEnd(ii) = j;
  [RippleMaxValue(ii), RippleMax(ii)] = max(Peaks([RippleStart(ii):RippleEnd(ii)]));
  RippleMax(ii) = RippleStart(ii) + RippleMax(ii) - 1;
end
TRStart = [TRStart t(PeaksIdx(RippleStart))];
TREnd = [TREnd t(PeaksIdx(RippleEnd))];
TRMax = [TRMax t(PeaksIdx(RippleMax))];
TRMaxValue = [TRMaxValue RippleMaxValue];
i = i+1;
ChStart = ChStart + LChunk;
ChEnd = ChEnd + LChunk;
if ChEnd > EEGEnd
  ChEnd = EEGEnd;
end

end close(h); i = 2;

while i <= length(TRStart)

if (TRStart(i) - TREnd(i-1)) < CloseThreshold
  TRStart = [TRStart(1:i-1) TRStart(i+1:end)];
  TREnd = [TREnd(1:i-2) TREnd(i:end)];
  [mx, ix] = max([TRMaxValue(i-1) TRMaxValue(i)]);
  TRMax = [TRMax(1:i-2) TRMax(i - 2 + ix) TRMax(i+1:end)]; 
else
  i = i +1 ;
end

end %length(TRStart) %length(TREnd) i = 1; while i <= length(TRStart) if(TREnd(i) - TRStart(i)) < MinRippleDuration TRStart = [TRStart(1:i-1) TRStart(i+1:end)]; TREnd = [TREnd(1:i-1) TREnd(i+1:end)]; TRMax = [TRMax(1:i-1), TRMax(i+1:end)]; else i = i+ 1;

end

end

S = ts(TRStart); E = ts(TREnd); M = ts(TRMax);

0 Comments

Ambra

Ambra (view profile)

Products

No products are associated with this question.

1 Answer

Answer by Andrew Reibold

Andrew Reibold (view profile)

on 22 Aug 2014
Edited by Andrew Reibold

Andrew Reibold (view profile)

on 22 Aug 2014

Undefined function can often allude to a simple mistake of not having saved that function in the folder you are currently working in when you call it. Make sure a copy of it is saved in the working folder, not that that is necessarily the problem.

0 Comments

Andrew Reibold

Andrew Reibold (view profile)

Contact us