class_docstr: Computing filter banks is applying triangular filters on a Mel-scale to the power
   spectrum to extract frequency bands. Return a float tensor with shape
   (num_channels, num_frames, num_frequencies).
docstr: Caculate fbank features of audio data.
  :param audio_data: the audio signal from which to compute spectrum.
                     Should be an (1, N) tensor.
  :param sample_rate: [option]the samplerate of the signal we working with,
                       default is 16kHz.
  :return: A float tensor of size (num_frames, num_frequencies, num_channels) containing
          fbank features of every frame in speech.
docstr_tok: ["Caculate","fbank","features","of","audio","data",".",":","param","audio_data",":","the","audio","signal","from","which","to","compute","spectrum",".","Should","be","an","(","1",",","N",")","tensor",".",":","param","sample_rate",":","[","option","]","the","samplerate","of","the","signal","we","working","with",",","default","is","16kHz",".",":","return",":","A","float","tensor","of","size","(","num_frames",",","num_frequencies",",","num_channels",")","containing","fbank","features","of","every","frame","in","speech","."]
code: def call(self, audio_data, sample_rate=None):
      """
      Caculate fbank features of audio data.
      :param audio_data: the audio signal from which to compute spectrum.
                         Should be an (1, N) tensor.
      :param sample_rate: [option]the samplerate of the signal we working with,
                           default is 16kHz.
      :return: A float tensor of size (num_frames, num_frequencies, num_channels) containing
              fbank features of every frame in speech.
      """
      p = self.config
      with tf.name_scope("fbank"):
          if sample_rate == None:
              sample_rate = tf.constant(p.sample_rate, dtype=tf.int32)
  
          if p.upper_frequency_limit <= 0:
              p.upper_frequency_limit = (
                  p.sample_rate / 2.0 + p.upper_frequency_limit
              )
          elif (p.upper_frequency_limit <= p.lower_frequency_limit) or (
              p.upper_frequency_limit > p.sample_rate / 2.0
          ):
              p.upper_frequency_limit = p.sample_rate / 2.0
  
          assert_op = tf.assert_equal(
              tf.constant(p.sample_rate),
              tf.cast(sample_rate, dtype=tf.int32),
          )
          with tf.control_dependencies([assert_op]):
              spectrum = self.spect(audio_data, sample_rate)
              spectrum = tf.expand_dims(spectrum, 0)
  
              fbank = py_x_ops.fbank(
                  spectrum,
                  sample_rate,
                  upper_frequency_limit=p.upper_frequency_limit,
                  lower_frequency_limit=p.lower_frequency_limit,
                  filterbank_channel_count=p.filterbank_channel_count,
                  is_log10=p.is_log10,
              )
  
              fbank = tf.squeeze(fbank, axis=0)
              shape = tf.shape(fbank)
              nframe = shape[0]
              nfbank = shape[1]
              fbank = tf.reshape(fbank, (nframe, nfbank, 1))
  
              return fbank
  
file_path: delta/delta/data/frontend/fbank.py
imports: import tensorflow
  from core.ops import py_x_ops
  from delta.utils.hparam import HParams
  from delta.data.frontend.base_frontend import BaseFrontend
  from delta.data.frontend.spectrum import Spectrum
label_desc: Use image node_id 3 for calling the Fbank obj's underlying member method code with example usage: obj.call(audio_data, sample_rate) and returns: fbank