Chris@124: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@124: Chris@124: /* Chris@124: QM DSP library Chris@124: Centre for Digital Music, Queen Mary, University of London. Chris@124: Chris@124: This program is free software; you can redistribute it and/or Chris@124: modify it under the terms of the GNU General Public License as Chris@124: published by the Free Software Foundation; either version 2 of the Chris@124: License, or (at your option) any later version. See the file Chris@124: COPYING included with this distribution for more information. Chris@124: */ Chris@124: Chris@124: #include "KaiserWindow.h" Chris@124: Chris@124: #include "maths/MathUtilities.h" Chris@124: Chris@124: KaiserWindow::Parameters Chris@124: KaiserWindow::parametersForTransitionWidth(double attenuation, Chris@124: double transition) Chris@124: { Chris@124: Parameters p; Chris@124: p.length = 1 + (attenuation > 21.0 ? Chris@124: ceil((attenuation - 7.95) / (2.285 * transition)) : Chris@124: ceil(5.79 / transition)); Chris@124: p.beta = (attenuation > 50.0 ? Chris@124: 0.1102 * (attenuation - 8.7) : Chris@124: attenuation > 21.0 ? Chris@124: 0.5842 * pow(attenuation - 21.0, 0.4) + 0.07886 * (attenuation - 21.0) : Chris@124: 0); Chris@124: return p; Chris@124: } Chris@124: Chris@124: static double besselTerm(double x, int i) Chris@124: { Chris@124: if (i == 0) { Chris@124: return 1; Chris@124: } else { Chris@124: double f = MathUtilities::factorial(i); Chris@124: return pow(x/2, i*2) / (f*f); Chris@124: } Chris@124: } Chris@124: Chris@124: static double bessel0(double x) Chris@124: { Chris@124: double b = 0.0; Chris@124: for (int i = 0; i < 20; ++i) { Chris@124: b += besselTerm(x, i); Chris@124: } Chris@124: return b; Chris@124: } Chris@124: Chris@124: void Chris@124: KaiserWindow::init() Chris@124: { Chris@124: double denominator = bessel0(m_beta); Chris@124: for (int i = 0; i < m_length; ++i) { Chris@124: double k = double(2*i) / double(m_length-1) - 1.0; Chris@124: m_window.push_back(bessel0(m_beta * sqrt(1.0 - k*k)) / denominator); Chris@124: } Chris@124: }