Ok, do you have your example code for the linear acceleration.
With my original code, I scan the encode inputs by a fixed time interval, say 200 samples a second, which allows the generation of a timer 'time_between_each_pulse', whose count is limited to 'Max_time' (I use 100), of the encoder.
Basically, every scan of the encoder input, I increment 'time_between_each_pulse' if it is less than 'Max_time'
If the encoder moved since the last scan, I clear 'time_between_each_pulse'.
This factor generates the acceleration factor 'Speed_factor' which sets the step size.
Speed_factor = Max_time + 1 - (time_between_each_pulse);
Next, depending on the direction of the encoder, ADD, or SUBTRACT 'Speed_factor' to your user set counter.
Now, if you want an exponential acceleration instead, all you would have to do is ADD, or SUBTRACT:
(Speed_factor * your_choice) ^2. or
Speed_factor^2 * your_choice or
((Speed_factor-1) * your_choice) ^2 + 1 ... This one allows for an increment and decrement of exactly 1 at the slowest speed
(Note that the 'your_choice' might be something like 0.5 since 100^2, at 10000 steps per count, may be too big, or, you can change that to 10 making the max speed 1000000 per step...)
You can also change 'Max_time' to something like 10. This will give you a very slow linear acceleration, you can call this your 'Log' mode, and use the exponential mode for that wide speed swing.
I hope this helps...