|
|
|
|
|
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() |
|
|