diff --git a/window.hh b/window.hh index 9a2ee8b..e38c470 100644 --- a/window.hh +++ b/window.hh @@ -7,6 +7,8 @@ Copyright 2018 Ahmet Inan #ifndef WINDOW_HH #define WINDOW_HH +#include "kahan.hh" + namespace DSP { template @@ -65,6 +67,33 @@ public: inline operator const TYPE * () const { return w; } }; +template +class Kaiser +{ + TYPE w[TAPS]; + TYPE i0(TYPE x) + { + Kahan sum(1.0); + TYPE val = 1.0; + // converges for -3*M_PI:3*M_PI in less than: + // float: 25 iterations + // double: 35 iterations + for (int n = 1; n < 35; ++n) { + TYPE tmp = x / TYPE(2 * n); + sum(val *= tmp * tmp); + } + return sum(); + } +public: + Kaiser(TYPE a) + { + for (int n = 0; n < TAPS; ++n) + w[n] = i0(TYPE(M_PI) * a * std::sqrt(TYPE(1) - std::pow(TYPE(2 * n) / TYPE(TAPS - 1) - TYPE(1), TYPE(2)))) / i0(TYPE(M_PI) * a); + } + inline TYPE operator () (int n) { return n >= 0 && n < TAPS ? w[n] : 0; } + inline operator const TYPE * () const { return w; } +}; + } #endif