docs: def mod_4hz(self, rate_wavsample):
      """Computes and returns the 4Hz modulation energy features for the given input wave file"""
  
      # Set parameters
      wl = self.win_length_ms
      ws = self.win_shift_ms
      nf = self.n_filters
      f_min = self.f_min
      f_max = self.f_max
      pre = self.pre_emphasis_coef
  
      c = bob.ap.Spectrogram(rate_wavsample[0], wl, ws, nf, f_min, f_max, pre)
      c.energy_filter=True
      c.log_filter=False
      c.energy_bands=True
  
      sig =  rate_wavsample[1]
      energy_bands = c(sig)
      filtering_res = self.pass_band_filtering(energy_bands, rate_wavsample[0])
      mod_4hz = self.modulation_4hz(filtering_res, rate_wavsample)
      mod_4hz = self.averaging(mod_4hz)
      e = bob.ap.Energy(rate_wavsample[0], wl, ws)
      energy_array = e(rate_wavsample[1])
      labels = self._voice_activity_detection(energy_array, mod_4hz)
      labels = utils.smoothing(labels,self.smoothing_window) # discard isolated speech less than 100ms
      logger.info("After Mod-4Hz based VAD there are %d frames remaining over %d", numpy.sum(labels), len(labels))
      return labels, energy_array, mod_4hz