Index: /SigProc/trunk/SigProc/filters.cpp
===================================================================
--- /SigProc/trunk/SigProc/filters.cpp	(revision 3805)
+++ /SigProc/trunk/SigProc/filters.cpp	(revision 4146)
@@ -103,5 +103,5 @@
         std::cerr << "ERROR: SigProc::DesignRRCFilter: m must be greater than 0"
                   << std::endl;
-        return;
+        throw 0;
     } else if ( (beta < 0.0f) || (beta > 1.0f) ) {
         std::cerr << "ERROR: SigProc::DesignRRCFilter: beta must be in [0,1]"
@@ -118,6 +118,5 @@
 
     // Calculate filter coefficients
-    for (n=0; n<h_len; n++)
-    {
+    for (n=0; n<h_len; n++) {
 
         z = float(n)/float(k)-float(m);
@@ -126,11 +125,8 @@
 
         // Check for special condition where z equals zero
-        if ( n == k*m )
-        {
+        if ( n == k*m ) {
             t4 = 4*beta/(pi*sqrtf(T)*(1-(16*beta*beta*z*z)));
             h[n] = t4*( 1 + (1-beta)*pi/(4*beta) );
-        }
-        else
-        {
+        } else {
             t3 = 1/((4*beta*z));
 
@@ -139,6 +135,5 @@
 
             // Check for special condition where 16*beta^2*z^2 equals 1
-            if ( g < 1e-3 )
-            {
+            if ( g < 1e-3 ) {
                 float g1, g2, g3, g4;
                 g1 = -(1+beta)*pi*sin((1+beta)*pi/(4*beta));
@@ -148,12 +143,9 @@
 
                 h[n] = (g1+g2+g3)/g4;
-            }
-            else
-            {
+            } else {
                 t4 = 4*beta/(pi*sqrtf(T)*(1-(16*beta*beta*z*z)));
                 h[n] = t4*( t1 + (t2*t3) );
             }
         }
-
     }
 }
@@ -161,9 +153,54 @@
 //-----------------------------------------------------------------------------
 //
+// Design Gaussian filter
+//
+//-----------------------------------------------------------------------------
+void SigProc::DesignGaussianFilter(
+  unsigned int k,      // samples per symbol
+  unsigned int m,      // delay
+  float beta,          // rolloff factor ( 0 < beta <= 1 )
+  float *& h,          // pointer to filter coefficients
+  unsigned int & h_len // length of filter (len = 2*m*k+1)
+) {
+    h_len = 0;
+
+    if ( k < 1 ) {
+        std::cerr << "ERROR: SigProc::DesignGaussianFilter: k must be greater than 0"
+                  << std::endl;
+        throw 0;
+    } else if ( m < 1 ) {
+        std::cerr << "ERROR: SigProc::DesignGaussianFilter: m must be greater than 0"
+                  << std::endl;
+        throw 0;
+    } else if ( beta < 0.0f) {
+        std::cerr << "ERROR: SigProc::DesignGaussianFilter: beta must be greater than 0"
+                  << std::endl;
+        throw 0;
+    } else;
+
+    h_len = 2*k*m + 1;
+    h = new float[h_len];
+    float sigma(beta);
+    float g( 2*sigma*sigma );
+    float z;
+
+    for (unsigned int n=0; n<h_len; n++) {
+        // Check for special condition where z equals zero
+        if ( n == k*m ) {
+            h[n] = 1.0f;
+        } else {
+            z = float(n)/float(k)-float(m);
+            h[n] = expf(-z*z/g);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+//
 // FIR polyphase filter bank
 //
 //-----------------------------------------------------------------------------
 
-/// Initializing constructor
+// Initializing constructor
 SigProc::FIRPolyphaseFilterBank::FIRPolyphaseFilterBank(
         char * _type,       // type of filter
@@ -212,5 +249,5 @@
 }
 
-/// Initializing constructor
+// Initializing constructor
 SigProc::FIRPolyphaseFilterBank::FIRPolyphaseFilterBank(
         float * _H,         // filter bank coefficients
@@ -235,5 +272,5 @@
 }
 
-/// destructor
+// destructor
 SigProc::FIRPolyphaseFilterBank::~FIRPolyphaseFilterBank()
 {
@@ -244,5 +281,5 @@
 }
 
-/// push input value into buffer
+// push input value into buffer
 void SigProc::FIRPolyphaseFilterBank::PushInput(short _x)
 {
@@ -251,5 +288,5 @@
 }
 
-/// compute filter output from current buffer state using specific filter
+// compute filter output from current buffer state using specific filter
 void SigProc::FIRPolyphaseFilterBank::ComputeOutput(
         short &y,           // output sample
@@ -290,5 +327,5 @@
 }
 
-/// Reset filter buffer
+// Reset filter buffer
 void SigProc::FIRPolyphaseFilterBank::ResetBuffer()
 {
@@ -300,5 +337,5 @@
 }
 
-/// Print filter buffer
+// Print filter buffer
 void SigProc::FIRPolyphaseFilterBank::PrintBuffer()
 {
@@ -306,5 +343,5 @@
 }
 
-/// Print filter bank coefficients to the screen
+// Print filter bank coefficients to the screen
 void SigProc::FIRPolyphaseFilterBank::PrintFilterBankCoefficients()
 {
@@ -332,5 +369,5 @@
 }
 
-///
+//
 void SigProc::FIRPolyphaseFilterBank::TransposeCoefficientMatrix()
 {
@@ -353,5 +390,5 @@
 
 
-/// Calculate root raised-cosine coefficients
+// Calculate root raised-cosine coefficients
 void SigProc::FIRPolyphaseFilterBank::CalculateRRCFilterCoefficients()
 {
@@ -372,5 +409,5 @@
 }
 
-///
+//
 void SigProc::FIRPolyphaseFilterBank::CalculateGaussianFilterCoefficients()
 {
Index: /SigProc/trunk/SigProc/SigProc.h
===================================================================
--- /SigProc/trunk/SigProc/SigProc.h	(revision 4020)
+++ /SigProc/trunk/SigProc/SigProc.h	(revision 4146)
@@ -50,4 +50,17 @@
 //-----------------------------------------------------------------------------
 //
+// Design Gaussian filter
+//
+//-----------------------------------------------------------------------------
+void DesignGaussianFilter(
+  unsigned int k,      // samples per symbol
+  unsigned int m,      // delay
+  float beta,          // rolloff factor ( 0 < beta <= 1 )
+  float *& h,          // pointer to filter coefficients
+  unsigned int & h_len // length of filter (len = 2*m*k+1)
+);
+
+//-----------------------------------------------------------------------------
+//
 // Circular buffer
 //
@@ -61,8 +74,18 @@
  *
  * \section CB_creating Creating Buffers
- * There are two ways to create a buffer
- *   - generate an empty buffer
- *   - wrap an existing array
- *   - copy from another CircularBuffer
+ * There are three ways to create a buffer...
+ * \code
+ * // 1. generate an empty buffer
+ * CircularBuffer <short> v1(100);
+ *
+ * // 2. wrap an existing array
+ * short * x = new short[100];
+ * for (unsigned int i=0; i<100; i++)
+ *     x[i] = i;
+ * CircularBuffer <short> v2(x, 100);
+ *
+ * // 3. copy from another CircularBuffer
+ * CircularBuffer <short> v3(v2);
+ * \endcode
  *
  * \section CB_resizing_buffers Resizing Buffers
@@ -117,10 +140,8 @@
 
         // Check to see if buffer is full
-        if ( numElements < bufferSize ) {
-            numElements++;
-        } else {
-            // overflow
-            i_read++;
-        }
+        if ( numElements < bufferSize )
+            numElements++;  // buffer not yet full
+        else
+            i_read++;       // overflow
     }
 
