/* A sliding/moving window using a Cosine weighting. * * Author: Steffen Vogel * SPDX-FileCopyrightText: 2014-2023 Institute for Automation of Complex Power Systems, RWTH Aachen University * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include #include namespace villas { namespace dsp { template < typename T> // a0 = 1.0, double a1 = 0.0, double a2 = 0.0, double a3 = 0.0, double a4 = 0.0> class CosineWindow : public Window { public: using size_type = typename Window::size_type; protected: std::vector coefficients; T correctionFactor; virtual T filter(T in, size_type i) const { return in * coefficients[i]; } public: CosineWindow(double a0, double a1, double a2, double a3, double a4, size_type len, T i = 0) : Window(len, i), coefficients(len), correctionFactor(0) { for (unsigned i = 0; i < len; i++) { coefficients[i] = a0 - a1 * cos(2 * M_PI * i / len) + a2 * cos(4 * M_PI * i / len) - a3 * cos(6 * M_PI * i / len) + a4 * cos(8 * M_PI * i / len); correctionFactor += coefficients[i]; } correctionFactor /= len; } virtual T getCorrectionFactor() const { return correctionFactor; } }; // From: https://en.wikipedia.org/wiki/Window_function#Cosine-sum_windows template class RectangularWindow : public CosineWindow { public: RectangularWindow(typename Window::size_type len, T i = 0) : CosineWindow(1, 0., 0., 0., 0., len, i) {} }; template class HannWindow : public CosineWindow { public: HannWindow(typename Window::size_type len, T i = 0) : CosineWindow(0.5, 0.5, 0., 0., 0., len, i) {} }; template class HammingWindow : public CosineWindow { public: HammingWindow(typename Window::size_type len, T i = 0) : CosineWindow(25. / 46, 1 - 25. / 46, 0., 0., 0., len, i) {} }; template class FlattopWindow : public CosineWindow { public: FlattopWindow(typename Window::size_type len, T i = 0) : CosineWindow(0.21557895, 0.41663158, 0.277263158, 0.083578947, 0.006947368, len, i) {} }; template class NuttallWindow : public CosineWindow { public: NuttallWindow(typename Window::size_type len, T i = 0) : CosineWindow(0.355768, 0.487396, 0.144232, 0.012604, 0., len, i) {} }; template class BlackmanWindow : public CosineWindow { public: BlackmanWindow(typename Window::size_type len, T i = 0) : CosineWindow(0.3635819, 0.4891775, 0.1365995, 0.0106411, 0., len, i) {} }; } // namespace dsp } // namespace villas