Wed Mar 13 09:27:29 EDT 2013

Exponentials: stable update

I'm still not convinced that it's not possible to compute a stable
update for frequency increments.

Summary of before: 

* ^exp(( P1 - P0 ) / N) = q01 Is more precise than ^exp(P0) and
  ^exp(P1) such that ^exp(P0) * q^N and ^exp(P1) do not line up.

* using only incremental updates q will cause drift.

A "directed" method would solve this, something that is targeted at a
set point, but does not have a growing approximation error.  This
would boil down to computing:

      ( exp(P1) / p0 ) ^ 1/N

This can be simplified to P1 purely imaginary and p0 unit norm.

The question seems to be: how to construct a series for this?  Using
autodiff[1] it's probably possible to automate it.  But is a straight
series good enough?  It might have non-elementary operations.

Let's try to massage it a bit first.  

     exp (P1 / N)                         = \sum_n (iP1/N)^n / n!

     1 / p0^1/N = 1 / (1 - (1 - p0^ 1/N)) = \sum_n (1 - p0^1/N)^n

The resulting series is a convolution of these two.  However, the term
p0^1/N is not elementary.  This seems like a detour..

Let's try a different way, by writing the error explicitly.

It is known that p0 approximates exp(P0) or p0 = e + exp(P0).  The e
is not known, but could be computed.  Can this be used?

The error is completely contained in the difference between p0 and
exp(P0).  This brings us back to one of the previous attempts:
compensate the error accumulated up to a point by spreading out the
compensation over the next block, i.e. multiply the update
coefficient by:

          (exp(P0) / p0) ^ 1/N

This has the same form as the original problem.  It doesn't look like
it is going to be of much use..

Let's ignore the 1/N as it is probably possible to introduce it later,
and go for the expansion of log() :


         = exp(P1 - log (p0))

         = exp(P1 - log (1 - (1 - p0)))

         = sum_n,0 1/n! (P1 + sum_m,1 1/m (1 - p0) ^ m) ^ n

I'm thinking that it might be time to start implementing convolution
of sequences, and work numerically.

EDIT: The result of the log is imaginary, so all real parts could be

EDIT: It doesn look like this will work since the inner series has a
constant term.

Conclusion: bad intuition.  The connection to "small values" because
P1 and p0 appear naked in the expressions.

[1] http://zwizwa.be/darcs/meta/rai/ai-autodiff.rkt