File size: 1,662 Bytes
5821056
 
86a51a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5821056
 
 
86a51a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import librosa
import numpy as np


class MelBandsNumpy(object):

    @staticmethod
    def get_mel_points(sample_rate: int, nfft: int, n_mels: int, fmin: float = 0, fmax: int = None):
        fmax = fmax or sample_rate // 2

        mel_points = librosa.mel_frequencies(n_mels=n_mels, fmin=fmin, fmax=fmax)
        return mel_points

    @staticmethod
    def get_mel_filter_bank(mel_points: np.ndarray,
                            sample_rate: int, nfft: int, n_mels: int, fmin: float = 0, fmax: int = None,
                            normalized: bool = True,
                            inverse: bool = False,
                            ):
        fmax = fmax or sample_rate // 2

        mel_points = librosa.mel_frequencies(n_mels=n_mels, fmin=fmin, fmax=fmax)

        bin_freqs = np.linspace(0, sample_rate // 2, nfft // 2 + 1)
        fft_bins = np.floor((nfft + 1) * mel_points / sample_rate).astype(int)

        filterbank = np.zeros((n_mels, nfft // 2 + 1))
        for i in range(1, n_mels + 1):
            left = fft_bins[i - 1]
            center = fft_bins[i]
            right = fft_bins[i + 1] if i < n_mels - 1 else center

            filterbank[i - 1, left:center] = np.linspace(0, 1, center - left)
            filterbank[i - 1, center:right] = np.linspace(1, 0, right - center)

        filterbank = librosa.util.normalize(filterbank, norm=1, axis=1)
        return filterbank


def main():
    mel_points = MelBandsNumpy.get_mel_points(
        sample_rate=8000,
        nfft=512,
        n_mels=80,
        fmin=10,
        fmax=3800
    )
    return


if __name__ == "__main__":
    main()