Source code for tftb.generators.tests.test_amplitude_modulations
import unittest
import numpy as np
from numpy import pi
from scipy.signal import argrelmax
from tftb.tests.test_base import TestBase
import tftb.generators.amplitude_modulated as am
[docs]class TestAmplitudeModulated(TestBase):
[docs] def test_amgauss(self):
"""Test if the gaussian amplitude modulator works correctly."""
time_center = 63
n_points = 128
spread = 10
signal = am.amgauss(n_points, time_center, spread)
# parameters of the underlying gaussian function of the form
# f(x) = a * exp( (-(x - b) **2) / (2 * (c ** 2)))
a, b, c = 1, time_center, spread / np.sqrt(2 * pi)
# Integral of a Gaussian is a * c * sqrt( 2 * pi)
integral = a * c * np.sqrt(2 * pi)
self.assertAlmostEqual(integral, signal.sum())
# Other miscellaneous properties of a Gaussian
maximum = argrelmax(signal)
self.assertEqual(len(maximum), 1)
self.assertEqual(maximum[0][0], time_center - 1)
self.assertAlmostEqual(signal[time_center - 1], 1.0)
self.assert_is_monotonic_increasing(signal[:(time_center - 1)])
self.assert_is_monotonic_decreasing(signal[(time_center - 1):])
infpl1 = np.floor(b - c).astype(int) - 1
infpl2 = np.floor(b + c).astype(int)
self.assert_is_convex(signal[:infpl1])
self.assert_is_concave(signal[infpl1:infpl2])
self.assert_is_convex(signal[infpl2:])
[docs] def test_amexpos(self):
"""Test exponential amplitude modulation."""
n_points, center, spread = 128, 63, 10.0
one_sided = am.amexpos(n_points, center, spread, kind="unilateral")
self.assertEqual(one_sided.max(), 1.0)
self.assert_is_monotonic_decreasing(one_sided[center:])
two_sided = am.amexpos(n_points, center, spread)
self.assertEqual(two_sided.max(), 1.0)
self.assert_is_monotonic_decreasing(two_sided[center:])
self.assert_is_monotonic_increasing(two_sided[:center])
[docs] def test_amrect(self):
"""Test rectangular amplitude modulation."""
n_points, center, spread = 128, 63, 10.0
signal = am.amrect(n_points, center, spread)
self.assertEqual(signal.max(), 1.0)
self.assertEqual(signal[center], 1.0)
np.testing.assert_allclose(np.unique(signal), [0., 1.0])
[docs] def test_amtriang(self):
"""Test triangular amplitude modulation."""
n_points, center, spread = 128, 63, 10.0
signal = am.amtriang(n_points, center, spread)
self.assertEqual(signal.max(), 1.0)
self.assertEqual(signal[center], 1.0)
self.assert_is_monotonic_decreasing(signal[center:])
self.assert_is_monotonic_increasing(signal[:center])
if __name__ == "__main__":
unittest.main()