@@ -2794,7 +2794,7 @@ def _relative_degree(z, p):
27942794 """
27952795 Return relative degree of transfer function from zeros and poles
27962796 """
2797- degree = len ( p ) - len ( z )
2797+ degree = p . shape [ 0 ] - z . shape [ 0 ]
27982798 if degree < 0 :
27992799 raise ValueError ("Improper transfer function. "
28002800 "Must have at least as many poles as zeros." )
@@ -2941,8 +2941,12 @@ def lp2lp_zpk(z, p, k, wo=1.0):
29412941 >>> lp2lp_zpk(z, p, k, wo)
29422942 ( array([2.8, 0.8]), array([2. , 5.2]), 0.8)
29432943 """
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+
29462950 wo = float (wo ) # Avoid int wraparound
29472951
29482952 degree = _relative_degree (z , p )
@@ -3018,8 +3022,12 @@ def lp2hp_zpk(z, p, k, wo=1.0):
30183022 array([-0.6 , -0.15]),
30193023 8.5)
30203024 """
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+
30233031 wo = float (wo )
30243032
30253033 degree = _relative_degree (z , p )
@@ -3030,10 +3038,10 @@ def lp2hp_zpk(z, p, k, wo=1.0):
30303038 p_hp = wo / p
30313039
30323040 # 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 ) ))
30343042
30353043 # 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 ))
30373045
30383046 return z_hp , p_hp , k_hp
30393047
@@ -3104,8 +3112,12 @@ def lp2bp_zpk(z, p, k, wo=1.0, bw=1.0):
31043112 array([1.04996339e+02+0.j, -1.60167736e-03+0.j, 3.66108003e-03+0.j,
31053113 -2.39998398e+02+0.j]), 0.8)
31063114 """
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+
31093121 wo = float (wo )
31103122 bw = float (bw )
31113123
@@ -3116,17 +3128,17 @@ def lp2bp_zpk(z, p, k, wo=1.0, bw=1.0):
31163128 p_lp = p * bw / 2
31173129
31183130 # 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 )
31213133
31223134 # 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 )))
31273139
31283140 # 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 ) ))
31303142
31313143 # Cancel out gain change from frequency scaling
31323144 k_bp = k * bw ** degree
@@ -3199,8 +3211,12 @@ def lp2bs_zpk(z, p, k, wo=1.0, bw=1.0):
31993211 array([14.2681928 +0.j, -0.02506281+0.j, 0.01752149+0.j, -9.97493719+0.j]),
32003212 -12.857142857142858)
32013213 """
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+
32043220 wo = float (wo )
32053221 bw = float (bw )
32063222
@@ -3211,21 +3227,21 @@ def lp2bs_zpk(z, p, k, wo=1.0, bw=1.0):
32113227 p_hp = (bw / 2 ) / p
32123228
32133229 # 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 )
32163232
32173233 # 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 )))
32223238
32233239 # 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 ) ))
32263242
32273243 # 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 ))
32293245
32303246 return z_bs , p_bs , k_bs
32313247
0 commit comments