47
47
48
48
"""
49
49
50
- from scipy .signal import zpk2tf , tf2zpk , cont2discrete
50
+ from scipy .signal import zpk2tf , tf2zpk
51
51
import numpy as np
52
52
from cmath import exp
53
53
from warnings import warn
57
57
58
58
# Sample a continuous time system
59
59
def sample_system (sysc , Ts , method = 'matched' ):
60
- # TODO: add docstring
60
+ """Convert a continuous time system to discrete time
61
+
62
+ Creates a discrete time system from a continuous time system by
63
+ sampling. Multiple methods of conversion are supported.
64
+
65
+ Parameters
66
+ ----------
67
+ sysc : linsys
68
+ Continuous time system to be converted
69
+ Ts : real
70
+ Sampling period
71
+ method : string
72
+ Method to use for conversion: 'matched' (default), 'tustin', 'zoh'
73
+
74
+ Returns
75
+ -------
76
+ sysd : linsys
77
+ Discrete time system, with sampling rate Ts
78
+
79
+ Notes
80
+ -----
81
+ 1. The conversion methods 'tustin' and 'zoh' require the
82
+ cont2discrete() function, including in SciPy 0.10.0 and above.
83
+
84
+ 2. Additional methods 'foh' and 'impulse' are planned for future
85
+ implementation.
86
+
87
+ Examples
88
+ --------
89
+ >>> sysc = TransferFunction([1], [1, 2, 1])
90
+ >>> sysd = sample_system(sysc, 1, method='matched')
91
+ """
61
92
62
93
# Make sure we have a continuous time system
63
94
if not isctime (sysc ):
@@ -77,14 +108,22 @@ def sample_system(sysc, Ts, method='matched'):
77
108
sysd = _c2dmatched (sysc , Ts )
78
109
79
110
elif method == 'tustin' :
80
- sys = [sysc .num [0 ][0 ], sysc .den [0 ][0 ]]
81
- scipySysD = cont2discrete (sys , Ts , method = 'bilinear' )
82
- sysd = TransferFunction (scipySysD [0 ][0 ], scipySysD [1 ], dt )
83
-
111
+ try :
112
+ from scipy .signal import cont2discrete
113
+ sys = [sysc .num [0 ][0 ], sysc .den [0 ][0 ]]
114
+ scipySysD = cont2discrete (sys , Ts , method = 'bilinear' )
115
+ sysd = TransferFunction (scipySysD [0 ][0 ], scipySysD [1 ], dt )
116
+ except ImportError :
117
+ raise TypeError ("cont2discrete not found in scipy.signal; upgrade to v0.10.0+" )
118
+
84
119
elif method == 'zoh' :
85
- sys = [sysc .num [0 ][0 ], sysc .den [0 ][0 ]]
86
- scipySysD = cont2discrete (sys , Ts , method = 'zoh' )
87
- sysd = TransferFunction (scipySysD [0 ][0 ],scipySysD [1 ], dt )
120
+ try :
121
+ from scipy .signal import cont2discrete
122
+ sys = [sysc .num [0 ][0 ], sysc .den [0 ][0 ]]
123
+ scipySysD = cont2discrete (sys , Ts , method = 'zoh' )
124
+ sysd = TransferFunction (scipySysD [0 ][0 ],scipySysD [1 ], dt )
125
+ except ImportError :
126
+ raise TypeError ("cont2discrete not found in scipy.signal; upgrade to v0.10.0+" )
88
127
89
128
elif method == 'foh' or method == 'impulse' :
90
129
raise ValueError ("Method not developed yet" )
0 commit comments