Track Dampening

As a student of electrical engineering I had learned to characterize linear systems by their impulse response. Filters were characterized as finite and infinite impulse response, FIR and IIR respectively. wikipedia

I had at some point found that averaging new samples with old averages made for an easily coded IIR often coded in assembler by scaling with a right shift for 1/2^n fractions.

digraph { rankdir=LR node [shape=point] input, output sum [shape=circle label="+"] input -> sum [label = "1/5"] sum -> output [label = "5/5"] sum -> sum [label = "4/5 delayed" dir=back] }

I do remember describing the technique to Dave Dodson, my boss at the computing center, sketched a little calculus on my black board to derive the time constant of the impulse response.

I used the technique when coding the NSD Editor in the newly founded mechanical engineering computer graphics lab. Here I have excerpted the computation coded in fortran along with additional discussion that accompanied its restoration.

Potentiometers within Engelbart's original mouse produced an analog voltage which was then read through the Imlac's analog-to-digital converters. Analog noise made the mouse jumpy and hard to use. This is damped by maintaining position history in NXP & NYP. With each invocation, 1/5 of these values are updated with fresh input.
SUBROUTINE TRACKR

C  TRACK MOUSE ON DISPLAY
C 
C  COMMON BLOCK /MOUSE/  
C     NXP, NYP - MOUSE POSITION IN SCREEN COORDINATES 

C  STATEMENT FUNCTIONS
      COORD(N)=FLOAT(MIN0(MAX0(N,20),1003))/100.

C  COMPUTE MOUSE POSITION WITH DAMPING
202   CALL MOUSE(X,Y) 
      NXP=(4*NXP+MIN0(MAX0(IFIX(100.*X),KXM),KXX))/5
      NYP=(4*NYP+MIN0(MAX0(IFIX(100.*Y),KYM),KYX))/5
      CALL MOVE(NSTR,COORD(NXP),COORD(NYP)) 

The lab director had warned me that the mouse was jumpy and maybe not as useful as I thought it might be. Mice were not common then. This was the first computer I used that had this input. The director was moderately interested in my application when I demoed the finished project. But he couldn't help but be amazed at the silky motion of the cursor on the screen. I even caught him sneaking a touch to move the mouse himself.

Of course the operator's hand and arm are a system that has an impulse response of its own. If the mouse filter's time constant is set similar to the hand that moves it then any sense of cursor delay disappears.

I don't recall that typical fortran compilers of the era supported statement functions as this one did. These are called "lambda" in javascript where they are a recent addition.

// javascript lambda function equivalent
const coord = n => Math.min(Math.max(n,20),1003))/100;