code: def stft(self, samples: np.ndarray):
          
          window = self.window_function(self.window_size)
          hop_size = self.hop_size
  
          if len(samples) < self.window_size:
              samples = np.append(samples, np.zeros(self.window_size - len(samples)))
  
          num_frames = max(1, (len(samples) - self.window_size) // hop_size + 1)
  
          # Get frames as numpy view with stride_tricks to save RAM
          # Same as: frames = [padded_samples[i*hop_size:i*hop_size+self.window_size] for i in range(num_frames)]
          shape = (num_frames, self.window_size)
          strides = (hop_size * samples.strides[-1], samples.strides[-1])
          frames = np.lib.stride_tricks.as_strided(samples, shape=shape, strides=strides)
  
          result = np.fft.fft(frames * window, self.window_size) / np.atleast_1d(self.window_size)
          return result
docs: Perform Short-time Fourier transform to get the spectrogram for the given samples
          :return: short-time Fourier transform of the given signal