mirror of
https://github.com/m-labs/artiq.git
synced 2024-12-25 03:08:27 +08:00
[WIP] wavesynth/interpolate: wavesynth programming tools
* interpolate(t, v) will generate the channel data subset of a wavesynth program * still broken
This commit is contained in:
parent
6a0bc19279
commit
03139808bd
45
artiq/wavesynth/interpolate.py
Normal file
45
artiq/wavesynth/interpolate.py
Normal file
@ -0,0 +1,45 @@
|
||||
import numpy as np
|
||||
from scipy.interpolate import splrep, splev
|
||||
|
||||
|
||||
def _round_times(times, sample_times=None):
|
||||
times = np.asanyarray(times)
|
||||
if sample_times is None:
|
||||
sample_times = np.rint(times)
|
||||
duration = np.diff(sample_times)
|
||||
sample_times = sample_times[:-1]
|
||||
assert np.all(duration >= 0)
|
||||
assert np.all(duration < (1 << 16))
|
||||
return times, sample_times, duration
|
||||
|
||||
|
||||
def _interpolate(time, data, sample_times, order=3):
|
||||
# FIXME: this does not ensure that the spline does not clip
|
||||
spline = splrep(time, data, k=order or 1)
|
||||
# FIXME: this could be faster but needs k knots outside t_eval
|
||||
# dv = np.array(spalde(t_eval, s))
|
||||
coeffs = np.array([splev(sample_times, spline, der=i, ext=0)
|
||||
for i in range(order + 1)]).T
|
||||
return coeffs
|
||||
|
||||
|
||||
def _zip_program(times, channels, target=):
|
||||
for tc in zip(times, *channels):
|
||||
yield {
|
||||
"duration": tc[0],
|
||||
"channel_data": tc[1:],
|
||||
}
|
||||
# FIXME: this does not handle:
|
||||
# `clear` (clearing the phase accumulator)
|
||||
# `silence` (stopping the dac clock)
|
||||
|
||||
|
||||
def interpolate_channels(times, data, sample_times=None, **kwargs):
|
||||
if len(times) == 1:
|
||||
return _zip_program(np.array([1]), data[:, :, None])
|
||||
data = np.asanyarray(data)
|
||||
assert len(times) == len(data)
|
||||
times, sample_times, duration = _round_times(times, sample_times)
|
||||
channel_coeff = [_interpolate(sample_times, i, **kwargs) for i in data.T]
|
||||
return _zip_program(duration, np.array(channel_coeff))
|
||||
# v = np.clip(v/self.max_out, -1, 1)
|
Loading…
Reference in New Issue
Block a user