annotate base/Window.h @ 309:d5014ab8b0e5

* Add GPL and README; some tidying
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 13 Dec 2010 14:55:28 +0000
parents 9c403afdd9e9
children 627d364bbc82
rev   line source
c@225 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
c@225 2
c@225 3 /*
c@225 4 QM DSP library
c@225 5 Centre for Digital Music, Queen Mary, University of London.
c@225 6 This file Copyright 2006 Chris Cannam.
c@309 7
c@309 8 This program is free software; you can redistribute it and/or
c@309 9 modify it under the terms of the GNU General Public License as
c@309 10 published by the Free Software Foundation; either version 2 of the
c@309 11 License, or (at your option) any later version. See the file
c@309 12 COPYING included with this distribution for more information.
c@225 13 */
c@225 14
c@225 15 #ifndef _WINDOW_H_
c@225 16 #define _WINDOW_H_
c@225 17
c@225 18 #include <cmath>
c@225 19 #include <iostream>
c@225 20 #include <map>
c@225 21
c@225 22 enum WindowType {
c@225 23 RectangularWindow,
c@225 24 BartlettWindow,
c@225 25 HammingWindow,
c@225 26 HanningWindow,
c@225 27 BlackmanWindow,
c@225 28 GaussianWindow,
c@225 29 ParzenWindow
c@225 30 };
c@225 31
c@225 32 template <typename T>
c@225 33 class Window
c@225 34 {
c@225 35 public:
c@225 36 /**
c@225 37 * Construct a windower of the given type.
c@225 38 */
c@225 39 Window(WindowType type, size_t size) : m_type(type), m_size(size) { encache(); }
c@225 40 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); }
c@225 41 Window &operator=(const Window &w) {
c@225 42 if (&w == this) return *this;
c@225 43 m_type = w.m_type;
c@225 44 m_size = w.m_size;
c@225 45 encache();
c@225 46 return *this;
c@225 47 }
c@251 48 virtual ~Window() { delete[] m_cache; }
c@225 49
c@225 50 void cut(T *src) const { cut(src, src); }
c@280 51 void cut(const T *src, T *dst) const {
c@225 52 for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i];
c@225 53 }
c@225 54
c@225 55 WindowType getType() const { return m_type; }
c@225 56 size_t getSize() const { return m_size; }
c@225 57
c@225 58 protected:
c@225 59 WindowType m_type;
c@225 60 size_t m_size;
c@225 61 T *m_cache;
c@225 62
c@225 63 void encache();
c@225 64 };
c@225 65
c@225 66 template <typename T>
c@225 67 void Window<T>::encache()
c@225 68 {
c@225 69 size_t n = m_size;
c@225 70 T *mult = new T[n];
c@225 71 size_t i;
c@225 72 for (i = 0; i < n; ++i) mult[i] = 1.0;
c@225 73
c@225 74 switch (m_type) {
c@225 75
c@225 76 case RectangularWindow:
c@225 77 for (i = 0; i < n; ++i) {
c@225 78 mult[i] = mult[i] * 0.5;
c@225 79 }
c@225 80 break;
c@225 81
c@225 82 case BartlettWindow:
c@225 83 for (i = 0; i < n/2; ++i) {
c@225 84 mult[i] = mult[i] * (i / T(n/2));
c@225 85 mult[i + n/2] = mult[i + n/2] * (1.0 - (i / T(n/2)));
c@225 86 }
c@225 87 break;
c@225 88
c@225 89 case HammingWindow:
c@225 90 for (i = 0; i < n; ++i) {
c@225 91 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n));
c@225 92 }
c@225 93 break;
c@225 94
c@225 95 case HanningWindow:
c@225 96 for (i = 0; i < n; ++i) {
c@225 97 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n));
c@225 98 }
c@225 99 break;
c@225 100
c@225 101 case BlackmanWindow:
c@225 102 for (i = 0; i < n; ++i) {
c@225 103 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n)
c@225 104 + 0.08 * cos(4 * M_PI * i / n));
c@225 105 }
c@225 106 break;
c@225 107
c@225 108 case GaussianWindow:
c@225 109 for (i = 0; i < n; ++i) {
c@225 110 mult[i] = mult[i] * exp((-1.0 / (n*n)) * ((T(2*i) - n) *
c@225 111 (T(2*i) - n)));
c@225 112 }
c@225 113 break;
c@225 114
c@225 115 case ParzenWindow:
c@225 116 for (i = 0; i < n; ++i) {
c@225 117 mult[i] = mult[i] * (1.0 - fabs((T(2*i) - n) / T(n + 1)));
c@225 118 }
c@225 119 break;
c@225 120 }
c@225 121
c@225 122 m_cache = mult;
c@225 123 }
c@225 124
c@225 125 #endif