Source code for cbadc.analog_signal.sinusoidal

"""Sinusoidal signals."""
from typing import Union
from ._analog_signal import _AnalogSignal
from sympy import sin
from mpmath import mp
import numpy as np


[docs]class Sinusoidal(_AnalogSignal): """An analog continuous-time sinusoidal signal. Parameters ---------- amplitude : `float` The amplitude of the sinusoidal. frequency : `float` Frequency of the oscillation in [Hz]. phase : `float`, optional The phase, defaults to 0. offset : `float` The offset value. Attributes ---------- amplitude : `float` The amplitude. frequency : `float` The frequency in [Hz]. angularFrequency : `float` The frequency in [radians/second]. phase : `float` The phase. offset : `float`, `optional` The offset See also -------- cbadc.analog_signal.AnalogSignal Example ------- >>> from cbadc.analog_signal import Sinusoidal >>> import numpy as np >>> u = Sinusoidal(1, 123, np.pi/2, 0) >>> print(u.evaluate(0)) 1.0 """ amplitude: float angularFrequency: float phase: float offset: float def __init__( self, amplitude: float, frequency: float, phase: float = 0.0, offset: float = 0.0, ): super().__init__() self.amplitude: float = amplitude self.frequency: float = frequency self.angularFrequency: float = 2 * np.pi * self.frequency self.phase: float = phase self.offset: float = offset self._mpmath_dic = { 'amplitude': mp.mpmathify(amplitude), 'frequency': mp.mpmathify(frequency), 'angularFrequency': mp.mpmathify('2') * mp.pi * mp.mpmathify(frequency), 'phase': mp.mpmathify(phase), 'offset': mp.mpmathify(offset), } def __str__(self): return f""" Sinusoidal parameterized as: amplitude = {self.amplitude}, frequency = {self.frequency}, phase = {self.phase}, and offset = {self.offset} """
[docs] def evaluate(self, t: float) -> float: """Evaluate the signal at time :math:`t`. Parameters ---------- t : `float` the time instance for evaluation. Returns ------- float The analog signal value """ return ( self.amplitude * np.sin(self.angularFrequency * t + self.phase) + self.offset )
def _mpmath(self, t: Union[mp.mpf, float]): t = mp.mpmathify(t) return ( self._mpmath_dic['amplitude'] * mp.sin( self._mpmath_dic['angularFrequency'] * t + self._mpmath_dic['phase'] ) + self._mpmath_dic['offset'] )
[docs] def symbolic(self) -> sin: """Returns as symbolic exression Returns ------- : :py:class:`sympy.Symbol` a sinusodial function """ return ( self.amplitude * sin(self.angularFrequency * self.t + self.phase + self.sym_phase) + self.offset )