annotate base/Window.h @ 84:e5907ae6de17

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