code: def __init__(self, N=4, taps=62, cutoff=0.15, beta=9.0):
      super(PQMF, self).__init__()
      # define filter coefficient
      self.N = N
      self.taps = taps
      self.cutoff = cutoff
      self.beta = beta
  
      QMF = sig.firwin(taps + 1, cutoff, window=("kaiser", beta))
      H = np.zeros((N, len(QMF)))
      G = np.zeros((N, len(QMF)))
      for k in range(N):
          constant_factor = (
              (2 * k + 1)
              * (np.pi / (2 * N))
              * (np.arange(taps + 1) - ((taps - 1) / 2))
          )
          phase = (-1) ** k * np.pi / 4
          H[k] = 2 * QMF * np.cos(constant_factor + phase)
  
          G[k] = 2 * QMF * np.cos(constant_factor - phase)
  
      # [N, 1, taps + 1] == [filter_width, in_channels, out_channels]
      self.H = np.transpose(H[:, None, :], (2, 1, 0)).astype("float32")
      self.G = np.transpose(G[None, :, :], (2, 1, 0)).astype("float32")
  
      # filter for downsampling & upsampling
      updown_filter = np.zeros((N, N, N), dtype=np.float32)
      for k in range(N):
          updown_filter[0, k, k] = 1.0
      self.updown_filter = updown_filter.astype(np.float32)
  
file_path: TTS/TTS/vocoder/tf/layers/pqmf.py
imports: import numpy
  import tensorflow
  from scipy import signal
label_desc: Use image node_id 1 to create a new PQMF object from inherited base classes: tf.keras.layers with example: obj = PQMF(N, taps, cutoff, beta)