File: test_frequency.py

package info (click to toggle)
scikit-rf 1.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 82,128 kB
  • sloc: python: 33,328; makefile: 130; sh: 19
file content (120 lines) | stat: -rw-r--r-- 4,602 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import unittest

import numpy as np

import skrf as rf
from skrf.frequency import InvalidFrequencyWarning


class FrequencyTestCase(unittest.TestCase):
    """ """

    def setUp(self):
        """ """
        self.test_dir = os.path.dirname(os.path.abspath(__file__)) + "/"

    def test_create_linear_sweep(self):
        freq = rf.Frequency(1, 10, 10, "ghz")
        self.assertTrue((freq.f == np.linspace(1, 10, 10) * 1e9).all())
        self.assertTrue((freq.f_scaled == np.linspace(1, 10, 10)).all())
        self.assertTrue(freq.sweep_type == "lin")

    def test_create_log_sweep(self):
        freq = rf.Frequency(1, 10, 10, "ghz", sweep_type="log")
        # Check end points
        self.assertTrue(freq.f[0] == 1e9)
        self.assertTrue(freq.f[-1] == 10e9)
        spacing = [freq.f[i + 1] / freq.f[i] for i in range(len(freq.f) - 1)]
        # Check that frequency is increasing
        self.assertTrue(all(s > 1 for s in spacing))
        # Check that ratio of adjacent frequency points is identical
        self.assertTrue(all(abs(spacing[i] - spacing[0]) < 1e-10 for i in range(len(spacing))))
        self.assertTrue(freq.sweep_type == "log")

    def test_create_rando_sweep(self):
        f = np.array([1, 5, 200])
        freq = rf.Frequency.from_f(f, unit="khz")
        self.assertTrue((freq.f == f * 1e3).all())
        self.assertTrue((freq.f_scaled == f).all())

        # TODO : in next release
        # with self.assertRaises(AttributeError):
        #     # number of point is a property and can't be set
        #     freq.npoints = 10

    def test_rando_sweep_from_touchstone(self):
        """
        this also tests the ability to read a touchstone file.
        """
        rando_sweep_ntwk = rf.Network(os.path.join(self.test_dir, "ntwk_arbitrary_frequency.s2p"))
        self.assertTrue((rando_sweep_ntwk.f == np.array([1, 4, 10, 20])).all())

    def test_slicer(self):
        a = rf.Frequency.from_f([1, 2, 4, 5, 6], unit="GHz")

        b = a["2-5ghz"]
        tinyfloat = 1e-12
        self.assertTrue((abs(b.f - [2e9, 4e9, 5e9]) < tinyfloat).all())

    def test_frequency_check(self):
        with self.assertWarns(InvalidFrequencyWarning):
            freq = rf.Frequency.from_f([2, 1], unit="Hz")

        with self.assertWarns(InvalidFrequencyWarning):
            freq = rf.Frequency.from_f([1, 2, 2], unit="Hz")

        with self.assertWarns(InvalidFrequencyWarning):
            freq = rf.Frequency.from_f([1, 2, 2], unit="Hz")
            inv = freq.drop_non_monotonic_increasing()
            self.assertListEqual(inv, [2])
            self.assertTrue(np.allclose(freq.f, [1, 2]))

    def test_immutability(self):
        """
        To avoid corner cases, it is not be possible to change the
        frequency points directly.
        """
        a = rf.Frequency.from_f([1, 2, 4, 5, 6], unit="Hz")
        with self.assertRaises(AttributeError):
            a.f = [1, 2]
        with self.assertRaises(AttributeError):
            a.npoints = 10
        with self.assertRaises(AttributeError):
            a.start = 2
        with self.assertRaises(AttributeError):
            a.stop = 10

    def test_frequency_math(self):
        from operator import add, floordiv, mod, mul, sub, truediv

        # Test all the basic operators
        for op in (add, sub, mul, floordiv, truediv, mod):
            # Test 2 Frequency objects
            a = rf.Frequency(1, 10, 10, "GHz")
            b = rf.Frequency.from_f(10, "Hz")
            self.assertTrue(np.array_equal(op(a, b).f, op(a.f, b.f)))

            # Test a Frequency object and an integer
            c = rf.Frequency(1, 10, 10, "GHz")
            d = 5
            self.assertTrue(np.array_equal(op(c, d).f, op(c.f, d)))

            # Test a Frequency object and a float
            e = rf.Frequency(1, 10, 10, "GHz")
            f_ = 5.31
            self.assertTrue(np.array_equal(op(e, f_).f, op(e.f, f_)))

            # Test a Frequency object and a numpy array of the appropriate length
            g = rf.Frequency(1, 10, 10, "GHz")
            h = np.linspace(10, 100, g.f.size)
            self.assertTrue(np.array_equal(op(g, h).f, op(g.f, h)))

            # Test a Frequency object and a numpy array of an inappropriate length
            i = rf.Frequency(1, 10, 10, "GHz")
            j = np.linspace(10, 100, g.f.size * 2)
            with self.assertRaises(ValueError) as context:
                np.array_equal(op(i, j).f, op(i.f, j))

suite = unittest.TestLoader().loadTestsFromTestCase(FrequencyTestCase)
unittest.TextTestRunner(verbosity=2).run(suite)