diff --git a/RTCP/CNProc/src/FIR.cc b/RTCP/CNProc/src/FIR.cc index 10dee321134ea802312e4828a41ed1b7b229147f..ea1aec01b3f0990985433bcc024f8d1469741c5c 100644 --- a/RTCP/CNProc/src/FIR.cc +++ b/RTCP/CNProc/src/FIR.cc @@ -1085,8 +1085,14 @@ fcomplex FIR::processNextSample(fcomplex sample, unsigned channel) #endif +// hamming window function void FIR::hamming(unsigned n, double* d) { + if(n == 1) { + d[0] = 1.0; + return; + } + unsigned m = n-1; for(unsigned i=0; i<n; i++) { @@ -1094,6 +1100,31 @@ void FIR::hamming(unsigned n, double* d) } } +// blackman window function +void FIR::blackman(unsigned n, double* d) +{ + if(n == 1) { + d[0] = 1.0; + return; + } + + unsigned m = n-1; + + for(unsigned i=0; i<n; i++) { + double k = i / m; + d[i] = 0.42 - 0.5 * cos (2.0 * M_PI * k) + 0.08 * cos (4.0 * M_PI * k); + } +} + +// Guassian window function +void FIR::gaussian(int n, double a, double* d) +{ + int index = 0; + for (int i=-(n-1); i<=n-1; i+=2) { + d[index++] = exp( -0.5 * pow(( a/n * i), 2) ); + } +} + unsigned FIR::next_power_of_2(unsigned n) { @@ -1278,11 +1309,17 @@ void FIR::generate_filter(unsigned taps, unsigned channels) THROW(CNProcException, "cannot allocate buffer"); } - // use a n-point hamming window - hamming(n, d); + // use a n-point Hamming window +// hamming(n, d); + + // use a n-point Blackman window +// blackman(n, d); + + // use a n-point Gaussian window + gaussian(n, 3.5, d); /* for(int i=0; i<n; i++) { - std::cout << "hamming[" << i << "] = " << d[i] << std::endl; + std::cout << "windowFunction[" << i << "] = " << d[i] << std::endl; } */ double* result = (double*) malloc(n * sizeof(double)); @@ -1319,7 +1356,9 @@ void FIR::generate_filter(unsigned taps, unsigned channels) */ free(result); } -#else + +#else // USE_ORIGINAL_FILTER + // This method initializes the weights array. void FIR::generate_filter(unsigned taps, unsigned channels) { @@ -1329,6 +1368,7 @@ void FIR::generate_filter(unsigned taps, unsigned channels) weights.resize(boost::extents[channels][taps]); memcpy(weights.origin(), origWeights, (channels * taps) * sizeof(float)); } + #endif // USE_ORIGINAL_FILTER } // namespace RTCP diff --git a/RTCP/CNProc/src/FIR.h b/RTCP/CNProc/src/FIR.h index e261d12200fc632c6b7d784089175794fbc0e9db..d9caa36b85c47cd45c7098743c4143a45a27671c 100644 --- a/RTCP/CNProc/src/FIR.h +++ b/RTCP/CNProc/src/FIR.h @@ -32,7 +32,15 @@ class FIR { #endif private: + // Hamming window function static void hamming(unsigned n, double* d); + + // Blackman window function + static void blackman(unsigned n, double* d); + + // Gaussian window function + static void gaussian(int n, double a, double* d); + static unsigned next_power_of_2(unsigned n); static void interpolate(double* x, double* y, unsigned xlen, unsigned n, double* result); static void generate_fir_filter(unsigned n, double w, double* window, double* result);