filterbanks method

List<List<double>> filterbanks (int samplerate int num_filt int n_fft)

Returns the mel filters

  1. Linearly splits the frequency interval using the mel scale.
  2. Generates triangular overlapping windows
  3. Generates filter coeficient for each window
  4. Returns num_filt filters of length n_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;
}