class_docstr: Implements psychoacoustic model of Lin and Abdulla (2015) following Qin et al. (2019) simplifications.
  
  | Paper link: Lin and Abdulla (2015), https://www.springer.com/gp/book/9783319079738
  | Paper link: Qin et al. (2019), http://proceedings.mlr.press/v97/qin19a.html
docstr: Compute the global masking threshold for an audio input and also return its maximum power spectral density.
  
  This method is the main method to call in order to obtain global masking thresholds for an audio input. It also
  returns the maximum power spectral density (PSD) for each frame. Given an audio input, the following steps are
  performed:
  
  1. STFT analysis and sound pressure level normalization
  2. Identification and filtering of maskers
  3. Calculation of individual masking thresholds
  4. Calculation of global masking thresholds
  
  :param audio: Audio samples of shape `(length,)`.
  :return: Global masking thresholds of shape `(window_size // 2 + 1, frame_length)` and the PSD maximum for each
      frame of shape `(frame_length)`.
code: def calculate_threshold_and_psd_maximum(
      self, audio: np.ndarray
  ) -> Tuple[np.ndarray, np.ndarray]:
      """
      Compute the global masking threshold for an audio input and also return its maximum power spectral density.
  
      This method is the main method to call in order to obtain global masking thresholds for an audio input. It also
      returns the maximum power spectral density (PSD) for each frame. Given an audio input, the following steps are
      performed:
  
      1. STFT analysis and sound pressure level normalization
      2. Identification and filtering of maskers
      3. Calculation of individual masking thresholds
      4. Calculation of global masking thresholds
  
      :param audio: Audio samples of shape `(length,)`.
      :return: Global masking thresholds of shape `(window_size // 2 + 1, frame_length)` and the PSD maximum for each
          frame of shape `(frame_length)`.
      """
      psd_matrix, psd_max = self.power_spectral_density(audio)
      threshold = np.zeros_like(psd_matrix)
      for frame in range(psd_matrix.shape[1]):
          # apply methods for finding and filtering maskers
          maskers, masker_idx = self.filter_maskers(
              *self.find_maskers(psd_matrix[:, frame])
          )
          # apply methods for calculating global threshold
          threshold[:, frame] = self.calculate_global_threshold(
              self.calculate_individual_threshold(maskers, masker_idx)
          )
      return threshold, psd_max
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  from typing import TYPE_CHECKING, Optional, Tuple, Union
  import numpy
  import scipy.signal
  from art.attacks.attack import EvasionAttack
  from art.estimators.estimator import BaseEstimator, LossGradientsMixin, NeuralNetworkMixin
  from art.estimators.pytorch import PyTorchEstimator
  from art.estimators.speech_recognition.speech_recognizer import SpeechRecognizerMixin
  from art.estimators.tensorflow import TensorFlowV2Estimator
  from art.utils import pad_sequence_input
label_desc: Use image node_id 2 for calling the PsychoacousticMasker obj's underlying member method code with example usage: obj.calculate_threshold_and_psd_maximum(audio) and returns: threshold,  psd_max