diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/post/audio/dsp.h | 16 | ||||
-rw-r--r-- | src/post/audio/filter.c | 395 | ||||
-rw-r--r-- | src/post/audio/filter.h | 52 | ||||
-rw-r--r-- | src/post/audio/upmix.c | 6 | ||||
-rw-r--r-- | src/post/audio/window.c | 208 | ||||
-rw-r--r-- | src/post/audio/window.h | 26 |
6 files changed, 351 insertions, 352 deletions
diff --git a/src/post/audio/dsp.h b/src/post/audio/dsp.h index 8f5d5eb51..237640283 100644 --- a/src/post/audio/dsp.h +++ b/src/post/audio/dsp.h @@ -1,12 +1,12 @@ /*============================================================================= -// -// This software has been released under the terms of the GNU Public -// license. See http://www.gnu.org/copyleft/gpl.html for details. -// -// Copyright 2002 Anders Johansson ajh@atri.curtin.edu.au -// -//============================================================================= -*/ + * + * This software has been released under the terms of the GNU Public + * license. See http://www.gnu.org/copyleft/gpl.html for details. + * + * Copyright 2002 Anders Johansson ajh@atri.curtin.edu.au + * + *============================================================================= + */ #ifndef _DSP_H #define _DSP_H 1 diff --git a/src/post/audio/filter.c b/src/post/audio/filter.c index 10f1c975d..cb0363633 100644 --- a/src/post/audio/filter.c +++ b/src/post/audio/filter.c @@ -1,33 +1,32 @@ /*============================================================================= -// -// This software has been released under the terms of the GNU Public -// license. See http://www.gnu.org/copyleft/gpl.html for details. -// -// Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au -// -//============================================================================= -*/ + * + * This software has been released under the terms of the GNU Public + * license. See http://www.gnu.org/copyleft/gpl.html for details. + * + * Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au + * + *============================================================================= + */ -/* Design and implementation of different types of digital filters +/* Design and implementation of different types of digital filters */ -*/ #include <string.h> #include <math.h> #include "dsp.h" /****************************************************************************** -* FIR filter implementations -******************************************************************************/ + * FIR filter implementations + ******************************************************************************/ /* C implementation of FIR filter y=w*x - - n number of filter taps, where mod(n,4)==0 - w filter taps - x input signal must be a circular buffer which is indexed backwards -*/ + * + * n number of filter taps, where mod(n,4)==0 + * w filter taps + * x input signal must be a circular buffer which is indexed backwards + */ inline _ftype_t fir(register unsigned int n, _ftype_t* w, _ftype_t* x) { - register _ftype_t y; // Output + register _ftype_t y; /* Output */ y = 0.0; do{ n--; @@ -37,15 +36,15 @@ inline _ftype_t fir(register unsigned int n, _ftype_t* w, _ftype_t* x) } /* C implementation of parallel FIR filter y(k)=w(k) * x(k) (where * denotes convolution) - - n number of filter taps, where mod(n,4)==0 - d number of filters - xi current index in xq - w filter taps k by n big - x input signal must be a circular buffers which are indexed backwards - y output buffer - s output buffer stride -*/ + * + * n number of filter taps, where mod(n,4)==0 + * d number of filters + * xi current index in xq + * w filter taps k by n big + * x input signal must be a circular buffers which are indexed backwards + * y output buffer + * s output buffer stride + */ inline _ftype_t* pfir(unsigned int n, unsigned int d, unsigned int xi, _ftype_t** w, _ftype_t** x, _ftype_t* y, unsigned int s) { register _ftype_t* xt = *x + xi; @@ -97,21 +96,21 @@ inline int updatepq(unsigned int n, unsigned int d, unsigned int xi, _ftype_t** */ int design_fir(unsigned int n, _ftype_t* w, _ftype_t* fc, unsigned int flags, _ftype_t opt) { - unsigned int o = n & 1; // Indicator for odd filter length - unsigned int end = ((n + 1) >> 1) - o; // Loop end - unsigned int i; // Loop index - - _ftype_t k1 = 2 * M_PI; // 2*pi*fc1 - _ftype_t k2 = 0.5 * (_ftype_t)(1 - o);// Constant used if the filter has even length - _ftype_t k3; // 2*pi*fc2 Constant used in BP and BS design - _ftype_t g = 0.0; // Gain - _ftype_t t1,t2,t3; // Temporary variables - _ftype_t fc1,fc2; // Cutoff frequencies - - // Sanity check + unsigned int o = n & 1; /* Indicator for odd filter length */ + unsigned int end = ((n + 1) >> 1) - o; /* Loop end */ + unsigned int i; /* Loop index */ + + _ftype_t k1 = 2 * M_PI; /* 2*pi*fc1 */ + _ftype_t k2 = 0.5 * (_ftype_t)(1 - o);/* Constant used if the filter has even length */ + _ftype_t k3; /* 2*pi*fc2 Constant used in BP and BS design */ + _ftype_t g = 0.0; /* Gain */ + _ftype_t t1,t2,t3; /* Temporary variables */ + _ftype_t fc1,fc2; /* Cutoff frequencies */ + + /* Sanity check */ if(!w || (n == 0)) return -1; - // Get window coefficients + /* Get window coefficients */ switch(flags & WINDOW_MASK){ case(BOXCAR): boxcar(n,w); break; @@ -133,39 +132,41 @@ int design_fir(unsigned int n, _ftype_t* w, _ftype_t* fc, unsigned int flags, _f if(flags & (LP | HP)){ fc1=*fc; - // Cutoff frequency must be < 0.5 where 0.5 <=> Fs/2 + /* Cutoff frequency must be < 0.5 where 0.5 <=> Fs/2 */ fc1 = ((fc1 <= 1.0) && (fc1 > 0.0)) ? fc1/2 : 0.25; k1 *= fc1; - if(flags & LP){ // Low pass filter + if(flags & LP){ /* Low pass filter */ - // If the filter length is odd, there is one point which is exactly - // in the middle. The value at this point is 2*fCutoff*sin(x)/x, - // where x is zero. To make sure nothing strange happens, we set this - // value separately. + /* + * If the filter length is odd, there is one point which is exactly + * in the middle. The value at this point is 2*fCutoff*sin(x)/x, + * where x is zero. To make sure nothing strange happens, we set this + * value separately. + */ if (o){ w[end] = fc1 * w[end] * 2.0; g=w[end]; } - // Create filter + /* Create filter */ for (i=0 ; i<end ; i++){ t1 = (_ftype_t)(i+1) - k2; - w[end-i-1] = w[n-end+i] = w[end-i-1] * sin(k1 * t1)/(M_PI * t1); // Sinc - g += 2*w[end-i-1]; // Total gain in filter + w[end-i-1] = w[n-end+i] = w[end-i-1] * sin(k1 * t1)/(M_PI * t1); /* Sinc */ + g += 2*w[end-i-1]; /* Total gain in filter */ } } - else{ // High pass filter - if (!o) // High pass filters must have odd length + else{ /* High pass filter */ + if (!o) /* High pass filters must have odd length */ return -1; w[end] = 1.0 - (fc1 * w[end] * 2.0); g= w[end]; - // Create filter + /* Create filter */ for (i=0 ; i<end ; i++){ t1 = (_ftype_t)(i+1); - w[end-i-1] = w[n-end+i] = -1 * w[end-i-1] * sin(k1 * t1)/(M_PI * t1); // Sinc - g += ((i&1) ? (2*w[end-i-1]) : (-2*w[end-i-1])); // Total gain in filter + w[end-i-1] = w[n-end+i] = -1 * w[end-i-1] * sin(k1 * t1)/(M_PI * t1); /* Sinc */ + g += ((i&1) ? (2*w[end-i-1]) : (-2*w[end-i-1])); /* Total gain in filter */ } } } @@ -173,46 +174,46 @@ int design_fir(unsigned int n, _ftype_t* w, _ftype_t* fc, unsigned int flags, _f if(flags & (BP | BS)){ fc1=fc[0]; fc2=fc[1]; - // Cutoff frequencies must be < 1.0 where 1.0 <=> Fs/2 + /* Cutoff frequencies must be < 1.0 where 1.0 <=> Fs/2 */ fc1 = ((fc1 <= 1.0) && (fc1 > 0.0)) ? fc1/2 : 0.25; fc2 = ((fc2 <= 1.0) && (fc2 > 0.0)) ? fc2/2 : 0.25; - k3 = k1 * fc2; // 2*pi*fc2 - k1 *= fc1; // 2*pi*fc1 + k3 = k1 * fc2; /* 2*pi*fc2 */ + k1 *= fc1; /* 2*pi*fc1 */ - if(flags & BP){ // Band pass - // Calculate center tap + if(flags & BP){ /* Band pass */ + /* Calculate center tap */ if (o){ g=w[end]*(fc1+fc2); w[end] = (fc2 - fc1) * w[end] * 2.0; } - // Create filter + /* Create filter */ for (i=0 ; i<end ; i++){ t1 = (_ftype_t)(i+1) - k2; - t2 = sin(k3 * t1)/(M_PI * t1); // Sinc fc2 - t3 = sin(k1 * t1)/(M_PI * t1); // Sinc fc1 - g += w[end-i-1] * (t3 + t2); // Total gain in filter + t2 = sin(k3 * t1)/(M_PI * t1); /* Sinc fc2 */ + t3 = sin(k1 * t1)/(M_PI * t1); /* Sinc fc1 */ + g += w[end-i-1] * (t3 + t2); /* Total gain in filter */ w[end-i-1] = w[n-end+i] = w[end-i-1] * (t2 - t3); } } - else{ // Band stop - if (!o) // Band stop filters must have odd length + else{ /* Band stop */ + if (!o) /* Band stop filters must have odd length */ return -1; w[end] = 1.0 - (fc2 - fc1) * w[end] * 2.0; g= w[end]; - // Create filter + /* Create filter */ for (i=0 ; i<end ; i++){ t1 = (_ftype_t)(i+1); - t2 = sin(k1 * t1)/(M_PI * t1); // Sinc fc1 - t3 = sin(k3 * t1)/(M_PI * t1); // Sinc fc2 + t2 = sin(k1 * t1)/(M_PI * t1); /* Sinc fc1 */ + t3 = sin(k3 * t1)/(M_PI * t1); /* Sinc fc2 */ w[end-i-1] = w[n-end+i] = w[end-i-1] * (t2 - t3); - g += 2*w[end-i-1]; // Total gain in filter + g += 2*w[end-i-1]; /* Total gain in filter */ } } } - // Normalize gain + /* Normalize gain */ g=1/g; for (i=0; i<n; i++) w[i] *= g; @@ -221,41 +222,41 @@ int design_fir(unsigned int n, _ftype_t* w, _ftype_t* fc, unsigned int flags, _f } /* Design polyphase FIR filter from prototype filter - - n length of prototype filter - k number of polyphase components - w prototype filter taps - pw Parallel FIR filter - g Filter gain - flags FWD forward indexing - REW reverse indexing - ODD multiply every 2nd filter tap by -1 => HP filter - - returns 0 if OK, -1 if fail -*/ + * + * n length of prototype filter + * k number of polyphase components + * w prototype filter taps + * pw Parallel FIR filter + * g Filter gain + * flags FWD forward indexing + * REW reverse indexing + * ODD multiply every 2nd filter tap by -1 => HP filter + * + * returns 0 if OK, -1 if fail + */ int design_pfir(unsigned int n, unsigned int k, _ftype_t* w, _ftype_t** pw, _ftype_t g, unsigned int flags) { - int l = (int)n/k; // Length of individual FIR filters - int i; // Counters + int l = (int)n/k; /* Length of individual FIR filters */ + int i; /* Counters */ int j; - _ftype_t t; // g * w[i] + _ftype_t t; /* g * w[i] */ - // Sanity check + /* Sanity check */ if(l<1 || k<1 || !w || !pw) return -1; - // Do the stuff + /* Do the stuff */ if(flags&REW){ - for(j=l-1;j>-1;j--){//Columns - for(i=0;i<(int)k;i++){//Rows + for(j=l-1;j>-1;j--){ /* Columns */ + for(i=0;i<(int)k;i++){ /* Rows */ t=g * *w++; pw[i][j]=t * ((flags & ODD) ? ((j & 1) ? -1 : 1) : 1); } } } else{ - for(j=0;j<l;j++){//Columns - for(i=0;i<(int)k;i++){//Rows + for(j=0;j<l;j++){ /* Columns */ + for(i=0;i<(int)k;i++){ /* Rows */ t=g * *w++; pw[i][j]=t * ((flags & ODD) ? ((j & 1) ? 1 : -1) : 1); } @@ -271,9 +272,9 @@ int design_pfir(unsigned int n, unsigned int k, _ftype_t* w, _ftype_t** pw, _fty /* Helper functions for the bilinear transform */ /* Pre-warp the coefficients of a numerator or denominator. - Note that a0 is assumed to be 1, so there is no wrapping - of it. -*/ + * Note that a0 is assumed to be 1, so there is no wrapping + * of it. + */ void prewarp(_ftype_t* a, _ftype_t fc, _ftype_t fs) { _ftype_t wp; @@ -283,33 +284,33 @@ void prewarp(_ftype_t* a, _ftype_t fc, _ftype_t fs) } /* Transform the numerator and denominator coefficients of s-domain - biquad section into corresponding z-domain coefficients. - - The transfer function for z-domain is: - - 1 + alpha1 * z^(-1) + alpha2 * z^(-2) - H(z) = ------------------------------------- - 1 + beta1 * z^(-1) + beta2 * z^(-2) - - Store the 4 IIR coefficients in array pointed by coef in following - order: - beta1, beta2 (denominator) - alpha1, alpha2 (numerator) - - Arguments: - a - s-domain numerator coefficients - b - s-domain denominator coefficients - k - filter gain factor. Initially set to 1 and modified by each - biquad section in such a way, as to make it the - coefficient by which to multiply the overall filter gain - in order to achieve a desired overall filter gain, - specified in initial value of k. - fs - sampling rate (Hz) - coef - array of z-domain coefficients to be filled in. - - Return: On return, set coef z-domain coefficients and k to the gain - required to maintain overall gain = 1.0; -*/ + * biquad section into corresponding z-domain coefficients. + * + * The transfer function for z-domain is: + * + * 1 + alpha1 * z^(-1) + alpha2 * z^(-2) + * H(z) = ------------------------------------- + * 1 + beta1 * z^(-1) + beta2 * z^(-2) + * + * Store the 4 IIR coefficients in array pointed by coef in following + * order: + * beta1, beta2 (denominator) + * alpha1, alpha2 (numerator) + * + * Arguments: + * a - s-domain numerator coefficients + * b - s-domain denominator coefficients + * k - filter gain factor. Initially set to 1 and modified by each + * biquad section in such a way, as to make it the + * coefficient by which to multiply the overall filter gain + * in order to achieve a desired overall filter gain, + * specified in initial value of k. + * fs - sampling rate (Hz) + * coef - array of z-domain coefficients to be filled in. + * + * Return: On return, set coef z-domain coefficients and k to the gain + * required to maintain overall gain = 1.0; + */ void bilinear(_ftype_t* a, _ftype_t* b, _ftype_t* k, _ftype_t fs, _ftype_t *coef) { _ftype_t ad, bd; @@ -334,82 +335,82 @@ void bilinear(_ftype_t* a, _ftype_t* b, _ftype_t* k, _ftype_t fs, _ftype_t *coef /* IIR filter design using bilinear transform and prewarp. Transforms - 2nd order s domain analog filter into a digital IIR biquad link. To - create a filter fill in a, b, Q and fs and make space for coef and k. - - - Example Butterworth design: - - Below are Butterworth polynomials, arranged as a series of 2nd - order sections: - - Note: n is filter order. - - n Polynomials - ------------------------------------------------------------------- - 2 s^2 + 1.4142s + 1 - 4 (s^2 + 0.765367s + 1) * (s^2 + 1.847759s + 1) - 6 (s^2 + 0.5176387s + 1) * (s^2 + 1.414214 + 1) * (s^2 + 1.931852s + 1) - - For n=4 we have following equation for the filter transfer function: - 1 1 - T(s) = --------------------------- * ---------------------------- - s^2 + (1/Q) * 0.765367s + 1 s^2 + (1/Q) * 1.847759s + 1 - - The filter consists of two 2nd order sections since highest s power - is 2. Now we can take the coefficients, or the numbers by which s - is multiplied and plug them into a standard formula to be used by - bilinear transform. - - Our standard form for each 2nd order section is: - - a2 * s^2 + a1 * s + a0 - H(s) = ---------------------- - b2 * s^2 + b1 * s + b0 - - Note that Butterworth numerator is 1 for all filter sections, which - means s^2 = 0 and s^1 = 0 - - Let's convert standard Butterworth polynomials into this form: - - 0 + 0 + 1 0 + 0 + 1 - --------------------------- * -------------------------- - 1 + ((1/Q) * 0.765367) + 1 1 + ((1/Q) * 1.847759) + 1 - - Section 1: - a2 = 0; a1 = 0; a0 = 1; - b2 = 1; b1 = 0.765367; b0 = 1; - - Section 2: - a2 = 0; a1 = 0; a0 = 1; - b2 = 1; b1 = 1.847759; b0 = 1; - - Q is filter quality factor or resonance, in the range of 1 to - 1000. The overall filter Q is a product of all 2nd order stages. - For example, the 6th order filter (3 stages, or biquads) with - individual Q of 2 will have filter Q = 2 * 2 * 2 = 8. - - - Arguments: - a - s-domain numerator coefficients, a[1] is always assumed to be 1.0 - b - s-domain denominator coefficients - Q - Q value for the filter - k - filter gain factor. Initially set to 1 and modified by each - biquad section in such a way, as to make it the - coefficient by which to multiply the overall filter gain - in order to achieve a desired overall filter gain, - specified in initial value of k. - fs - sampling rate (Hz) - coef - array of z-domain coefficients to be filled in. - - Note: Upon return from each call, the k argument will be set to a - value, by which to multiply our actual signal in order for the gain - to be one. On second call to szxform() we provide k that was - changed by the previous section. During actual audio filtering - k can be used for gain compensation. - - return -1 if fail 0 if success. -*/ + * 2nd order s domain analog filter into a digital IIR biquad link. To + * create a filter fill in a, b, Q and fs and make space for coef and k. + * + * + * Example Butterworth design: + * + * Below are Butterworth polynomials, arranged as a series of 2nd + * order sections: + * + * Note: n is filter order. + * + * n Polynomials + * ------------------------------------------------------------------- + * 2 s^2 + 1.4142s + 1 + * 4 (s^2 + 0.765367s + 1) * (s^2 + 1.847759s + 1) + * 6 (s^2 + 0.5176387s + 1) * (s^2 + 1.414214 + 1) * (s^2 + 1.931852s + 1) + * + * For n=4 we have following equation for the filter transfer function: + * 1 1 + * T(s) = --------------------------- * ---------------------------- + * s^2 + (1/Q) * 0.765367s + 1 s^2 + (1/Q) * 1.847759s + 1 + * + * The filter consists of two 2nd order sections since highest s power + * is 2. Now we can take the coefficients, or the numbers by which s + * is multiplied and plug them into a standard formula to be used by + * bilinear transform. + * + * Our standard form for each 2nd order section is: + * + * a2 * s^2 + a1 * s + a0 + * H(s) = ---------------------- + * b2 * s^2 + b1 * s + b0 + * + * Note that Butterworth numerator is 1 for all filter sections, which + * means s^2 = 0 and s^1 = 0 + * + * Let's convert standard Butterworth polynomials into this form: + * + * 0 + 0 + 1 0 + 0 + 1 + * --------------------------- * -------------------------- + * 1 + ((1/Q) * 0.765367) + 1 1 + ((1/Q) * 1.847759) + 1 + * + * Section 1: + * a2 = 0; a1 = 0; a0 = 1; + * b2 = 1; b1 = 0.765367; b0 = 1; + * + * Section 2: + * a2 = 0; a1 = 0; a0 = 1; + * b2 = 1; b1 = 1.847759; b0 = 1; + * + * Q is filter quality factor or resonance, in the range of 1 to + * 1000. The overall filter Q is a product of all 2nd order stages. + * For example, the 6th order filter (3 stages, or biquads) with + * individual Q of 2 will have filter Q = 2 * 2 * 2 = 8. + * + * + * Arguments: + * a - s-domain numerator coefficients, a[1] is always assumed to be 1.0 + * b - s-domain denominator coefficients + * Q - Q value for the filter + * k - filter gain factor. Initially set to 1 and modified by each + * biquad section in such a way, as to make it the + * coefficient by which to multiply the overall filter gain + * in order to achieve a desired overall filter gain, + * specified in initial value of k. + * fs - sampling rate (Hz) + * coef - array of z-domain coefficients to be filled in. + * + * Note: Upon return from each call, the k argument will be set to a + * value, by which to multiply our actual signal in order for the gain + * to be one. On second call to szxform() we provide k that was + * changed by the previous section. During actual audio filtering + * k can be used for gain compensation. + * + * return -1 if fail 0 if success. + */ int szxform(_ftype_t* a, _ftype_t* b, _ftype_t Q, _ftype_t fc, _ftype_t fs, _ftype_t *k, _ftype_t *coef) { _ftype_t at[3]; diff --git a/src/post/audio/filter.h b/src/post/audio/filter.h index b64eeedbd..0b0ce1c1b 100644 --- a/src/post/audio/filter.h +++ b/src/post/audio/filter.h @@ -1,12 +1,12 @@ /*============================================================================= -// -// This software has been released under the terms of the GNU Public -// license. See http://www.gnu.org/copyleft/gpl.html for details. -// -// Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au -// -//============================================================================= -*/ + * + * This software has been released under the terms of the GNU Public + * license. See http://www.gnu.org/copyleft/gpl.html for details. + * + * Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au + * + *============================================================================= + */ #if !defined _DSP_H # error "Never use <filter.h> directly; include <dsp.h> instead" @@ -15,20 +15,18 @@ #ifndef _FILTER_H #define _FILTER_H 1 +/* Design and implementation of different types of digital filters */ -// Design and implementation of different types of digital filters +/* Flags used for filter design */ - -// Flags used for filter design - -// Filter characteristics -#define LP 0x00010000 // Low pass -#define HP 0x00020000 // High pass -#define BP 0x00040000 // Band pass -#define BS 0x00080000 // Band stop +/* Filter characteristics */ +#define LP 0x00010000 /* Low pass */ +#define HP 0x00020000 /* High pass */ +#define BP 0x00040000 /* Band pass */ +#define BS 0x00080000 /* Band stop */ #define TYPE_MASK 0x000F0000 -// Window types +/* Window types */ #define BOXCAR 0x00000001 #define TRIANG 0x00000002 #define HAMMING 0x00000004 @@ -38,12 +36,12 @@ #define KAISER 0x00000012 #define WINDOW_MASK 0x0000001F -// Parallel filter design -#define FWD 0x00000001 // Forward indexing of polyphase filter -#define REW 0x00000002 // Reverse indexing of polyphase filter -#define ODD 0x00000010 // Make filter HP +/* Parallel filter design */ +#define FWD 0x00000001 /* Forward indexing of polyphase filter */ +#define REW 0x00000002 /* Reverse indexing of polyphase filter */ +#define ODD 0x00000010 /* Make filter HP */ -// Exported functions +/* Exported functions */ extern _ftype_t fir(unsigned int n, _ftype_t* w, _ftype_t* x); extern _ftype_t* pfir(unsigned int n, unsigned int k, unsigned int xi, _ftype_t** w, _ftype_t** x, _ftype_t* y, unsigned int s); @@ -60,10 +58,10 @@ void bilinear(_ftype_t* a, _ftype_t* b, _ftype_t* k, _ftype_t fs, _ftype_t *coef extern int szxform(_ftype_t* a, _ftype_t* b, _ftype_t Q, _ftype_t fc, _ftype_t fs, _ftype_t *k, _ftype_t *coef); /* Add new data to circular queue designed to be used with a FIR - filter. xq is the circular queue, in pointing at the new sample, xi - current index for xq and n the length of the filter. xq must be n*2 - long. -*/ + * filter. xq is the circular queue, in pointing at the new sample, xi + * current index for xq and n the length of the filter. xq must be n*2 + * long. + */ #define updateq(n,xi,xq,in)\ xq[xi]=(xq)[(xi)+(n)]=*(in);\ xi=(++(xi))&((n)-1); diff --git a/src/post/audio/upmix.c b/src/post/audio/upmix.c index 168411fd3..ecaa5a273 100644 --- a/src/post/audio/upmix.c +++ b/src/post/audio/upmix.c @@ -23,7 +23,7 @@ * process. It simply paints the screen a solid color and rotates through * colors on each iteration. * - * $Id: upmix.c,v 1.4 2004/05/16 14:44:42 jcdutton Exp $ + * $Id: upmix.c,v 1.5 2004/05/16 15:13:34 jcdutton Exp $ * */ @@ -56,8 +56,8 @@ struct post_class_upmix_s { /* Analog domain biquad section */ typedef struct{ - float a[3]; // Numerator coefficients - float b[3]; // Denominator coefficients + float a[3]; /* Numerator coefficients */ + float b[3]; /* Denominator coefficients */ } biquad_t; /* S-parameters for designing 4th order Butterworth filter */ diff --git a/src/post/audio/window.c b/src/post/audio/window.c index 25b92bc31..3fe76a112 100644 --- a/src/post/audio/window.c +++ b/src/post/audio/window.c @@ -1,49 +1,49 @@ /*============================================================================= -// -// This software has been released under the terms of the GNU Public -// license. See http://www.gnu.org/copyleft/gpl.html for details. -// -// Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au -// -//============================================================================= -*/ + * + * This software has been released under the terms of the GNU Public + * license. See http://www.gnu.org/copyleft/gpl.html for details. + * + * Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au + * + *============================================================================= + */ /* Calculates a number of window functions. The following window - functions are currently implemented: Boxcar, Triang, Hanning, - Hamming, Blackman, Flattop and Kaiser. In the function call n is - the number of filter taps and w the buffer in which the filter - coefficients will be stored. -*/ + * functions are currently implemented: Boxcar, Triang, Hanning, + * Hamming, Blackman, Flattop and Kaiser. In the function call n is + * the number of filter taps and w the buffer in which the filter + * coefficients will be stored. + */ #include <math.h> #include "dsp.h" /* -// Boxcar -// -// n window length -// w buffer for the window parameters -*/ + * Boxcar + * + * n window length + * w buffer for the window parameters + */ void boxcar(int n, _ftype_t* w) { int i; - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0 ; i<n ; i++) w[i] = 1.0; } /* -// Triang a.k.a Bartlett -// -// | (N-1)| -// 2 * |k - -----| -// | 2 | -// w = 1.0 - --------------- -// N+1 -// n window length -// w buffer for the window parameters -*/ + * Triang a.k.a Bartlett + * + * | (N-1)| + * 2 * |k - -----| + * | 2 | + * w = 1.0 - --------------- + * N+1 + * n window length + * w buffer for the window parameters + */ void triang(int n, _ftype_t* w) { _ftype_t k1 = (_ftype_t)(n & 1); @@ -51,96 +51,96 @@ void triang(int n, _ftype_t* w) int end = (n + 1) >> 1; int i; - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0 ; i<end ; i++) w[i] = w[n-i-1] = (2.0*((_ftype_t)(i+1))-(1.0-k1))*k2; } /* -// Hanning -// 2*pi*k -// w = 0.5 - 0.5*cos(------), where 0 < k <= N -// N+1 -// n window length -// w buffer for the window parameters -*/ + * Hanning + * 2*pi*k + * w = 0.5 - 0.5*cos(------), where 0 < k <= N + * N+1 + * n window length + * w buffer for the window parameters + */ void hanning(int n, _ftype_t* w) { int i; - _ftype_t k = 2*M_PI/((_ftype_t)(n+1)); // 2*pi/(N+1) + _ftype_t k = 2*M_PI/((_ftype_t)(n+1)); /* 2*pi/(N+1) */ - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0; i<n; i++) *w++ = 0.5*(1.0 - cos(k*(_ftype_t)(i+1))); } /* -// Hamming -// 2*pi*k -// w(k) = 0.54 - 0.46*cos(------), where 0 <= k < N -// N-1 -// -// n window length -// w buffer for the window parameters -*/ + * Hamming + * 2*pi*k + * w(k) = 0.54 - 0.46*cos(------), where 0 <= k < N + * N-1 + * + * n window length + * w buffer for the window parameters + */ void hamming(int n,_ftype_t* w) { int i; - _ftype_t k = 2*M_PI/((_ftype_t)(n-1)); // 2*pi/(N-1) + _ftype_t k = 2*M_PI/((_ftype_t)(n-1)); /* 2*pi/(N-1) */ - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0; i<n; i++) *w++ = 0.54 - 0.46*cos(k*(_ftype_t)i); } /* -// Blackman -// 2*pi*k 4*pi*k -// w(k) = 0.42 - 0.5*cos(------) + 0.08*cos(------), where 0 <= k < N -// N-1 N-1 -// -// n window length -// w buffer for the window parameters -*/ + * Blackman + * 2*pi*k 4*pi*k + * w(k) = 0.42 - 0.5*cos(------) + 0.08*cos(------), where 0 <= k < N + * N-1 N-1 + * + * n window length + * w buffer for the window parameters + */ void blackman(int n,_ftype_t* w) { int i; - _ftype_t k1 = 2*M_PI/((_ftype_t)(n-1)); // 2*pi/(N-1) - _ftype_t k2 = 2*k1; // 4*pi/(N-1) + _ftype_t k1 = 2*M_PI/((_ftype_t)(n-1)); /* 2*pi/(N-1) */ + _ftype_t k2 = 2*k1; /* 4*pi/(N-1) */ - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0; i<n; i++) *w++ = 0.42 - 0.50*cos(k1*(_ftype_t)i) + 0.08*cos(k2*(_ftype_t)i); } /* -// Flattop -// 2*pi*k 4*pi*k -// w(k) = 0.2810638602 - 0.5208971735*cos(------) + 0.1980389663*cos(------), where 0 <= k < N -// N-1 N-1 -// -// n window length -// w buffer for the window parameters -*/ + * Flattop + * 2*pi*k 4*pi*k + * w(k) = 0.2810638602 - 0.5208971735*cos(------) + 0.1980389663*cos(------), where 0 <= k < N + * N-1 N-1 + * + * n window length + * w buffer for the window parameters + */ void flattop(int n,_ftype_t* w) { int i; - _ftype_t k1 = 2*M_PI/((_ftype_t)(n-1)); // 2*pi/(N-1) - _ftype_t k2 = 2*k1; // 4*pi/(N-1) + _ftype_t k1 = 2*M_PI/((_ftype_t)(n-1)); /* 2*pi/(N-1) */ + _ftype_t k2 = 2*k1; /* 4*pi/(N-1) */ - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0; i<n; i++) *w++ = 0.2810638602 - 0.5208971735*cos(k1*(_ftype_t)i) + 0.1980389663*cos(k2*(_ftype_t)i); } /* Computes the 0th order modified Bessel function of the first kind. -// (Needed to compute Kaiser window) -// -// y = sum( (x/(2*n))^2 ) -// n -*/ -#define BIZ_EPSILON 1E-21 // Max error acceptable + * (Needed to compute Kaiser window) + * + * y = sum( (x/(2*n))^2 ) + * n + */ +#define BIZ_EPSILON 1E-21 /* Max error acceptable */ _ftype_t besselizero(_ftype_t x) { @@ -160,32 +160,32 @@ _ftype_t besselizero(_ftype_t x) } /* -// Kaiser -// -// n window length -// w buffer for the window parameters -// b beta parameter of Kaiser window, Beta >= 1 -// -// Beta trades the rejection of the low pass filter against the -// transition width from passband to stop band. Larger Beta means a -// slower transition and greater stop band rejection. See Rabiner and -// Gold (Theory and Application of DSP) under Kaiser windows for more -// about Beta. The following table from Rabiner and Gold gives some -// feel for the effect of Beta: -// -// All ripples in dB, width of transition band = D*N where N = window -// length -// -// BETA D PB RIP SB RIP -// 2.120 1.50 +-0.27 -30 -// 3.384 2.23 0.0864 -40 -// 4.538 2.93 0.0274 -50 -// 5.658 3.62 0.00868 -60 -// 6.764 4.32 0.00275 -70 -// 7.865 5.0 0.000868 -80 -// 8.960 5.7 0.000275 -90 -// 10.056 6.4 0.000087 -100 -*/ + * Kaiser + * + * n window length + * w buffer for the window parameters + * b beta parameter of Kaiser window, Beta >= 1 + * + * Beta trades the rejection of the low pass filter against the + * transition width from passband to stop band. Larger Beta means a + * slower transition and greater stop band rejection. See Rabiner and + * Gold (Theory and Application of DSP) under Kaiser windows for more + * about Beta. The following table from Rabiner and Gold gives some + * feel for the effect of Beta: + * + * All ripples in dB, width of transition band = D*N where N = window + * length + * + * BETA D PB RIP SB RIP + * 2.120 1.50 +-0.27 -30 + * 3.384 2.23 0.0864 -40 + * 4.538 2.93 0.0274 -50 + * 5.658 3.62 0.00868 -60 + * 6.764 4.32 0.00275 -70 + * 7.865 5.0 0.000868 -80 + * 8.960 5.7 0.000275 -90 + * 10.056 6.4 0.000087 -100 + */ void kaiser(int n, _ftype_t* w, _ftype_t b) { _ftype_t tmp; @@ -194,7 +194,7 @@ void kaiser(int n, _ftype_t* w, _ftype_t b) int end = (n + 1) >> 1; int i; - // Calculate window coefficients + /* Calculate window coefficients */ for (i=0 ; i<end ; i++){ tmp = (_ftype_t)(2*i + k2) / ((_ftype_t)n - 1.0); w[end-(1&(!k2))+i] = w[end-1-i] = k1 * besselizero(b*sqrt(1.0 - tmp*tmp)); diff --git a/src/post/audio/window.h b/src/post/audio/window.h index bd747306c..d0a7446eb 100644 --- a/src/post/audio/window.h +++ b/src/post/audio/window.h @@ -1,19 +1,19 @@ /*============================================================================= -// -// This software has been released under the terms of the GNU Public -// license. See http://www.gnu.org/copyleft/gpl.html for details. -// -// Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au -// -//============================================================================= -*/ + * + * This software has been released under the terms of the GNU Public + * license. See http://www.gnu.org/copyleft/gpl.html for details. + * + * Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au + * + *============================================================================= + */ /* Calculates a number of window functions. The following window - functions are currently implemented: Boxcar, Triang, Hanning, - Hamming, Blackman, Flattop and Kaiser. In the function call n is - the number of filter taps and w the buffer in which the filter - coefficients will be stored. -*/ + * functions are currently implemented: Boxcar, Triang, Hanning, + * Hamming, Blackman, Flattop and Kaiser. In the function call n is + * the number of filter taps and w the buffer in which the filter + * coefficients will be stored. + */ #if !defined _DSP_H # error "Never use <window.h> directly; include <dsp.h> instead" |