/* Coefficient array helper Copyright 2018 Ahmet Inan */ #pragma once namespace DSP { template struct CoeffsFunc { virtual TYPE operator () (int, int) = 0; virtual ~CoeffsFunc() = default; }; template class Coeffs { TYPE w[TAPS]; public: Coeffs(CoeffsFunc *func) { for (int n = 0; n < TAPS; ++n) w[n] = (*func)(n, TAPS); } Coeffs(CoeffsFunc *func0, CoeffsFunc *func1) { for (int n = 0; n < TAPS; ++n) w[n] = (*func0)(n, TAPS) * (*func1)(n, TAPS); } 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 * std::abs(sum); } inline TYPE operator () (int n) { return n >= 0 && n < TAPS ? w[n] : 0; } inline operator const TYPE * () const { return w; } }; }