-
Notifications
You must be signed in to change notification settings - Fork 450
Expand file tree
/
Copy pathctrlutil.py
More file actions
120 lines (90 loc) · 2.87 KB
/
ctrlutil.py
File metadata and controls
120 lines (90 loc) · 2.87 KB
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
# ctrlutil.py - control system utility functions
#
# Initial author: Richard M. Murray
# Creation date: 24 May 2009
# Use `git shortlog -n -s ctrlutil.py` for full list of contributors
"""Control system utility functions."""
import math
import warnings
import numpy as np
from .lti import LTI
__all__ = ['unwrap', 'issys', 'db2mag', 'mag2db']
# Utility function to unwrap an angle measurement
def unwrap(angle, period=2*math.pi):
"""Unwrap a phase angle to give a continuous curve.
Parameters
----------
angle : array_like
Array of angles to be unwrapped.
period : float, optional
Period (defaults to 2 pi).
Returns
-------
angle_out : ndarray
Output array, with jumps of period/2 eliminated.
Examples
--------
>>> # Already continuous
>>> theta1 = np.array([1.0, 1.5, 2.0, 2.5, 3.0]) * np.pi
>>> theta2 = ct.unwrap(theta1)
>>> theta2/np.pi # doctest: +SKIP
array([1. , 1.5, 2. , 2.5, 3. ])
>>> # Wrapped, discontinuous
>>> theta1 = np.array([1.0, 1.5, 0.0, 0.5, 1.0]) * np.pi
>>> theta2 = ct.unwrap(theta1)
>>> theta2/np.pi # doctest: +SKIP
array([1. , 1.5, 2. , 2.5, 3. ])
"""
dangle = np.diff(angle)
dangle_desired = (dangle + period/2.) % period - period/2.
correction = np.cumsum(dangle_desired - dangle)
angle[1:] += correction
return angle
def issys(obj):
"""Deprecated function to check if an object is an LTI system.
.. deprecated:: 0.10.0
Use isinstance(obj, ct.LTI)
"""
warnings.warn("issys() is deprecated; use isinstance(obj, ct.LTI)",
FutureWarning, stacklevel=2)
return isinstance(obj, LTI)
def db2mag(db):
"""Convert a gain in decibels (dB) to a magnitude.
If A is magnitude,
db = 20 * log10(A)
Parameters
----------
db : float or ndarray
Input value or array of values, given in decibels.
Returns
-------
mag : float or ndarray
Corresponding magnitudes.
Examples
--------
>>> ct.db2mag(-40.0) # doctest: +SKIP
0.01
>>> ct.db2mag(np.array([0, -20])) # doctest: +SKIP
array([1. , 0.1])
"""
return 10. ** (db / 20.)
def mag2db(mag):
"""Convert a magnitude to decibels (dB).
If A is magnitude,
db = 20 * log10(A)
Parameters
----------
mag : float or ndarray
Input magnitude or array of magnitudes.
Returns
-------
db : float or ndarray
Corresponding values in decibels.
Examples
--------
>>> ct.mag2db(10.0) # doctest: +SKIP
20.0
>>> ct.mag2db(np.array([1, 0.01])) # doctest: +SKIP
array([ 0., -40.])
"""
return 20. * np.log10(mag)