HoneyTian's picture
update
86a51a3
#!/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()