Changeset 4146

Show
Ignore:
Timestamp:
06/11/07 15:18:50 (6 years ago)
Author:
jgaeddert
Message:

Cleaning up documentation, adding Gaussian filter design (needs testing)

Location:
SigProc/trunk/SigProc
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • SigProc/trunk/SigProc/SigProc.h

    r4020 r4146  
    5050//----------------------------------------------------------------------------- 
    5151// 
     52// Design Gaussian filter 
     53// 
     54//----------------------------------------------------------------------------- 
     55void DesignGaussianFilter( 
     56  unsigned int k,      // samples per symbol 
     57  unsigned int m,      // delay 
     58  float beta,          // rolloff factor ( 0 < beta <= 1 ) 
     59  float *& h,          // pointer to filter coefficients 
     60  unsigned int & h_len // length of filter (len = 2*m*k+1) 
     61); 
     62 
     63//----------------------------------------------------------------------------- 
     64// 
    5265// Circular buffer 
    5366// 
     
    6174 * 
    6275 * \section CB_creating Creating Buffers 
    63  * There are two ways to create a buffer 
    64  *   - generate an empty buffer 
    65  *   - wrap an existing array 
    66  *   - copy from another CircularBuffer 
     76 * There are three ways to create a buffer... 
     77 * \code 
     78 * // 1. generate an empty buffer 
     79 * CircularBuffer <short> v1(100); 
     80 * 
     81 * // 2. wrap an existing array 
     82 * short * x = new short[100]; 
     83 * for (unsigned int i=0; i<100; i++) 
     84 *     x[i] = i; 
     85 * CircularBuffer <short> v2(x, 100); 
     86 * 
     87 * // 3. copy from another CircularBuffer 
     88 * CircularBuffer <short> v3(v2); 
     89 * \endcode 
    6790 * 
    6891 * \section CB_resizing_buffers Resizing Buffers 
     
    117140 
    118141        // Check to see if buffer is full 
    119         if ( numElements < bufferSize ) { 
    120             numElements++; 
    121         } else { 
    122             // overflow 
    123             i_read++; 
    124         } 
     142        if ( numElements < bufferSize ) 
     143            numElements++;  // buffer not yet full 
     144        else 
     145            i_read++;       // overflow 
    125146    } 
    126147 
  • SigProc/trunk/SigProc/filters.cpp

    r3805 r4146  
    103103        std::cerr << "ERROR: SigProc::DesignRRCFilter: m must be greater than 0" 
    104104                  << std::endl; 
    105         return; 
     105        throw 0; 
    106106    } else if ( (beta < 0.0f) || (beta > 1.0f) ) { 
    107107        std::cerr << "ERROR: SigProc::DesignRRCFilter: beta must be in [0,1]" 
     
    118118 
    119119    // Calculate filter coefficients 
    120     for (n=0; n<h_len; n++) 
    121     { 
     120    for (n=0; n<h_len; n++) { 
    122121 
    123122        z = float(n)/float(k)-float(m); 
     
    126125 
    127126        // Check for special condition where z equals zero 
    128         if ( n == k*m ) 
    129         { 
     127        if ( n == k*m ) { 
    130128            t4 = 4*beta/(pi*sqrtf(T)*(1-(16*beta*beta*z*z))); 
    131129            h[n] = t4*( 1 + (1-beta)*pi/(4*beta) ); 
    132         } 
    133         else 
    134         { 
     130        } else { 
    135131            t3 = 1/((4*beta*z)); 
    136132 
     
    139135 
    140136            // Check for special condition where 16*beta^2*z^2 equals 1 
    141             if ( g < 1e-3 ) 
    142             { 
     137            if ( g < 1e-3 ) { 
    143138                float g1, g2, g3, g4; 
    144139                g1 = -(1+beta)*pi*sin((1+beta)*pi/(4*beta)); 
     
    148143 
    149144                h[n] = (g1+g2+g3)/g4; 
    150             } 
    151             else 
    152             { 
     145            } else { 
    153146                t4 = 4*beta/(pi*sqrtf(T)*(1-(16*beta*beta*z*z))); 
    154147                h[n] = t4*( t1 + (t2*t3) ); 
    155148            } 
    156149        } 
    157  
    158150    } 
    159151} 
     
    161153//----------------------------------------------------------------------------- 
    162154// 
     155// Design Gaussian filter 
     156// 
     157//----------------------------------------------------------------------------- 
     158void SigProc::DesignGaussianFilter( 
     159  unsigned int k,      // samples per symbol 
     160  unsigned int m,      // delay 
     161  float beta,          // rolloff factor ( 0 < beta <= 1 ) 
     162  float *& h,          // pointer to filter coefficients 
     163  unsigned int & h_len // length of filter (len = 2*m*k+1) 
     164) { 
     165    h_len = 0; 
     166 
     167    if ( k < 1 ) { 
     168        std::cerr << "ERROR: SigProc::DesignGaussianFilter: k must be greater than 0" 
     169                  << std::endl; 
     170        throw 0; 
     171    } else if ( m < 1 ) { 
     172        std::cerr << "ERROR: SigProc::DesignGaussianFilter: m must be greater than 0" 
     173                  << std::endl; 
     174        throw 0; 
     175    } else if ( beta < 0.0f) { 
     176        std::cerr << "ERROR: SigProc::DesignGaussianFilter: beta must be greater than 0" 
     177                  << std::endl; 
     178        throw 0; 
     179    } else; 
     180 
     181    h_len = 2*k*m + 1; 
     182    h = new float[h_len]; 
     183    float sigma(beta); 
     184    float g( 2*sigma*sigma ); 
     185    float z; 
     186 
     187    for (unsigned int n=0; n<h_len; n++) { 
     188        // Check for special condition where z equals zero 
     189        if ( n == k*m ) { 
     190            h[n] = 1.0f; 
     191        } else { 
     192            z = float(n)/float(k)-float(m); 
     193            h[n] = expf(-z*z/g); 
     194        } 
     195    } 
     196} 
     197 
     198//----------------------------------------------------------------------------- 
     199// 
    163200// FIR polyphase filter bank 
    164201// 
    165202//----------------------------------------------------------------------------- 
    166203 
    167 /// Initializing constructor 
     204// Initializing constructor 
    168205SigProc::FIRPolyphaseFilterBank::FIRPolyphaseFilterBank( 
    169206        char * _type,       // type of filter 
     
    212249} 
    213250 
    214 /// Initializing constructor 
     251// Initializing constructor 
    215252SigProc::FIRPolyphaseFilterBank::FIRPolyphaseFilterBank( 
    216253        float * _H,         // filter bank coefficients 
     
    235272} 
    236273 
    237 /// destructor 
     274// destructor 
    238275SigProc::FIRPolyphaseFilterBank::~FIRPolyphaseFilterBank() 
    239276{ 
     
    244281} 
    245282 
    246 /// push input value into buffer 
     283// push input value into buffer 
    247284void SigProc::FIRPolyphaseFilterBank::PushInput(short _x) 
    248285{ 
     
    251288} 
    252289 
    253 /// compute filter output from current buffer state using specific filter 
     290// compute filter output from current buffer state using specific filter 
    254291void SigProc::FIRPolyphaseFilterBank::ComputeOutput( 
    255292        short &y,           // output sample 
     
    290327} 
    291328 
    292 /// Reset filter buffer 
     329// Reset filter buffer 
    293330void SigProc::FIRPolyphaseFilterBank::ResetBuffer() 
    294331{ 
     
    300337} 
    301338 
    302 /// Print filter buffer 
     339// Print filter buffer 
    303340void SigProc::FIRPolyphaseFilterBank::PrintBuffer() 
    304341{ 
     
    306343} 
    307344 
    308 /// Print filter bank coefficients to the screen 
     345// Print filter bank coefficients to the screen 
    309346void SigProc::FIRPolyphaseFilterBank::PrintFilterBankCoefficients() 
    310347{ 
     
    332369} 
    333370 
    334 /// 
     371// 
    335372void SigProc::FIRPolyphaseFilterBank::TransposeCoefficientMatrix() 
    336373{ 
     
    353390 
    354391 
    355 /// Calculate root raised-cosine coefficients 
     392// Calculate root raised-cosine coefficients 
    356393void SigProc::FIRPolyphaseFilterBank::CalculateRRCFilterCoefficients() 
    357394{ 
     
    372409} 
    373410 
    374 /// 
     411// 
    375412void SigProc::FIRPolyphaseFilterBank::CalculateGaussianFilterCoefficients() 
    376413{