added Kaiser window

This commit is contained in:
Ahmet Inan 2018-03-03 10:11:20 +01:00
commit c6de7e95e0

View file

@ -7,6 +7,8 @@ Copyright 2018 Ahmet Inan <inan@aicodix.de>
#ifndef WINDOW_HH
#define WINDOW_HH
#include "kahan.hh"
namespace DSP {
template <int TAPS, typename TYPE>
@ -65,6 +67,33 @@ public:
inline operator const TYPE * () const { return w; }
};
template <int TAPS, typename TYPE>
class Kaiser
{
TYPE w[TAPS];
TYPE i0(TYPE x)
{
Kahan<TYPE> 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