View source on GitHub |
Expands signal
's axis
dimension into frames of frame_length
.
tf.signal.frame(
signal,
frame_length,
frame_step,
pad_end=False,
pad_value=0,
axis=-1,
name=None
)
Slides a window of size frame_length
over signal
's axis
dimension
with a stride of frame_step
, replacing the axis
dimension with
[frames, frame_length]
frames.
If pad_end
is True, window positions that are past the end of the axis
dimension are padded with pad_value
until the window moves fully past the
end of the dimension. Otherwise, only window positions that fully overlap the
axis
dimension are produced.
For example:
# A batch size 3 tensor of 9152 audio samples.
audio = tf.random.normal([3, 9152])
# Compute overlapping frames of length 512 with a step of 180 (frames overlap
# by 332 samples). By default, only 49 frames are generated since a frame
# with start position j*180 for j > 48 would overhang the end.
frames = tf.signal.frame(audio, 512, 180)
frames.shape.assert_is_compatible_with([3, 49, 512])
# When pad_end is enabled, the final two frames are kept (padded with zeros).
frames = tf.signal.frame(audio, 512, 180, pad_end=True)
frames.shape.assert_is_compatible_with([3, 51, 512])
If the dimension along axis
is N, and pad_end=False
, the number of frames
can be computed by:
num_frames = 1 + (N - frame_size) // frame_step
If pad_end=True
, the number of frames can be computed by:
num_frames = -(-N // frame_step) # ceiling division
Returns | |
---|---|
A Tensor of frames with shape [..., num_frames, frame_length, ...] .
|
Raises | |
---|---|
ValueError
|
If frame_length , frame_step , pad_value , or axis are not
scalar.
|