Changeset 4146
- Timestamp:
- 06/11/07 15:18:50 (6 years ago)
- Location:
- SigProc/trunk/SigProc
- Files:
-
- 2 modified
-
SigProc.h (modified) (3 diffs)
-
filters.cpp (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
SigProc/trunk/SigProc/SigProc.h
r4020 r4146 50 50 //----------------------------------------------------------------------------- 51 51 // 52 // Design Gaussian filter 53 // 54 //----------------------------------------------------------------------------- 55 void 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 // 52 65 // Circular buffer 53 66 // … … 61 74 * 62 75 * \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 67 90 * 68 91 * \section CB_resizing_buffers Resizing Buffers … … 117 140 118 141 // 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 125 146 } 126 147 -
SigProc/trunk/SigProc/filters.cpp
r3805 r4146 103 103 std::cerr << "ERROR: SigProc::DesignRRCFilter: m must be greater than 0" 104 104 << std::endl; 105 return;105 throw 0; 106 106 } else if ( (beta < 0.0f) || (beta > 1.0f) ) { 107 107 std::cerr << "ERROR: SigProc::DesignRRCFilter: beta must be in [0,1]" … … 118 118 119 119 // Calculate filter coefficients 120 for (n=0; n<h_len; n++) 121 { 120 for (n=0; n<h_len; n++) { 122 121 123 122 z = float(n)/float(k)-float(m); … … 126 125 127 126 // Check for special condition where z equals zero 128 if ( n == k*m ) 129 { 127 if ( n == k*m ) { 130 128 t4 = 4*beta/(pi*sqrtf(T)*(1-(16*beta*beta*z*z))); 131 129 h[n] = t4*( 1 + (1-beta)*pi/(4*beta) ); 132 } 133 else 134 { 130 } else { 135 131 t3 = 1/((4*beta*z)); 136 132 … … 139 135 140 136 // Check for special condition where 16*beta^2*z^2 equals 1 141 if ( g < 1e-3 ) 142 { 137 if ( g < 1e-3 ) { 143 138 float g1, g2, g3, g4; 144 139 g1 = -(1+beta)*pi*sin((1+beta)*pi/(4*beta)); … … 148 143 149 144 h[n] = (g1+g2+g3)/g4; 150 } 151 else 152 { 145 } else { 153 146 t4 = 4*beta/(pi*sqrtf(T)*(1-(16*beta*beta*z*z))); 154 147 h[n] = t4*( t1 + (t2*t3) ); 155 148 } 156 149 } 157 158 150 } 159 151 } … … 161 153 //----------------------------------------------------------------------------- 162 154 // 155 // Design Gaussian filter 156 // 157 //----------------------------------------------------------------------------- 158 void 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 // 163 200 // FIR polyphase filter bank 164 201 // 165 202 //----------------------------------------------------------------------------- 166 203 167 // /Initializing constructor204 // Initializing constructor 168 205 SigProc::FIRPolyphaseFilterBank::FIRPolyphaseFilterBank( 169 206 char * _type, // type of filter … … 212 249 } 213 250 214 // /Initializing constructor251 // Initializing constructor 215 252 SigProc::FIRPolyphaseFilterBank::FIRPolyphaseFilterBank( 216 253 float * _H, // filter bank coefficients … … 235 272 } 236 273 237 // /destructor274 // destructor 238 275 SigProc::FIRPolyphaseFilterBank::~FIRPolyphaseFilterBank() 239 276 { … … 244 281 } 245 282 246 // /push input value into buffer283 // push input value into buffer 247 284 void SigProc::FIRPolyphaseFilterBank::PushInput(short _x) 248 285 { … … 251 288 } 252 289 253 // /compute filter output from current buffer state using specific filter290 // compute filter output from current buffer state using specific filter 254 291 void SigProc::FIRPolyphaseFilterBank::ComputeOutput( 255 292 short &y, // output sample … … 290 327 } 291 328 292 // /Reset filter buffer329 // Reset filter buffer 293 330 void SigProc::FIRPolyphaseFilterBank::ResetBuffer() 294 331 { … … 300 337 } 301 338 302 // /Print filter buffer339 // Print filter buffer 303 340 void SigProc::FIRPolyphaseFilterBank::PrintBuffer() 304 341 { … … 306 343 } 307 344 308 // /Print filter bank coefficients to the screen345 // Print filter bank coefficients to the screen 309 346 void SigProc::FIRPolyphaseFilterBank::PrintFilterBankCoefficients() 310 347 { … … 332 369 } 333 370 334 // /371 // 335 372 void SigProc::FIRPolyphaseFilterBank::TransposeCoefficientMatrix() 336 373 { … … 353 390 354 391 355 // /Calculate root raised-cosine coefficients392 // Calculate root raised-cosine coefficients 356 393 void SigProc::FIRPolyphaseFilterBank::CalculateRRCFilterCoefficients() 357 394 { … … 372 409 } 373 410 374 // /411 // 375 412 void SigProc::FIRPolyphaseFilterBank::CalculateGaussianFilterCoefficients() 376 413 {