def METHOD_NAME(
    *,
    f_min: Union[int, float],
    f_max: Union[int, float],
    sampling_rate: Union[int, float],
    fft_size: int,
    nr_of_filters: int,
) -> numpy.ndarray:
    """
    Returns the filter matrix which yields the mel filter bank features, when applied to the spectrum as
    matmul(freqDom, filterMatrix), where freqDom has dimension (time, frequency)
    and filterMatrix is the matrix returned
    by this function.
    The filter matrix is computed according to equation 6.141 in
    [Huang & Acero+, 2001] "Spoken Language Processing - A Guide to Theroy, Algorithm, and System Development"
    :param float|int f_min: minimum frequency
    :param float|int f_max: maximum frequency
    :param float sampling_rate: sampling rate of audio signal
    :param int fft_size: dimension of discrete fourier transformation
    :param int nr_of_filters: number of mel frequency filter banks to be created
    :return: shape=(fft_size // 2 + 1, nr_of_filters), matrix yielding the mel frequency cepstral coefficients
    """
    def mel_scale(freq):
        """
        returns the respective value on the mel scale
        :param float freq: frequency value to transform onto mel scale
        :rtype: float
        """
        return 1125.0 * numpy.log(1 + float(freq) / 700)
    def inv_mel_scale(mel_val):
        """
        returns the respective value in the frequency domain
        :param float mel_val: value in mel domain
        :rtype: float
        """
        return 700.0 * (numpy.exp(float(mel_val) / 1125) - 1)
    # noinspection PyShadowingNames
    def filter_center(filter_id, f_min, f_max, sampling_rate, fft_size, nr_of_filters):
        """
        :param int filter_id: filter to compute the center frequency for
        :param float|int f_min: minimum frequency
        :param float|int f_max: maximum frequency
        :param float|int sampling_rate: sampling rate of audio signal
        :param int fft_size: dimension of discrete fourier transformation
        :param int nr_of_filters: number of mel frequency filter banks to be created
        :rtype: float
        :return: center frequency of filter
        """
        return (float(fft_size) / sampling_rate) * inv_mel_scale(
            mel_scale(f_min) + filter_id * ((mel_scale(f_max) - mel_scale(f_min)) / (nr_of_filters + 1))
        )
    filt_cent = numpy.zeros(shape=(nr_of_filters + 2,), dtype=numpy.float32)
    for i1 in range(nr_of_filters + 2):
        filt_cent[i1] = filter_center(i1, f_min, f_max, sampling_rate, fft_size, nr_of_filters)
    f_mat = numpy.zeros(shape=(fft_size // 2 + 1, nr_of_filters))
    for i1 in range(f_mat.shape[0]):
        for i2 in range(1, nr_of_filters + 1):
            if (i1 > filt_cent[i2 - 1]) and (i1 < filt_cent[i2 + 1]):
                if i1 < filt_cent[i2]:
                    num = i1 - filt_cent[i2 - 1]
                    denom = filt_cent[i2] - filt_cent[i2 - 1]
                else:
                    num = filt_cent[i2 + 1] - i1
                    denom = filt_cent[i2 + 1] - filt_cent[i2]
                el_val = num / denom
            else:
                el_val = 0
            f_mat[i1, i2 - 1] = el_val
    return f_mat