Fork PyRPL on GitHub

Source code for pyrpl.hardware_modules.sampler

import numpy as np
from ..pyrpl_utils import time
from ..attributes import FloatRegister
from ..modules import HardwareModule
from . import DSP_INPUTS


[docs]class Sampler(HardwareModule): """ this module provides a sample of each signal. This is a momentary workaround, will be improved later on with an upgraded FPGA version """ addr_base = 0x40300000
[docs] def stats(self, signal="in1", t=1e-2): """ computes the mean, standard deviation, min and max of the chosen signal over duration t Parameters ---------- signal: input signal t: duration over which to average obsolete: n: equivalent number of FPGA clock cycles to average over Returns ------- mean, stddev, max, min: mean and standard deviation of all samples """ try: # signal can be a string, or a module (whose name is the name of the signal we'll use) signal = signal.name except AttributeError: pass nn = 0 cum = 0 cumsq = 0 max = -np.inf min = np.inf t0 = time() # get start time while nn == 0 or time() < t0 + t: # do at least one sample nn += 1 value = self.__getattribute__(signal) cum += value cumsq += (value ** 2.0) if value > max: max = value if value < min: min = value nn = float(nn) mean = cum / nn variance = (cumsq / nn - mean**2.0) # while mathematically nonsense, this can happen numerically if variance < 0: # this means the variance is tiny and can be assumed zero variance = 0 stddev = variance ** 0.5 return mean, stddev, max, min
[docs] def mean_stddev(self, signal="in1", t=1e-2): """ computes the mean and standard deviation of the chosen signal Parameters ---------- signal: input signal t: duration over which to average obsolete: n: equivalent number of FPGA clock cycles to average over Returns ------- mean, stddev: mean and standard deviation of all samples """ self._logger.warning("Sampler.mean_stddev() is obsolete. Please use " "Sampler.stats() instead!") mean, stddev, max, min = self.stats(signal=signal, t=t) return mean, stddev
# generate one attribute in Sampler for each DSP signal for inp, num in DSP_INPUTS.items(): setattr(Sampler, inp, FloatRegister( 0x10 + num * 0x10000, bits=14, norm=2 ** 13 - 1, doc="current value of " + inp))