annotate base/Window.h @ 483:fdaa63607c15

Untabify, indent, tidy
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 31 May 2019 11:54:32 +0100
parents a73d94ee8072
children 701233f8ed41
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@382 21 #include <vector>
c@225 22
c@225 23 enum WindowType {
c@225 24 RectangularWindow,
c@225 25 BartlettWindow,
c@225 26 HammingWindow,
c@225 27 HanningWindow,
c@225 28 BlackmanWindow,
c@382 29 BlackmanHarrisWindow,
c@334 30
c@334 31 FirstWindow = RectangularWindow,
c@382 32 LastWindow = BlackmanHarrisWindow
c@225 33 };
c@225 34
c@377 35 /**
c@377 36 * Various shaped windows for sample frame conditioning, including
c@377 37 * cosine windows (Hann etc) and triangular and rectangular windows.
c@377 38 */
c@225 39 template <typename T>
c@225 40 class Window
c@225 41 {
c@225 42 public:
c@225 43 /**
c@334 44 * Construct a windower of the given type and size.
c@334 45 *
c@334 46 * Note that the cosine windows are periodic by design, rather
c@334 47 * than symmetrical. (A window of size N is equivalent to a
c@334 48 * symmetrical window of size N+1 with the final element missing.)
c@225 49 */
c@382 50 Window(WindowType type, int size) : m_type(type), m_size(size) { encache(); }
c@225 51 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); }
c@225 52 Window &operator=(const Window &w) {
cannam@483 53 if (&w == this) return *this;
cannam@483 54 m_type = w.m_type;
cannam@483 55 m_size = w.m_size;
cannam@483 56 encache();
cannam@483 57 return *this;
c@225 58 }
c@251 59 virtual ~Window() { delete[] m_cache; }
c@225 60
c@225 61 void cut(T *src) const { cut(src, src); }
c@280 62 void cut(const T *src, T *dst) const {
cannam@483 63 for (int i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i];
c@225 64 }
c@225 65
c@225 66 WindowType getType() const { return m_type; }
c@382 67 int getSize() const { return m_size; }
c@382 68
c@382 69 std::vector<T> getWindowData() const {
c@382 70 std::vector<T> d;
c@382 71 for (int i = 0; i < m_size; ++i) {
c@382 72 d.push_back(m_cache[i]);
c@382 73 }
c@382 74 return d;
c@382 75 }
c@225 76
c@225 77 protected:
c@225 78 WindowType m_type;
c@382 79 int m_size;
c@225 80 T *m_cache;
c@225 81
c@225 82 void encache();
c@225 83 };
c@225 84
c@225 85 template <typename T>
c@225 86 void Window<T>::encache()
c@225 87 {
c@382 88 int n = m_size;
c@225 89 T *mult = new T[n];
c@382 90 int i;
c@225 91 for (i = 0; i < n; ++i) mult[i] = 1.0;
c@225 92
c@225 93 switch (m_type) {
cannam@483 94
c@225 95 case RectangularWindow:
c@334 96 for (i = 0; i < n; ++i) {
c@334 97 mult[i] = mult[i] * 0.5;
cannam@483 98 }
cannam@483 99 break;
cannam@483 100
c@225 101 case BartlettWindow:
c@334 102 if (n == 2) {
c@334 103 mult[0] = mult[1] = 0; // "matlab compatible"
c@334 104 } else if (n == 3) {
c@334 105 mult[0] = 0;
c@334 106 mult[1] = mult[2] = 2./3.;
c@334 107 } else if (n > 3) {
c@334 108 for (i = 0; i < n/2; ++i) {
c@334 109 mult[i] = mult[i] * (i / T(n/2));
c@334 110 mult[i + n - n/2] = mult[i + n - n/2] * (1.0 - (i / T(n/2)));
c@334 111 }
cannam@483 112 }
cannam@483 113 break;
cannam@483 114
c@225 115 case HammingWindow:
c@334 116 if (n > 1) {
c@334 117 for (i = 0; i < n; ++i) {
c@334 118 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n));
c@334 119 }
cannam@483 120 }
cannam@483 121 break;
cannam@483 122
c@225 123 case HanningWindow:
c@334 124 if (n > 1) {
c@334 125 for (i = 0; i < n; ++i) {
c@334 126 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n));
c@334 127 }
cannam@483 128 }
cannam@483 129 break;
cannam@483 130
c@225 131 case BlackmanWindow:
c@334 132 if (n > 1) {
c@334 133 for (i = 0; i < n; ++i) {
c@334 134 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n)
c@334 135 + 0.08 * cos(4 * M_PI * i / n));
c@334 136 }
cannam@483 137 }
cannam@483 138 break;
cannam@483 139
c@382 140 case BlackmanHarrisWindow:
c@382 141 if (n > 1) {
c@382 142 for (i = 0; i < n; ++i) {
c@382 143 mult[i] = mult[i] * (0.35875
c@382 144 - 0.48829 * cos(2 * M_PI * i / n)
c@382 145 + 0.14128 * cos(4 * M_PI * i / n)
c@382 146 - 0.01168 * cos(6 * M_PI * i / n));
c@382 147 }
cannam@483 148 }
cannam@483 149 break;
c@225 150 }
cannam@483 151
c@225 152 m_cache = mult;
c@225 153 }
c@225 154
c@225 155 #endif