annotate base/Window.h @ 321:f1e6be2de9a5

A threshold (delta) is added in the peak picking parameters structure (PPickParams). It is used as an offset when computing the smoothed detection function. A constructor for the structure PPickParams is also added to set the parameters to 0 when a structure instance is created. Hence programmes using the peak picking parameter structure and which do not set the delta parameter (e.g. QM Vamp note onset detector) won't be affected by the modifications. Functions modified: - dsp/onsets/PeakPicking.cpp - dsp/onsets/PeakPicking.h - dsp/signalconditioning/DFProcess.cpp - dsp/signalconditioning/DFProcess.h
author mathieub <mathieu.barthet@eecs.qmul.ac.uk>
date Mon, 20 Jun 2011 19:01:48 +0100
parents d5014ab8b0e5
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