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

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

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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{