function frame_(signal, frameLength, frameStep, padEnd, padValue) {
	  if (padEnd === void 0) {
	    padEnd = false;
	  }

	  if (padValue === void 0) {
	    padValue = 0;
	  }

	  var start = 0;
	  var output = [];

	  while (start + frameLength <= signal.size) {
	    output.push(slice$2(signal, start, frameLength));
	    start += frameStep;
	  }

	  if (padEnd) {
	    while (start < signal.size) {
	      var padLen = start + frameLength - signal.size;
	      var pad = concat([slice$2(signal, start, frameLength - padLen), fill([padLen], padValue)]);
	      output.push(pad);
	      start += frameStep;
	    }
	  }

	  if (output.length === 0) {
	    return tensor2d([], [0, frameLength]);
	  }

	  return reshape(concat(output), [output.length, frameLength]);
	}
Expands input into frames of frameLength.
Slides a window size with frameStep.

```js
tf.signal.frame([1, 2, 3], 2, 1).print();
```
@param signal The input tensor to be expanded
@param frameLength Length of each frame
@param frameStep The frame hop size in samples.
@param padEnd Whether to pad the end of signal with padValue.
@param padValue An number to use where the input signal does
    not exist when padEnd is True.

@doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}