private Matrix getMelFilterBanks()
  {
    //get boundaries of the different filters
    double[] boundaries = getMelFilterBankBoundaries(minFreq, maxFreq, numberFilters);

    //ignore filters outside of spectrum
    for(int i = 1; i < boundaries.length-1; i++)
    {
      if(boundaries[i] > sampleRate/2 )
      {
        numberFilters = i-1;
        break;
      }
    }

    //create the filter bank matrix
    double[][] matrix = new double[numberFilters][];

    //fill each row of the filter bank matrix with one triangular mel filter
    for(int i = 1; i <= numberFilters; i++)
    {
      double[] filter = new double[(windowSize/2)+1];

      //for each frequency of the fft
      for(int j = 0; j < filter.length; j++)
      {
        //compute the filter weight of the current triangular mel filter
        double freq = baseFreq * j;
        filter[j] = getMelFilterWeight(i, freq, boundaries);
      }

      //add the computed mel filter to the filter bank
      matrix[i-1] = filter;
    }

    //return the filter bank
    return new Matrix(matrix, numberFilters, (windowSize/2)+1);
  }