class_docstr: This algorithm is using the resampling method proposed in [1].
  Instead of convoluting the STFT results with a gigantic CQT kernel covering the full frequency
  spectrum, we make a small CQT kernel covering only the top octave.
  Then we keep downsampling the input audio by a factor of 2 to convoluting it with the
  small CQT kernel. Everytime the input audio is downsampled, the CQT relative to the downsampled
  input is equavalent to the next lower octave.
  The kernel creation process is still same as the 1992 algorithm. Therefore, we can reuse the code
  from the 1992 alogrithm [2]
  [1] Schörkhuber, Christian. “CONSTANT-Q TRANSFORM TOOLBOX FOR MUSIC PROCESSING.” (2010).
  [2] Brown, Judith C.C. and Miller Puckette. “An efficient algorithm for the calculation of a
  constant Q transform.” (1992).
  early downsampling factor is to downsample the input audio to reduce the CQT kernel size.
  The result with and without early downsampling are more or less the same except in the very low
  frequency region where freq < 40Hz.
class_docstr_tok: ["This","algorithm","is","using","the","resampling","method","proposed","in","[","1","]",".","Instead","of","convoluting","the","STFT","results","with","a","gigantic","CQT","kernel","covering","the","full","frequency","spectrum",",","we","make","a","small","CQT","kernel","covering","only","the","top","octave",".","Then","we","keep","downsampling","the","input","audio","by","a","factor","of","2","to","convoluting","it","with","the","small","CQT","kernel",".","Everytime","the","input","audio","is","downsampled",",","the","CQT","relative","to","the","downsampled","input","is","equavalent","to","the","next","lower","octave",".","The","kernel","creation","process","is","still","same","as","the","1992","algorithm",".","Therefore",",","we","can","reuse","the","code","from","the","1992","alogrithm","[","2","]","[","1","]","Sch\u00f6rkhuber",",","Christian",".","\u201c","CONSTANT-Q","TRANSFORM","TOOLBOX","FOR","MUSIC","PROCESSING.","\u201d","(","2010",")",".","[","2","]","Brown",",","Judith","C.C",".","and","Miller","Puckette",".","\u201c","An","efficient","algorithm","for","the","calculation","of","a","constant","Q","transform.","\u201d","(","1992",")",".","early","downsampling","factor","is","to","downsample","the","input","audio","to","reduce","the","CQT","kernel","size",".","The","result","with","and","without","early","downsampling","are","more","or","less","the","same","except","in","the","very","low","frequency","region","where","freq","<","40Hz","."]
docstr: Convert a batch of waveforms to CQT spectrograms.
  
  Parameters
  ----------
  x : torch tensor
      Input signal should be in either of the following shapes.
  
      1. ``(len_audio)``
  
      2. ``(num_audio, len_audio)``
  
      3. ``(num_audio, 1, len_audio)``
      It will be automatically broadcast to the right shape
docstr_tok: ["Convert","a","batch","of","waveforms","to","CQT","spectrograms",".","Parameters","--","--","--","--","--","x",":","torch","tensor","Input","signal","should","be","in","either","of","the","following","shapes",".","1",".","``","(","len_audio",")","``","2",".","``","(","num_audio",",","len_audio",")","``","3",".","``","(","num_audio",",","1",",","len_audio",")","``","It","will","be","automatically","broadcast","to","the","right","shape"]
code: def forward(
      self, x, output_format=None, normalization_type="librosa"
  ):
      """
      Convert a batch of waveforms to CQT spectrograms.
  
      Parameters
      ----------
      x : torch tensor
          Input signal should be in either of the following shapes.\n
          1. ``(len_audio)``\n
          2. ``(num_audio, len_audio)``\n
          3. ``(num_audio, 1, len_audio)``
          It will be automatically broadcast to the right shape
      """
      output_format = output_format or self.output_format
  
      x = broadcast_dim(x)
      if self.earlydownsample == True:
          x = downsampling_by_n(
              x, self.early_downsample_filter, self.downsample_factor
          )
      hop = self.hop_length
  
      CQT = get_cqt_complex2(
          x,
          self.cqt_kernels_real,
          self.cqt_kernels_imag,
          hop,
          self.padding,
          wcos=self.wcos,
          wsin=self.wsin,
      )
  
      x_down = x  # Preparing a new variable for downsampling
      for i in range(self.n_octaves - 1):
          hop = hop // 2
          x_down = downsampling_by_2(x_down, self.lowpass_filter)
  
          CQT1 = get_cqt_complex2(
              x_down,
              self.cqt_kernels_real,
              self.cqt_kernels_imag,
              hop,
              self.padding,
              wcos=self.wcos,
              wsin=self.wsin,
          )
          CQT = torch.cat((CQT1, CQT), 1)
  
      CQT = CQT[:, -self.n_bins :, :]  # Removing unwanted top bins
  
      if normalization_type == "librosa":
          CQT *= torch.sqrt(self.lenghts.view(-1, 1, 1)) / self.n_fft
      elif normalization_type == "convolutional":
          pass
      elif normalization_type == "wrap":
          CQT *= 2 / self.n_fft
      else:
          raise ValueError(
              "The normalization_type %r is not part of our current options."
              % normalization_type
          )
  
      if output_format == "Magnitude":
          # Getting CQT Amplitude
          return torch.sqrt(CQT.pow(2).sum(-1))
  
      elif output_format == "Complex":
          return CQT
  
      elif output_format == "Phase":
          phase_real = torch.cos(
              torch.atan2(CQT[:, :, :, 1], CQT[:, :, :, 0])
          )
          phase_imag = torch.sin(
              torch.atan2(CQT[:, :, :, 1], CQT[:, :, :, 0])
          )
          return torch.stack((phase_real, phase_imag), -1)
  
imports: import torch.nn
  import torch
  import numpy
  from time import time
  from ..utils import *
  from ..utils import *
label_desc: Use image node_id 2 for calling the CQT2010 obj's underlying member method code with example usage: obj.forward(x, output_format, normalization_type) and returns: torch, CQT, torch