@@ -2794,7 +2794,7 @@ def _relative_degree(z, p):
2794
2794
"""
2795
2795
Return relative degree of transfer function from zeros and poles
2796
2796
"""
2797
- degree = len ( p ) - len ( z )
2797
+ degree = p . shape [ 0 ] - z . shape [ 0 ]
2798
2798
if degree < 0 :
2799
2799
raise ValueError ("Improper transfer function. "
2800
2800
"Must have at least as many poles as zeros." )
@@ -2941,8 +2941,12 @@ def lp2lp_zpk(z, p, k, wo=1.0):
2941
2941
>>> lp2lp_zpk(z, p, k, wo)
2942
2942
( array([2.8, 0.8]), array([2. , 5.2]), 0.8)
2943
2943
"""
2944
- z = atleast_1d (z )
2945
- p = atleast_1d (p )
2944
+ xp = array_namespace (z , p )
2945
+
2946
+ z , p = map (xp .asarray , (z , p ))
2947
+ z = xpx .atleast_nd (z , ndim = 1 , xp = xp )
2948
+ p = xpx .atleast_nd (p , ndim = 1 , xp = xp )
2949
+
2946
2950
wo = float (wo ) # Avoid int wraparound
2947
2951
2948
2952
degree = _relative_degree (z , p )
@@ -3018,8 +3022,12 @@ def lp2hp_zpk(z, p, k, wo=1.0):
3018
3022
array([-0.6 , -0.15]),
3019
3023
8.5)
3020
3024
"""
3021
- z = atleast_1d (z )
3022
- p = atleast_1d (p )
3025
+ xp = array_namespace (z , p )
3026
+
3027
+ z , p = map (xp .asarray , (z , p ))
3028
+ z = xpx .atleast_nd (z , ndim = 1 , xp = xp )
3029
+ p = xpx .atleast_nd (p , ndim = 1 , xp = xp )
3030
+
3023
3031
wo = float (wo )
3024
3032
3025
3033
degree = _relative_degree (z , p )
@@ -3030,10 +3038,10 @@ def lp2hp_zpk(z, p, k, wo=1.0):
3030
3038
p_hp = wo / p
3031
3039
3032
3040
# If lowpass had zeros at infinity, inverting moves them to origin.
3033
- z_hp = append ( z_hp , zeros (degree ))
3041
+ z_hp = xp . concat (( z_hp , xp . zeros (degree ) ))
3034
3042
3035
3043
# Cancel out gain change caused by inversion
3036
- k_hp = k * real (prod (- z ) / prod (- p ))
3044
+ k_hp = k * xp . real (xp . prod (- z ) / xp . prod (- p ))
3037
3045
3038
3046
return z_hp , p_hp , k_hp
3039
3047
@@ -3104,8 +3112,12 @@ def lp2bp_zpk(z, p, k, wo=1.0, bw=1.0):
3104
3112
array([1.04996339e+02+0.j, -1.60167736e-03+0.j, 3.66108003e-03+0.j,
3105
3113
-2.39998398e+02+0.j]), 0.8)
3106
3114
"""
3107
- z = atleast_1d (z )
3108
- p = atleast_1d (p )
3115
+ xp = array_namespace (z , p )
3116
+
3117
+ z , p = map (xp .asarray , (z , p ))
3118
+ z = xpx .atleast_nd (z , ndim = 1 , xp = xp )
3119
+ p = xpx .atleast_nd (p , ndim = 1 , xp = xp )
3120
+
3109
3121
wo = float (wo )
3110
3122
bw = float (bw )
3111
3123
@@ -3116,17 +3128,17 @@ def lp2bp_zpk(z, p, k, wo=1.0, bw=1.0):
3116
3128
p_lp = p * bw / 2
3117
3129
3118
3130
# Square root needs to produce complex result, not NaN
3119
- z_lp = z_lp .astype (complex )
3120
- p_lp = p_lp .astype (complex )
3131
+ z_lp = xp .astype (z_lp , xp . complex128 )
3132
+ p_lp = xp .astype (p_lp , xp . complex128 )
3121
3133
3122
3134
# Duplicate poles and zeros and shift from baseband to +wo and -wo
3123
- z_bp = concatenate ((z_lp + sqrt (z_lp ** 2 - wo ** 2 ),
3124
- z_lp - sqrt (z_lp ** 2 - wo ** 2 )))
3125
- p_bp = concatenate ((p_lp + sqrt (p_lp ** 2 - wo ** 2 ),
3126
- p_lp - sqrt (p_lp ** 2 - wo ** 2 )))
3135
+ z_bp = xp . concat ((z_lp + xp . sqrt (z_lp ** 2 - wo ** 2 ),
3136
+ z_lp - xp . sqrt (z_lp ** 2 - wo ** 2 )))
3137
+ p_bp = xp . concat ((p_lp + xp . sqrt (p_lp ** 2 - wo ** 2 ),
3138
+ p_lp - xp . sqrt (p_lp ** 2 - wo ** 2 )))
3127
3139
3128
3140
# Move degree zeros to origin, leaving degree zeros at infinity for BPF
3129
- z_bp = append ( z_bp , zeros (degree ))
3141
+ z_bp = xp . concat (( z_bp , xp . zeros (degree ) ))
3130
3142
3131
3143
# Cancel out gain change from frequency scaling
3132
3144
k_bp = k * bw ** degree
@@ -3199,8 +3211,12 @@ def lp2bs_zpk(z, p, k, wo=1.0, bw=1.0):
3199
3211
array([14.2681928 +0.j, -0.02506281+0.j, 0.01752149+0.j, -9.97493719+0.j]),
3200
3212
-12.857142857142858)
3201
3213
"""
3202
- z = atleast_1d (z )
3203
- p = atleast_1d (p )
3214
+ xp = array_namespace (z , p )
3215
+
3216
+ z , p = map (xp .asarray , (z , p ))
3217
+ z = xpx .atleast_nd (z , ndim = 1 , xp = xp )
3218
+ p = xpx .atleast_nd (p , ndim = 1 , xp = xp )
3219
+
3204
3220
wo = float (wo )
3205
3221
bw = float (bw )
3206
3222
@@ -3211,21 +3227,21 @@ def lp2bs_zpk(z, p, k, wo=1.0, bw=1.0):
3211
3227
p_hp = (bw / 2 ) / p
3212
3228
3213
3229
# Square root needs to produce complex result, not NaN
3214
- z_hp = z_hp .astype (complex )
3215
- p_hp = p_hp .astype (complex )
3230
+ z_hp = xp .astype (z_hp , xp . complex128 )
3231
+ p_hp = xp .astype (p_hp , xp . complex128 )
3216
3232
3217
3233
# Duplicate poles and zeros and shift from baseband to +wo and -wo
3218
- z_bs = concatenate ((z_hp + sqrt (z_hp ** 2 - wo ** 2 ),
3219
- z_hp - sqrt (z_hp ** 2 - wo ** 2 )))
3220
- p_bs = concatenate ((p_hp + sqrt (p_hp ** 2 - wo ** 2 ),
3221
- p_hp - sqrt (p_hp ** 2 - wo ** 2 )))
3234
+ z_bs = xp . concat ((z_hp + xp . sqrt (z_hp ** 2 - wo ** 2 ),
3235
+ z_hp - xp . sqrt (z_hp ** 2 - wo ** 2 )))
3236
+ p_bs = xp . concat ((p_hp + xp . sqrt (p_hp ** 2 - wo ** 2 ),
3237
+ p_hp - xp . sqrt (p_hp ** 2 - wo ** 2 )))
3222
3238
3223
3239
# Move any zeros that were at infinity to the center of the stopband
3224
- z_bs = append ( z_bs , full (degree , + 1j * wo ))
3225
- z_bs = append ( z_bs , full (degree , - 1j * wo ))
3240
+ z_bs = xp . concat (( z_bs , xp . full (degree , + 1j * wo ) ))
3241
+ z_bs = xp . concat (( z_bs , xp . full (degree , - 1j * wo ) ))
3226
3242
3227
3243
# Cancel out gain change caused by inversion
3228
- k_bs = k * real (prod (- z ) / prod (- p ))
3244
+ k_bs = k * xp . real (xp . prod (- z ) / xp . prod (- p ))
3229
3245
3230
3246
return z_bs , p_bs , k_bs
3231
3247
0 commit comments