processing.py 1.03 KB
Newer Older
1
2
3
4
5
import torch
import torch.nn as nn


class NormalizeDB(nn.Module):
6
    r"""Normalize the spectrogram with a minimum db value"""
7

8
    def __init__(self, min_level_db, normalization):
9
10
        super().__init__()
        self.min_level_db = min_level_db
11
        self.normalization = normalization
12
13

    def forward(self, specgram):
14
        specgram = torch.log10(torch.clamp(specgram.squeeze(0), min=1e-5))
15
        if self.normalization:
16
            return torch.clamp((self.min_level_db - 20 * specgram) / self.min_level_db, min=0, max=1)
17
        return specgram
18
19


20
def normalized_waveform_to_bits(waveform: torch.Tensor, bits: int) -> torch.Tensor:
21
    r"""Transform waveform [-1, 1] to label [0, 2 ** bits - 1]"""
22
23
24
25
26
27

    assert abs(waveform).max() <= 1.0
    waveform = (waveform + 1.0) * (2 ** bits - 1) / 2
    return torch.clamp(waveform, 0, 2 ** bits - 1).int()


28
def bits_to_normalized_waveform(label: torch.Tensor, bits: int) -> torch.Tensor:
29
    r"""Transform label [0, 2 ** bits - 1] to waveform [-1, 1]"""
30
31

    return 2 * label / (2 ** bits - 1.0) - 1.0