diff --git a/b_asic/signal_generator.py b/b_asic/signal_generator.py index be4543eb04b6d275e65560442a05fad3688e5dc0..8270736ffe96ce2d0fa11ae0ec5ca2451d963be1 100644 --- a/b_asic/signal_generator.py +++ b/b_asic/signal_generator.py @@ -49,6 +49,16 @@ class SignalGenerator: return MultGenerator(self, Constant(other)) return MultGenerator(self, other) + def __truediv__(self, other) -> "MulGenerator": + if isinstance(other, Number): + return DivGenerator(self, Constant(other)) + return DivGenerator(self, other) + + def __rtruediv__(self, other) -> "MulGenerator": + if isinstance(other, Number): + return DivGenerator(Constant(other), self) + return DivGenerator(other, self) + class Impulse(SignalGenerator): """ @@ -187,3 +197,18 @@ class MultGenerator: def __call__(self, time: int) -> complex: return self._a(time) * self._b(time) + + +class DivGenerator: + """ + Signal generator that divides two signals. + """ + + def __init__( + self, a: SignalGenerator, b: SignalGenerator + ) -> Callable[[int], complex]: + self._a = a + self._b = b + + def __call__(self, time: int) -> complex: + return self._a(time) / self._b(time) diff --git a/test/test_signal_generator.py b/test/test_signal_generator.py index 0605120840e64ed06ba154d8a300cb1dff7e091d..9492de379e6dfc62ce8862da2a6fc195a2b0f24a 100644 --- a/test/test_signal_generator.py +++ b/test/test_signal_generator.py @@ -127,3 +127,28 @@ def test_multiplication(): assert g(1) == pytest.approx(sqrt(2)) assert g(2) == pytest.approx(-sqrt(2)) assert g(3) == pytest.approx(-sqrt(2)) + + g = Step(1) * Sinusoid(0.5, 0.25) + assert g(0) == 0 + assert g(1) == pytest.approx(sqrt(2) / 2) + assert g(2) == pytest.approx(-sqrt(2) / 2) + assert g(3) == pytest.approx(-sqrt(2) / 2) + + +def test_division(): + g = Step() / 2 + assert g(-1) == 0.0 + assert g(0) == 0.5 + assert g(1) == 0.5 + assert g(2) == 0.5 + + g = 0.5 / Step() + assert g(0) == 0.5 + assert g(1) == 0.5 + assert g(2) == 0.5 + + g = Sinusoid(0.5, 0.25) / (0.5 * Step()) + assert g(0) == pytest.approx(sqrt(2)) + assert g(1) == pytest.approx(sqrt(2)) + assert g(2) == pytest.approx(-sqrt(2)) + assert g(3) == pytest.approx(-sqrt(2))