forked from M-Labs/artiq
1
0
Fork 0

spline: be really verbose

closes #773
This commit is contained in:
Robert Jördens 2017-07-07 11:43:58 +02:00
parent 7b130a2c32
commit f0841f5489
1 changed files with 21 additions and 15 deletions

View File

@ -9,13 +9,18 @@ class Spline:
One knot of a polynomial basis spline (B-spline) :math:`u(t)` One knot of a polynomial basis spline (B-spline) :math:`u(t)`
is defined by the coefficients :math:`u_n` up to order :math:`n = k`. is defined by the coefficients :math:`u_n` up to order :math:`n = k`.
If the knot is evaluated starting at time :math:`t_0`, the output If the coefficients are evaluated starting at time :math:`t_0`,
:math:`u(t)` for :math:`t > t_0, t_0` is: the output :math:`u(t)` for :math:`t > t_0, t_0` is:
.. math:: .. math::
u(t) &= \sum_{n=0}^k \frac{u_n}{n!} (t - t_0)^n \\ u(t) &= \sum_{n=0}^k \frac{u_n}{n!} (t - t_0)^n \\
&= u_0 + u_1 (t - t_0) + \frac{u_2}{2} (t - t_0)^2 + \dots &= u_0 + u_1 (t - t_0) + \frac{u_2}{2} (t - t_0)^2 + \dots
This class contains multiple methods to convert spline knot data from SI
to machine units and multiple methods that set the current spline
coefficient data. None of these advance the timeline. The :meth:`smooth`
method is the only method that advances the timeline.
:param width: Width in bits of the quantity that this spline controls :param width: Width in bits of the quantity that this spline controls
:param time_width: Width in bits of the time counter of this spline :param time_width: Width in bits of the time counter of this spline
:param channel: RTIO channel number :param channel: RTIO channel number
@ -38,19 +43,19 @@ class Spline:
@portable(flags={"fast-math"}) @portable(flags={"fast-math"})
def to_mu(self, value: TFloat) -> TInt32: def to_mu(self, value: TFloat) -> TInt32:
"""Convert floating point `value` from physical units to 32 bit """Convert floating point ``value`` from physical units to 32 bit
integer machine units.""" integer machine units."""
return int32(round(value*self.scale)) return int32(round(value*self.scale))
@portable(flags={"fast-math"}) @portable(flags={"fast-math"})
def from_mu(self, value: TInt32) -> TFloat: def from_mu(self, value: TInt32) -> TFloat:
"""Convert 32 bit integer `value` from machine units to floating point """Convert 32 bit integer ``value`` from machine units to floating
physical units.""" point physical units."""
return value/self.scale return value/self.scale
@portable(flags={"fast-math"}) @portable(flags={"fast-math"})
def to_mu64(self, value: TFloat) -> TInt64: def to_mu64(self, value: TFloat) -> TInt64:
"""Convert floating point `value` from physical units to 64 bit """Convert floating point ``value`` from physical units to 64 bit
integer machine units.""" integer machine units."""
return int64(round(value*self.scale)) return int64(round(value*self.scale))
@ -92,7 +97,7 @@ class Spline:
by the RTIO gateware. by the RTIO gateware.
:param packed: TList(TInt32) list for packed RTIO data. Must be :param packed: TList(TInt32) list for packed RTIO data. Must be
pre-allocated. Length in bits is pre-allocated. Length in bits is
`n*width + (n - 1)*n//2*time_width` ``n*width + (n - 1)*n//2*time_width``
""" """
pos = 0 pos = 0
for i in range(len(coeff)): for i in range(len(coeff)):
@ -139,7 +144,7 @@ class Spline:
RTIO data list. RTIO data list.
This is a host-only method that can be used to generate packed This is a host-only method that can be used to generate packed
spline knot data to be frozen into kernels at compile time. spline coefficient data to be frozen into kernels at compile time.
""" """
n = len(coeff64) n = len(coeff64)
width = n*self.width + (n - 1)*n//2*self.time_width width = n*self.width + (n - 1)*n//2*self.time_width
@ -152,7 +157,7 @@ class Spline:
packed data. packed data.
This is a host-only method that can be used to generate packed This is a host-only method that can be used to generate packed
spline knot data to be frozen into kernels at compile time. spline coefficient data to be frozen into kernels at compile time.
""" """
coeff64 = [int64(0)] * len(coeff) coeff64 = [int64(0)] * len(coeff)
self.coeff_to_mu(coeff, coeff64) self.coeff_to_mu(coeff, coeff64)
@ -168,7 +173,7 @@ class Spline:
If more coefficients are supplied than the gateware supports the extra If more coefficients are supplied than the gateware supports the extra
coefficients are ignored. coefficients are ignored.
:param value: List of floating point spline knot coefficients, :param value: List of floating point spline coefficients,
lowest order (constant) coefficient first. Units are the lowest order (constant) coefficient first. Units are the
unit of this spline's value times increasing powers of 1/s. unit of this spline's value times increasing powers of 1/s.
""" """
@ -186,19 +191,20 @@ class Spline:
"""Initiate an interpolated value change. """Initiate an interpolated value change.
For zeroth order (step) interpolation, the step is at For zeroth order (step) interpolation, the step is at
`start + duration/2`. ``start + duration/2``.
First order interpolation corresponds to a linear value ramp from First order interpolation corresponds to a linear value ramp from
`start` to `stop` over `duration`. ``start`` to ``stop`` over ``duration``.
The third order interpolation is constrained to have zero first The third order interpolation is constrained to have zero first
order derivative at both `start` and `stop`. order derivative at both `start` and `stop`.
For first order and third order interpolation (linear and cubic) For first order and third order interpolation (linear and cubic)
the interpolator needs to be stopped (or fed a new spline knot) the interpolator needs to be stopped explicitly at the stop time
explicitly at the stop time. (e.g. by setting spline coefficient data or starting a new
:meth:`smooth` interpolation).
This method advances the timeline by `duration`. This method advances the timeline by ``duration``.
:param start: Initial value of the change. In physical units. :param start: Initial value of the change. In physical units.
:param stop: Final value of the change. In physical units. :param stop: Final value of the change. In physical units.