Back to the index page
For eye-contigent display changes, fast online eye-state categorization is necessary. The original version of the algorithm was developed by Andreas De Troy. The version that we currently use is described below. It may look a bit strange. This is because the formulas are "tuned" in a trial-and-error way, and are not explicitly based on some velocity or acceleration criterion. But it works really well!
The (x,y) eye position is sampled every ms (with a DPI Eye-tracker). Two status bits of the DPI tracker pre-categorize the eye state as blink, signal error, or track. If the eye state according to the DPI tracker is track, our algorithm determines if the eye is fixating or saccading, based on the current eye-position sample, the previous five eye-position samples, and the previous eye state. This is done in the following way:
Let's first define some symbols:
x(t) = sample of horizontal eye position (in visual degrees) at time t (t=0 is the most recent sample, t=-1 is the previous sample, etc.).
y(t) = sample of vertical eye position (in visual degrees) at time t
state(t) = eye state (blink, signal error, fixation, or saccade) at time t
|x|= absolute value of x
Now, calculate two variability statistics, named xvar and yvar:
xvar = |x(-5) - x(-4)| +
|x(-4) - x(-3)| +
|x(-2) - x(0)| +
|x(-3) - x(0)| +
|x(-4) - x(0)| +
|x(-5) - x(0)| +
( (x(-3) - x(-2))2 +
(x(-2) - x(-1))2 +
(x(-1) - x(0))2 ) * 50
yvar = |y(-5) - y(-4)| +
|y(-4) - y(-3)| +
|y(-2) - y(0)| +
|y(-3) - y(0)| +
|y(-4) - y(0)| +
|y(-5) - y(0)| +
( (y(-3) - y(-2))2 +
(y(-2) - y(-1))2 +
(y(-1) - y(0))2 ) * 50
Generally, low values for xvar and yvar denote a fixation. One could simply choose a criterion to compare the values of xvar and yvar with. Better, two criteria should be set, a lower lowcrit, and a higher highcrit. When the previous eye state was categorized as a fixation, compare xvar and yvar with highcrit. Otherwise, compare xvar and yvar with lowcrit: In this way, a hysteresis is created for a change in eye state. We use lowcrit = 0.08, and highcrit = 0.36.
if state(-1)= fixation
if xvar < highcrit, and yvar < highcrit, then state(0)= fixation, else state(0)= saccade
if state(-1)= saccade, blink, or error
if xvar < lowcrit, and yvar < lowcrit, then state(0)= fixation, else state(0)= saccade
The above algorithm could be improved further, by combining the formulas for xvar and yvar, resulting in a single variability statistic, that is independent on the direction of an eye movement. The original algorithm was developed to run on a 286 PC, which is why the formulas could not be too complex. Of course, this is not really an issue anymore.