annotate base/Window.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #ifndef _WINDOW_H_
lbajardsilogic@0 17 #define _WINDOW_H_
lbajardsilogic@0 18
lbajardsilogic@0 19 #include <cmath>
lbajardsilogic@0 20 #include <iostream>
lbajardsilogic@0 21 #include <map>
lbajardsilogic@0 22
lbajardsilogic@0 23 enum WindowType {
lbajardsilogic@0 24 RectangularWindow,
lbajardsilogic@0 25 BartlettWindow,
lbajardsilogic@0 26 HammingWindow,
lbajardsilogic@0 27 HanningWindow,
lbajardsilogic@0 28 BlackmanWindow,
lbajardsilogic@0 29 GaussianWindow,
lbajardsilogic@0 30 ParzenWindow,
lbajardsilogic@0 31 NuttallWindow,
lbajardsilogic@0 32 BlackmanHarrisWindow
lbajardsilogic@0 33 };
lbajardsilogic@0 34
lbajardsilogic@0 35 template <typename T>
lbajardsilogic@0 36 class Window
lbajardsilogic@0 37 {
lbajardsilogic@0 38 public:
lbajardsilogic@0 39 /**
lbajardsilogic@0 40 * Construct a windower of the given type.
lbajardsilogic@0 41 */
lbajardsilogic@0 42 Window(WindowType type, size_t size) : m_type(type), m_size(size) { encache(); }
lbajardsilogic@0 43 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); }
lbajardsilogic@0 44 Window &operator=(const Window &w) {
lbajardsilogic@0 45 if (&w == this) return *this;
lbajardsilogic@0 46 m_type = w.m_type;
lbajardsilogic@0 47 m_size = w.m_size;
lbajardsilogic@0 48 encache();
lbajardsilogic@0 49 return *this;
lbajardsilogic@0 50 }
lbajardsilogic@0 51 virtual ~Window() { delete[] m_cache; }
lbajardsilogic@0 52
lbajardsilogic@0 53 void cut(T *src) const { cut(src, src); }
lbajardsilogic@0 54 void cut(T *src, T *dst) const {
lbajardsilogic@0 55 for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i];
lbajardsilogic@0 56 }
lbajardsilogic@0 57
lbajardsilogic@0 58 T getArea() { return m_area; }
lbajardsilogic@0 59 T getValue(size_t i) { return m_cache[i]; }
lbajardsilogic@0 60
lbajardsilogic@0 61 WindowType getType() const { return m_type; }
lbajardsilogic@0 62 size_t getSize() const { return m_size; }
lbajardsilogic@0 63
lbajardsilogic@0 64 protected:
lbajardsilogic@0 65 WindowType m_type;
lbajardsilogic@0 66 size_t m_size;
lbajardsilogic@0 67 T *m_cache;
lbajardsilogic@0 68 T m_area;
lbajardsilogic@0 69
lbajardsilogic@0 70 void encache();
lbajardsilogic@0 71 void cosinewin(T *, T, T, T, T);
lbajardsilogic@0 72 };
lbajardsilogic@0 73
lbajardsilogic@0 74 template <typename T>
lbajardsilogic@0 75 void Window<T>::encache()
lbajardsilogic@0 76 {
lbajardsilogic@0 77 int n = int(m_size);
lbajardsilogic@0 78 T *mult = new T[n];
lbajardsilogic@0 79 int i;
lbajardsilogic@0 80 for (i = 0; i < n; ++i) mult[i] = 1.0;
lbajardsilogic@0 81
lbajardsilogic@0 82 switch (m_type) {
lbajardsilogic@0 83
lbajardsilogic@0 84 case RectangularWindow:
lbajardsilogic@0 85 for (i = 0; i < n; ++i) {
lbajardsilogic@0 86 mult[i] *= 0.5;
lbajardsilogic@0 87 }
lbajardsilogic@0 88 break;
lbajardsilogic@0 89
lbajardsilogic@0 90 case BartlettWindow:
lbajardsilogic@0 91 for (i = 0; i < n/2; ++i) {
lbajardsilogic@0 92 mult[i] *= (i / T(n/2));
lbajardsilogic@0 93 mult[i + n/2] *= (1.0 - (i / T(n/2)));
lbajardsilogic@0 94 }
lbajardsilogic@0 95 break;
lbajardsilogic@0 96
lbajardsilogic@0 97 case HammingWindow:
lbajardsilogic@0 98 cosinewin(mult, 0.54, 0.46, 0.0, 0.0);
lbajardsilogic@0 99 break;
lbajardsilogic@0 100
lbajardsilogic@0 101 case HanningWindow:
lbajardsilogic@0 102 cosinewin(mult, 0.50, 0.50, 0.0, 0.0);
lbajardsilogic@0 103 break;
lbajardsilogic@0 104
lbajardsilogic@0 105 case BlackmanWindow:
lbajardsilogic@0 106 cosinewin(mult, 0.42, 0.50, 0.08, 0.0);
lbajardsilogic@0 107 break;
lbajardsilogic@0 108
lbajardsilogic@0 109 case GaussianWindow:
lbajardsilogic@0 110 for (i = 0; i < n; ++i) {
lbajardsilogic@0 111 mult[i] *= pow(2, - pow((i - (n-1)/2.0) / ((n-1)/2.0 / 3), 2));
lbajardsilogic@0 112 }
lbajardsilogic@0 113 break;
lbajardsilogic@0 114
lbajardsilogic@0 115 case ParzenWindow:
lbajardsilogic@0 116 {
lbajardsilogic@0 117 int N = n-1;
lbajardsilogic@0 118 for (i = 0; i < N/4; ++i) {
lbajardsilogic@0 119 T m = 2 * pow(1.0 - (T(N)/2 - i) / (T(N)/2), 3);
lbajardsilogic@0 120 mult[i] *= m;
lbajardsilogic@0 121 mult[N-i] *= m;
lbajardsilogic@0 122 }
lbajardsilogic@0 123 for (i = N/4; i <= N/2; ++i) {
lbajardsilogic@0 124 int wn = i - N/2;
lbajardsilogic@0 125 T m = 1.0 - 6 * pow(wn / (T(N)/2), 2) * (1.0 - abs(wn) / (T(N)/2));
lbajardsilogic@0 126 mult[i] *= m;
lbajardsilogic@0 127 mult[N-i] *= m;
lbajardsilogic@0 128 }
lbajardsilogic@0 129 break;
lbajardsilogic@0 130 }
lbajardsilogic@0 131
lbajardsilogic@0 132 case NuttallWindow:
lbajardsilogic@0 133 cosinewin(mult, 0.3635819, 0.4891775, 0.1365995, 0.0106411);
lbajardsilogic@0 134 break;
lbajardsilogic@0 135
lbajardsilogic@0 136 case BlackmanHarrisWindow:
lbajardsilogic@0 137 cosinewin(mult, 0.35875, 0.48829, 0.14128, 0.01168);
lbajardsilogic@0 138 break;
lbajardsilogic@0 139 }
lbajardsilogic@0 140
lbajardsilogic@0 141 m_cache = mult;
lbajardsilogic@0 142
lbajardsilogic@0 143 m_area = 0;
lbajardsilogic@0 144 for (int i = 0; i < n; ++i) {
lbajardsilogic@0 145 m_area += m_cache[i];
lbajardsilogic@0 146 }
lbajardsilogic@0 147 m_area /= n;
lbajardsilogic@0 148 }
lbajardsilogic@0 149
lbajardsilogic@0 150 template <typename T>
lbajardsilogic@0 151 void Window<T>::cosinewin(T *mult, T a0, T a1, T a2, T a3)
lbajardsilogic@0 152 {
lbajardsilogic@0 153 int n = int(m_size);
lbajardsilogic@0 154 for (int i = 0; i < n; ++i) {
lbajardsilogic@0 155 mult[i] *= (a0
lbajardsilogic@0 156 - a1 * cos(2 * M_PI * i / n)
lbajardsilogic@0 157 + a2 * cos(4 * M_PI * i / n)
lbajardsilogic@0 158 - a3 * cos(6 * M_PI * i / n));
lbajardsilogic@0 159 }
lbajardsilogic@0 160 }
lbajardsilogic@0 161
lbajardsilogic@0 162 #endif