diff options
Diffstat (limited to 'power_sequencer/operators/audiosync/mfcc/trfbank.py')
-rw-r--r-- | power_sequencer/operators/audiosync/mfcc/trfbank.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/power_sequencer/operators/audiosync/mfcc/trfbank.py b/power_sequencer/operators/audiosync/mfcc/trfbank.py new file mode 100644 index 00000000..00558944 --- /dev/null +++ b/power_sequencer/operators/audiosync/mfcc/trfbank.py @@ -0,0 +1,51 @@ +# +# Copyright (C) 2016-2019 by Nathan Lovato, Daniel Oakey, Razvan Radulescu, and contributors +# +# This file is part of Power Sequencer. +# +# Power Sequencer is free software: you can redistribute it and/or modify it under the terms of the +# GNU General Public License as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# Power Sequencer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with Power Sequencer. If +# not, see <https://www.gnu.org/licenses/>. +# +import numpy as np + + +def trfbank(fs, nfft, lowfreq, linsc, logsc, nlinfilt, nlogfilt): + """Compute triangular filterbank for MFCC computation.""" + # Total number of filters + nfilt = nlinfilt + nlogfilt + + # ------------------------ + # Compute the filter bank + # ------------------------ + # Compute start/middle/end points of the triangular filters in spectral + # domain + freqs = np.zeros(nfilt + 2) + freqs[:nlinfilt] = lowfreq + np.arange(nlinfilt) * linsc + freqs[nlinfilt:] = freqs[nlinfilt - 1] * logsc ** np.arange(1, nlogfilt + 3) + heights = 2.0 / (freqs[2:] - freqs[0:-2]) + + # Compute filterbank coeff (in fft domain, in bins) + fbank = np.zeros((nfilt, nfft)) + # FFT bins (in Hz) + nfreqs = np.arange(nfft) / (1.0 * nfft) * fs + for i in range(nfilt): + low = freqs[i] + cen = freqs[i + 1] + hi = freqs[i + 2] + + lid = np.arange(np.floor(low * nfft / fs) + 1, np.floor(cen * nfft / fs) + 1, dtype=np.int) + lslope = heights[i] / (cen - low) + rid = np.arange(np.floor(cen * nfft / fs) + 1, np.floor(hi * nfft / fs) + 1, dtype=np.int) + rslope = heights[i] / (hi - cen) + fbank[i][lid] = lslope * (nfreqs[lid] - low) + fbank[i][rid] = rslope * (hi - nfreqs[rid]) + + return fbank, freqs |