Index: src/spectral/filterbank_mel.c
===================================================================
--- src/spectral/filterbank_mel.c	(revision addc9ec3911bfdfdf3231242082406aa9f0e592b)
+++ src/spectral/filterbank_mel.c	(revision b50760734e6e06bb594067fd696f9e1a544b6e18)
@@ -27,5 +27,5 @@
 
 void
-aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, uint_t samplerate,
+aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, smpl_t samplerate,
     smpl_t freq_min, smpl_t freq_max)
 {
@@ -42,4 +42,9 @@
   uint_t logFilters = 27;
   uint_t allFilters = linearFilters + logFilters;
+
+  if (allFilters > n_filters) {
+    AUBIO_WRN("not enough Mel filters, got %d but %d needed\n",
+        n_filters, allFilters);
+  }
 
   //buffers for computing filter frequencies
@@ -65,5 +70,5 @@
   for (filter_cnt = 0; filter_cnt < logFilters + 2; filter_cnt++) {
     freqs->data[0][filter_cnt + linearFilters] =
-        lastlinearCF * (pow (logSpacing, filter_cnt + 1));
+        lastlinearCF * (POW(logSpacing, filter_cnt + 1));
   }
 
@@ -84,11 +89,4 @@
   }
 
-  //AUBIO_DBG("filter tables frequencies\n");
-  //for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++)
-  //  AUBIO_DBG("filter n. %d %f %f %f %f\n",
-  //    filter_cnt, lower_freqs->data[0][filter_cnt], 
-  //    center_freqs->data[0][filter_cnt], upper_freqs->data[0][filter_cnt], 
-  //    triangle_heights->data[0][filter_cnt]);
-
   //filling the fft_freqs lookup table, which assigns the frequency in hz to each bin
   for (bin_cnt = 0; bin_cnt < win_s; bin_cnt++) {
@@ -96,16 +94,13 @@
   }
 
-  //building each filter table
-  for (filter_cnt = 0; filter_cnt < allFilters; filter_cnt++) {
 
-    //TODO:check special case : lower freq =0
-    //calculating rise increment in mag/Hz
-    smpl_t riseInc =
-        triangle_heights->data[0][filter_cnt] /
-        (center_freqs->data[0][filter_cnt] - lower_freqs->data[0][filter_cnt]);
+  /* zeroing begining of filter */
+  fvec_zeros(filters);
 
-    //zeroing begining of filter
+  /* building each filter table */
+  for (filter_cnt = 0; filter_cnt < n_filters; filter_cnt++) {
+
+    /* skip first elements */
     for (bin_cnt = 0; bin_cnt < win_s - 1; bin_cnt++) {
-      filters->data[filter_cnt][bin_cnt] = 0.0;
       if (fft_freqs->data[0][bin_cnt] <= lower_freqs->data[0][filter_cnt] &&
           fft_freqs->data[0][bin_cnt + 1] > lower_freqs->data[0][filter_cnt]) {
@@ -115,37 +110,35 @@
     bin_cnt++;
 
-    //positive slope
+    /* compute positive slope step size */
+    smpl_t riseInc =
+        triangle_heights->data[0][filter_cnt] /
+        (center_freqs->data[0][filter_cnt] - lower_freqs->data[0][filter_cnt]);
+
+    /* compute coefficients in positive slope */
     for (; bin_cnt < win_s - 1; bin_cnt++) {
       filters->data[filter_cnt][bin_cnt] =
           (fft_freqs->data[0][bin_cnt] -
           lower_freqs->data[0][filter_cnt]) * riseInc;
-      //if(fft_freqs->data[0][bin_cnt]<= center_freqs->data[0][filter_cnt] && fft_freqs->data[0][bin_cnt+1]> center_freqs->data[0][filter_cnt])
+      
       if (fft_freqs->data[0][bin_cnt + 1] > center_freqs->data[0][filter_cnt])
         break;
     }
-    //bin_cnt++;
+    bin_cnt++;
 
-    //negative slope
+    /* compute negative slope step size */
+    smpl_t downInc =
+        triangle_heights->data[0][filter_cnt] /
+        (upper_freqs->data[0][filter_cnt] - center_freqs->data[0][filter_cnt]);
+
+    /* compute coefficents in negative slope */
     for (; bin_cnt < win_s - 1; bin_cnt++) {
+      filters->data[filter_cnt][bin_cnt] += 
+          (upper_freqs->data[0][filter_cnt] -
+          fft_freqs->data[0][bin_cnt]) * downInc;
 
-      //checking whether last value is less than 0...
-      smpl_t val =
-          triangle_heights->data[0][filter_cnt] - (fft_freqs->data[0][bin_cnt] -
-          center_freqs->data[0][filter_cnt]) * riseInc;
-      if (val >= 0)
-        filters->data[filter_cnt][bin_cnt] = val;
-      else
-        filters->data[filter_cnt][bin_cnt] = 0.0;
-
-      //if(fft_freqs->data[0][bin_cnt]<= upper_freqs->data[0][bin_cnt] && fft_freqs->data[0][bin_cnt+1]> upper_freqs->data[0][filter_cnt])
-      //TODO: CHECK whether bugfix correct
       if (fft_freqs->data[0][bin_cnt + 1] > upper_freqs->data[0][filter_cnt])
         break;
     }
-    //bin_cnt++;
-
-    //zeroing tail
-    for (; bin_cnt < win_s; bin_cnt++)
-      filters->data[filter_cnt][bin_cnt] = 0.f;
+    /* nothing else to do */
 
   }
Index: src/spectral/filterbank_mel.h
===================================================================
--- src/spectral/filterbank_mel.h	(revision addc9ec3911bfdfdf3231242082406aa9f0e592b)
+++ src/spectral/filterbank_mel.h	(revision b50760734e6e06bb594067fd696f9e1a544b6e18)
@@ -46,5 +46,5 @@
   \param n_filters number of filters
   \param win_s window size
-  \param samplerate
+  \param samplerate audio sampling rate
   \param freq_min lowest filter frequency
   \param freq_max highest filter frequency
@@ -52,5 +52,5 @@
 */
 void aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb,
-    uint_t samplerate, smpl_t freq_min, smpl_t freq_max);
+    smpl_t samplerate, smpl_t freq_min, smpl_t freq_max);
 
 #ifdef __cplusplus
