#!/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()