code: def framesig(sig, frame_len, frame_step, winfunc=lambda x: numpy.ones((x,)), stride_trick=True):
      
      slen = len(sig)
      frame_len = int(round_half_up(frame_len))
      frame_step = int(round_half_up(frame_step))
      if slen <= frame_len:
          numframes = 1
      else:
          numframes = 1 + int(math.ceil((1.0 * slen - frame_len) / frame_step))
  
      padlen = int((numframes - 1) * frame_step + frame_len)
  
      zeros = numpy.zeros((padlen - slen,))
      padsignal = numpy.concatenate((sig, zeros))
      if stride_trick:
          win = winfunc(frame_len)
          frames = rolling_window(padsignal, window=frame_len, step=frame_step)
      else:
          indices = numpy.tile(numpy.arange(0, frame_len), (numframes, 1)) + numpy.tile(
              numpy.arange(0, numframes * frame_step, frame_step), (frame_len, 1)).T
          indices = numpy.array(indices, dtype=numpy.int32)
          frames = padsignal[indices]
          win = numpy.tile(winfunc(frame_len), (numframes, 1))
  
      return frames * win
docs: Frame a signal into overlapping frames.
  
      :param sig: the audio signal to frame.
      :param frame_len: length of each frame measured in samples.
      :param frame_step: number of samples after the start of the previous frame that the next frame should begin.
      :param winfunc: the analysis window to apply to each frame. By default no window is applied.
      :param stride_trick: use stride trick to compute the rolling window and window multiplication faster
      :returns: an array of frames. Size is NUMFRAMES by frame_len.