annotate base/Window.h @ 55:7fe29d8a7eaf

* Various fixes related to the bar estimator code
author cannam
date Tue, 10 Feb 2009 16:37:11 +0000
parents d096a79fa772
children e5907ae6de17
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.
cannam@0 7 All rights reserved.
cannam@0 8 */
cannam@0 9
cannam@0 10 #ifndef _WINDOW_H_
cannam@0 11 #define _WINDOW_H_
cannam@0 12
cannam@0 13 #include <cmath>
cannam@0 14 #include <iostream>
cannam@0 15 #include <map>
cannam@0 16
cannam@0 17 enum WindowType {
cannam@0 18 RectangularWindow,
cannam@0 19 BartlettWindow,
cannam@0 20 HammingWindow,
cannam@0 21 HanningWindow,
cannam@0 22 BlackmanWindow,
cannam@0 23 GaussianWindow,
cannam@0 24 ParzenWindow
cannam@0 25 };
cannam@0 26
cannam@0 27 template <typename T>
cannam@0 28 class Window
cannam@0 29 {
cannam@0 30 public:
cannam@0 31 /**
cannam@0 32 * Construct a windower of the given type.
cannam@0 33 */
cannam@0 34 Window(WindowType type, size_t size) : m_type(type), m_size(size) { encache(); }
cannam@0 35 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); }
cannam@0 36 Window &operator=(const Window &w) {
cannam@0 37 if (&w == this) return *this;
cannam@0 38 m_type = w.m_type;
cannam@0 39 m_size = w.m_size;
cannam@0 40 encache();
cannam@0 41 return *this;
cannam@0 42 }
cannam@26 43 virtual ~Window() { delete[] m_cache; }
cannam@0 44
cannam@0 45 void cut(T *src) const { cut(src, src); }
cannam@55 46 void cut(const T *src, T *dst) const {
cannam@0 47 for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i];
cannam@0 48 }
cannam@0 49
cannam@0 50 WindowType getType() const { return m_type; }
cannam@0 51 size_t getSize() const { return m_size; }
cannam@0 52
cannam@0 53 protected:
cannam@0 54 WindowType m_type;
cannam@0 55 size_t m_size;
cannam@0 56 T *m_cache;
cannam@0 57
cannam@0 58 void encache();
cannam@0 59 };
cannam@0 60
cannam@0 61 template <typename T>
cannam@0 62 void Window<T>::encache()
cannam@0 63 {
cannam@0 64 size_t n = m_size;
cannam@0 65 T *mult = new T[n];
cannam@0 66 size_t i;
cannam@0 67 for (i = 0; i < n; ++i) mult[i] = 1.0;
cannam@0 68
cannam@0 69 switch (m_type) {
cannam@0 70
cannam@0 71 case RectangularWindow:
cannam@0 72 for (i = 0; i < n; ++i) {
cannam@0 73 mult[i] = mult[i] * 0.5;
cannam@0 74 }
cannam@0 75 break;
cannam@0 76
cannam@0 77 case BartlettWindow:
cannam@0 78 for (i = 0; i < n/2; ++i) {
cannam@0 79 mult[i] = mult[i] * (i / T(n/2));
cannam@0 80 mult[i + n/2] = mult[i + n/2] * (1.0 - (i / T(n/2)));
cannam@0 81 }
cannam@0 82 break;
cannam@0 83
cannam@0 84 case HammingWindow:
cannam@0 85 for (i = 0; i < n; ++i) {
cannam@0 86 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n));
cannam@0 87 }
cannam@0 88 break;
cannam@0 89
cannam@0 90 case HanningWindow:
cannam@0 91 for (i = 0; i < n; ++i) {
cannam@0 92 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n));
cannam@0 93 }
cannam@0 94 break;
cannam@0 95
cannam@0 96 case BlackmanWindow:
cannam@0 97 for (i = 0; i < n; ++i) {
cannam@0 98 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n)
cannam@0 99 + 0.08 * cos(4 * M_PI * i / n));
cannam@0 100 }
cannam@0 101 break;
cannam@0 102
cannam@0 103 case GaussianWindow:
cannam@0 104 for (i = 0; i < n; ++i) {
cannam@0 105 mult[i] = mult[i] * exp((-1.0 / (n*n)) * ((T(2*i) - n) *
cannam@0 106 (T(2*i) - n)));
cannam@0 107 }
cannam@0 108 break;
cannam@0 109
cannam@0 110 case ParzenWindow:
cannam@0 111 for (i = 0; i < n; ++i) {
cannam@0 112 mult[i] = mult[i] * (1.0 - fabs((T(2*i) - n) / T(n + 1)));
cannam@0 113 }
cannam@0 114 break;
cannam@0 115 }
cannam@0 116
cannam@0 117 m_cache = mult;
cannam@0 118 }
cannam@0 119
cannam@0 120 #endif