code: def lp2bp_zpk(z, p, k, wo=1.0, bw=1.0):
      r"""
      Transform a lowpass filter prototype to a bandpass filter.
  
      Return an analog band-pass filter with center frequency `wo` and
      bandwidth `bw` from an analog low-pass filter prototype with unity
      cutoff frequency, using zeros, poles, and gain ('zpk') representation.
  
      Parameters
      ----------
      z : array_like
          Zeros of the analog filter transfer function.
      p : array_like
          Poles of the analog filter transfer function.
      k : float
          System gain of the analog filter transfer function.
      wo : float
          Desired passband center, as angular frequency (e.g., rad/s).
          Defaults to no change.
      bw : float
          Desired passband width, as angular frequency (e.g., rad/s).
          Defaults to 1.
  
      Returns
      -------
      z : ndarray
          Zeros of the transformed band-pass filter transfer function.
      p : ndarray
          Poles of the transformed band-pass filter transfer function.
      k : float
          System gain of the transformed band-pass filter.
  
      See Also
      --------
      lp2lp_zpk, lp2hp_zpk, lp2bs_zpk, bilinear
      lp2bp
      scipy.signal.lp2bp_zpk
  
      Notes
      -----
      This is derived from the s-plane substitution
  
      .. math:: s \rightarrow \frac{s^2 + {\omega_0}^2}{s \cdot \mathrm{BW}}
  
      This is the "wideband" transformation, producing a passband with
      geometric (log frequency) symmetry about `wo`.
  
      """
      z = cupy.atleast_1d(z)
      p = cupy.atleast_1d(p)
      wo = float(wo)
      bw = float(bw)
  
      degree = _relative_degree(z, p)
  
      # Scale poles and zeros to desired bandwidth
      z_lp = z * bw / 2
      p_lp = p * bw / 2
  
      # Square root needs to produce complex result, not NaN
      z_lp = z_lp.astype(complex)
      p_lp = p_lp.astype(complex)
  
      # Duplicate poles and zeros and shift from baseband to +wo and -wo
      z_bp = cupy.concatenate(
          (
              z_lp + cupy.sqrt(z_lp**2 - wo**2),
              z_lp - cupy.sqrt(z_lp**2 - wo**2),
          )
      )
      p_bp = cupy.concatenate(
          (
              p_lp + cupy.sqrt(p_lp**2 - wo**2),
              p_lp - cupy.sqrt(p_lp**2 - wo**2),
          )
      )
  
      # Move degree zeros to origin, leaving degree zeros at infinity for BPF
      z_bp = cupy.append(z_bp, cupy.zeros(degree))
  
      # Cancel out gain change from frequency scaling
      k_bp = k * bw**degree
  
      return z_bp, p_bp, k_bp
  
imports: import warnings
  import math
  from math import pi, prod
  import cupy
  from cupyx.scipy.special import binom
  import cupyx.scipy.special
  from cupyx.scipy.signal import _optimize
  from cupyx.scipy.signal._polyutils import roots, poly
  from cupyx.scipy.signal._lti_conversion import abcd_normalize
label_desc: Use image node_id 13 for calling a global function with example usage: lp2bp_zpk(z, p, k, wo, bw) and returns: z_bp,  p_bp,  k_bp