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. |
View source on GitHub