filterbanks method
Returns the mel filters
- Linearly splits the frequency interval using the mel scale.
- Generates triangular overlapping windows
- Generates filter coeficient for each window
- Returns
num_filt
filters of lengthn_fft
Implementation
static List<List<double>> filterbanks(int samplerate, int num_filt, int n_fft){
var interval = hertz_to_mel(samplerate.toDouble()) / (num_filt + 1);
var grid_mels = List<double>.generate(num_filt + 2, (v) => v * interval);
var grid_hertz = grid_mels.map((v) => mel_to_hertz(v)).toList();
var grid_indexes = grid_hertz.map((v) => (v * n_fft / samplerate).floor()).toList();
var filters = List<List<double>>(num_filt);
for (var i = 0; i < num_filt; i ++ ){
var left = List<double>.generate(grid_indexes[i + 1] - grid_indexes[i], (v) => v / (grid_indexes[i + 1] - grid_indexes[i]));
var right = List<double>.generate(grid_indexes[i + 2] - grid_indexes[i + 1], (v) => v / (grid_indexes[i + 2] - grid_indexes[i+1])).reversed.toList();
var filter = [List<double>.filled(grid_indexes[i], 0.0), left, [1.0], right.sublist(0,right.length - 1), List<double>.filled(n_fft - grid_indexes[i+2], 0.0)].expand((x) => x).toList();
filters[i] = filter;
}
return filters;
}