code: def get_cqt_complex(
      x, cqt_kernels_real, cqt_kernels_imag, hop_length, padding
  ):
      """Multiplying the STFT result with the cqt_kernel, check out the 1992 CQT paper [1]
      for how to multiple the STFT result with the CQT kernel
      [2] Brown, Judith C.C. and Miller Puckette. “An efficient algorithm for the calculation of
      a constant Q transform.” (1992)."""
  
      # STFT, converting the audio input from time domain to frequency domain
      try:
          x = padding(
              x
          )  # When center == True, we need padding at the beginning and ending
      except:
          warnings.warn(
              f"\ninput size = {x.shape}\tkernel size = {cqt_kernels_real.shape[-1]}\n"
              "padding with reflection mode might not be the best choice, try using constant padding",
              UserWarning,
          )
          x = torch.nn.functional.pad(
              x,
              (
                  cqt_kernels_real.shape[-1] // 2,
                  cqt_kernels_real.shape[-1] // 2,
              ),
          )
      CQT_real = conv1d(x, cqt_kernels_real, stride=hop_length)
      CQT_imag = -conv1d(x, cqt_kernels_imag, stride=hop_length)
  
      return torch.stack((CQT_real, CQT_imag), -1)
  
imports: import sys
  import torch
  from torch.nn.functional import conv1d, fold
  import numpy
  from time import time
  import math
  from scipy.signal import get_window
  from scipy import signal
  from scipy.fftpack import fft
  import warnings
  from nnAudio.librosa_functions import *
label_desc: Use image node_id 16 for calling a global function with example usage: get_cqt_complex(x, cqt_kernels_real, cqt_kernels_imag, hop_length, padding) and returns: torch