/* Coefficient array helper Copyright 2018 Ahmet Inan */ #pragma once namespace DSP { template class Coeffs { TYPE w[TAPS]; public: template Coeffs(FUNC *func) { for (int n = 0; n < TAPS; ++n) w[n] = (*func)(n, TAPS); if (NORMALIZE) normalize(); } template Coeffs(FUNC0 *func0, FUNC1 *func1) { for (int n = 0; n < TAPS; ++n) w[n] = (*func0)(n, TAPS) * (*func1)(n, TAPS); if (NORMALIZE) normalize(); } void normalize(TYPE divisor = 1) { TYPE sum(0); for (int n = 0; n < TAPS; ++n) sum += w[n]; for (int n = 0; n < TAPS; ++n) w[n] /= divisor * abs(sum); } inline TYPE operator () (int n) { return n >= 0 && n < TAPS ? w[n] : 0; } inline operator const TYPE * () const { return w; } }; }