diff --git a/RTCP/CNProc/src/FIR.cc b/RTCP/CNProc/src/FIR.cc
index 10dee321134ea802312e4828a41ed1b7b229147f..ea1aec01b3f0990985433bcc024f8d1469741c5c 100644
--- a/RTCP/CNProc/src/FIR.cc
+++ b/RTCP/CNProc/src/FIR.cc
@@ -1085,8 +1085,14 @@ fcomplex FIR::processNextSample(fcomplex sample, unsigned channel)
 #endif
 
 
+// hamming window function
 void FIR::hamming(unsigned n, double* d)
 {
+  if(n == 1) {
+    d[0] = 1.0;
+    return;
+  }
+
   unsigned m = n-1;
 
   for(unsigned i=0; i<n; i++) {
@@ -1094,6 +1100,31 @@ void FIR::hamming(unsigned n, double* d)
   }
 }
 
+// blackman window function
+void FIR::blackman(unsigned n, double* d)
+{
+  if(n == 1) {
+    d[0] = 1.0;
+    return;
+  }
+
+  unsigned m = n-1;
+
+  for(unsigned i=0; i<n; i++) {
+    double k = i / m;
+    d[i] = 0.42 - 0.5 * cos (2.0 * M_PI * k) + 0.08 * cos (4.0 * M_PI * k); 
+  }
+}
+
+// Guassian window function
+void FIR::gaussian(int n, double a, double* d)
+{
+  int index = 0;
+  for (int i=-(n-1); i<=n-1; i+=2) {
+    d[index++] = exp( -0.5 * pow(( a/n * i), 2) );
+  }
+}
+
 
 unsigned FIR::next_power_of_2(unsigned n)
 {
@@ -1278,11 +1309,17 @@ void FIR::generate_filter(unsigned taps, unsigned channels)
     THROW(CNProcException, "cannot allocate buffer");
   }
 
-  // use a n-point hamming window
-  hamming(n, d);
+  // use a n-point Hamming window
+//  hamming(n, d);
+
+  // use a n-point Blackman window
+//  blackman(n, d);
+
+  // use a n-point Gaussian window
+  gaussian(n, 3.5, d);
 /*
   for(int i=0; i<n; i++) {
-    std::cout << "hamming[" << i << "] = " << d[i] << std::endl;
+    std::cout << "windowFunction[" << i << "] = " << d[i] << std::endl;
   }
 */
   double* result = (double*) malloc(n * sizeof(double));
@@ -1319,7 +1356,9 @@ void FIR::generate_filter(unsigned taps, unsigned channels)
 */
   free(result);
 }
-#else
+
+#else // USE_ORIGINAL_FILTER
+
 // This method initializes the weights array.
 void FIR::generate_filter(unsigned taps, unsigned channels)
 {
@@ -1329,6 +1368,7 @@ void FIR::generate_filter(unsigned taps, unsigned channels)
   weights.resize(boost::extents[channels][taps]);
   memcpy(weights.origin(), origWeights, (channels * taps) * sizeof(float));
 }
+
 #endif // USE_ORIGINAL_FILTER
 
 } // namespace RTCP
diff --git a/RTCP/CNProc/src/FIR.h b/RTCP/CNProc/src/FIR.h
index e261d12200fc632c6b7d784089175794fbc0e9db..d9caa36b85c47cd45c7098743c4143a45a27671c 100644
--- a/RTCP/CNProc/src/FIR.h
+++ b/RTCP/CNProc/src/FIR.h
@@ -32,7 +32,15 @@ class FIR {
 #endif
 
 private:
+  // Hamming window function
   static void hamming(unsigned n, double* d);
+
+  // Blackman window function
+  static void blackman(unsigned n, double* d);
+
+  // Gaussian window function
+  static void gaussian(int n, double a, double* d);
+
   static unsigned next_power_of_2(unsigned n);
   static void interpolate(double* x, double* y, unsigned xlen, unsigned n, double* result);
   static void generate_fir_filter(unsigned n, double w, double* window, double* result);