There is a bug in H3D API trunk (2.0) that causes a force effect to be called twice each haptic loop. This occurs when the same instance is used through several graphics loops, by adding the same object to the TraverseInfo each time the traverseSG is called. The H3D system does not recognize that the same object is added again but tries to interpolate the force between two instances of the same object, thus asking it to compute the feedback twice.
That would account for 2 kHz but not for 3 kHz.
My suggestion is that you log the time each time your force effect is called and compare it with the function parameter “dt” provided in the calculateForces function. If the H3D system calls your function several times each haptics loop the actual time delay will not match that provided through “dt”. You will also notice an uneven delay between subsequent calls.