| """ |
| =============================================================================== |
| features/padding.py — Fixed-Size Spectrogram Padding / Trimming |
| =============================================================================== |
| |
| """ |
|
|
| import numpy as np |
|
|
| |
| |
| DEFAULT_FIXED_FRAMES = 281 |
|
|
| |
| PAD_MODE = "constant" |
|
|
| |
| |
| |
| USE_MIN_VALUE = True |
| CONSTANT_PAD_VALUE = 0.0 |
|
|
|
|
| def pad_or_trim_spectrogram(mel_spec, target_length=None): |
| """ |
| Pad or trim a mel spectrogram to a fixed number of time frames. |
| |
| Notes |
| ----- |
| - Zero-padding doesn't add energy — padded regions are "silence" in the |
| spectrogram and the CNN will learn to ignore them. |
| - Trimming from the right assumes the important machine sound is at the |
| beginning. After silence removal, this is guaranteed. |
| |
| """ |
| if target_length is None: |
| target_length = DEFAULT_FIXED_FRAMES |
|
|
| n_mels, current_length = mel_spec.shape |
|
|
| if current_length < target_length: |
| |
| pad_width = target_length - current_length |
| |
| if PAD_MODE == "constant": |
| |
| |
| pad_val = mel_spec.min() if USE_MIN_VALUE else CONSTANT_PAD_VALUE |
| |
| |
| mel_spec = np.pad( |
| mel_spec, |
| pad_width=((0, 0), (0, pad_width)), |
| mode="constant", |
| constant_values=pad_val |
| ) |
| else: |
| |
| |
| |
| |
| |
| mel_spec = np.pad( |
| mel_spec, |
| pad_width=((0, 0), (0, pad_width)), |
| mode=PAD_MODE |
| ) |
| |
| elif current_length > target_length: |
| |
| mel_spec = mel_spec[:, :target_length] |
|
|
| return mel_spec |
|
|