code: def est_res(signals):
      
      res_levels = np.power(2, np.arange(0, 33))
      # Expanded sample signals. List of numpy arrays
      if isinstance(signals, list):
          n_sig = len(signals)
      # Uniform numpy array
      else:
          if signals.ndim ==1:
              n_sig = 1
          else:
              n_sig = signals.shape[1]
      res = []
  
      for ch in range(n_sig):
          # Estimate the number of steps as the range divided by the
          # minimum increment.
          if isinstance(signals, list):
              sorted_sig = np.sort(np.unique(signals[ch]))
          else:
              if signals.ndim == 1:
                  sorted_sig = np.sort(np.unique(signals))
              else:
                  sorted_sig = np.sort(np.unique(signals[:,ch]))
  
          min_inc = min(np.diff(sorted_sig))
  
          if min_inc == 0:
              # Case where signal is flat. Resolution is 0.
              res.append(0)
          else:
              nlevels = 1 + (sorted_sig[-1]-sorted_sig[0]) / min_inc
              if nlevels >= res_levels[-1]:
                  res.append(32)
              else:
                  res.append(np.where(res_levels>=nlevels)[0][0])
  
      return res
docs: Estimate the resolution of each signal in a multi-channel signal in
      bits. Maximum of 32 bits.
  
      Parameters
      ----------
      signals : numpy array, or list
          A 2d numpy array representing a uniform multichannel signal, or
          a list of 1d numpy arrays representing multiple channels of
          signals with different numbers of samples per frame.
  
      Returns
      -------
      bit_res : list
          A list of estimated integer resolutions for each channel