comparison base/Window.h @ 505:930b5b0f707d

Merge branch 'codestyle-and-tidy'
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 05 Jun 2019 12:55:15 +0100
parents 3f649fbb1172
children
comparison
equal deleted inserted replaced
471:e3335cb213da 505:930b5b0f707d
10 published by the Free Software Foundation; either version 2 of the 10 published by the Free Software Foundation; either version 2 of the
11 License, or (at your option) any later version. See the file 11 License, or (at your option) any later version. See the file
12 COPYING included with this distribution for more information. 12 COPYING included with this distribution for more information.
13 */ 13 */
14 14
15 #ifndef _WINDOW_H_ 15 #ifndef QM_DSP_WINDOW_H
16 #define _WINDOW_H_ 16 #define QM_DSP_WINDOW_H
17 17
18 #include <cmath> 18 #include <cmath>
19 #include <iostream> 19 #include <iostream>
20 #include <map> 20 #include <map>
21 #include <vector> 21 #include <vector>
48 * symmetrical window of size N+1 with the final element missing.) 48 * symmetrical window of size N+1 with the final element missing.)
49 */ 49 */
50 Window(WindowType type, int size) : m_type(type), m_size(size) { encache(); } 50 Window(WindowType type, int size) : m_type(type), m_size(size) { encache(); }
51 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); } 51 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); }
52 Window &operator=(const Window &w) { 52 Window &operator=(const Window &w) {
53 if (&w == this) return *this; 53 if (&w == this) return *this;
54 m_type = w.m_type; 54 m_type = w.m_type;
55 m_size = w.m_size; 55 m_size = w.m_size;
56 encache(); 56 encache();
57 return *this; 57 return *this;
58 } 58 }
59 virtual ~Window() { delete[] m_cache; } 59 virtual ~Window() { delete[] m_cache; }
60 60
61 void cut(T *src) const { cut(src, src); } 61 void cut(T *src) const { cut(src, src); }
62 void cut(const T *src, T *dst) const { 62 void cut(const T *src, T *dst) const {
63 for (int i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i]; 63 for (int i = 0; i < m_size; ++i) {
64 dst[i] = src[i] * m_cache[i];
65 }
64 } 66 }
65 67
66 WindowType getType() const { return m_type; } 68 WindowType getType() const { return m_type; }
67 int getSize() const { return m_size; } 69 int getSize() const { return m_size; }
68 70
89 T *mult = new T[n]; 91 T *mult = new T[n];
90 int i; 92 int i;
91 for (i = 0; i < n; ++i) mult[i] = 1.0; 93 for (i = 0; i < n; ++i) mult[i] = 1.0;
92 94
93 switch (m_type) { 95 switch (m_type) {
94 96
95 case RectangularWindow: 97 case RectangularWindow:
96 for (i = 0; i < n; ++i) { 98 for (i = 0; i < n; ++i) {
97 mult[i] = mult[i] * 0.5; 99 mult[i] = mult[i] * 0.5;
98 } 100 }
99 break; 101 break;
100 102
101 case BartlettWindow: 103 case BartlettWindow:
102 if (n == 2) { 104 if (n == 2) {
103 mult[0] = mult[1] = 0; // "matlab compatible" 105 mult[0] = mult[1] = 0; // "matlab compatible"
104 } else if (n == 3) { 106 } else if (n == 3) {
105 mult[0] = 0; 107 mult[0] = 0;
107 } else if (n > 3) { 109 } else if (n > 3) {
108 for (i = 0; i < n/2; ++i) { 110 for (i = 0; i < n/2; ++i) {
109 mult[i] = mult[i] * (i / T(n/2)); 111 mult[i] = mult[i] * (i / T(n/2));
110 mult[i + n - n/2] = mult[i + n - n/2] * (1.0 - (i / T(n/2))); 112 mult[i + n - n/2] = mult[i + n - n/2] * (1.0 - (i / T(n/2)));
111 } 113 }
112 } 114 }
113 break; 115 break;
114 116
115 case HammingWindow: 117 case HammingWindow:
116 if (n > 1) { 118 if (n > 1) {
117 for (i = 0; i < n; ++i) { 119 for (i = 0; i < n; ++i) {
118 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n)); 120 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n));
119 } 121 }
120 } 122 }
121 break; 123 break;
122 124
123 case HanningWindow: 125 case HanningWindow:
124 if (n > 1) { 126 if (n > 1) {
125 for (i = 0; i < n; ++i) { 127 for (i = 0; i < n; ++i) {
126 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n)); 128 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n));
127 } 129 }
128 } 130 }
129 break; 131 break;
130 132
131 case BlackmanWindow: 133 case BlackmanWindow:
132 if (n > 1) { 134 if (n > 1) {
133 for (i = 0; i < n; ++i) { 135 for (i = 0; i < n; ++i) {
134 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n) 136 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n)
135 + 0.08 * cos(4 * M_PI * i / n)); 137 + 0.08 * cos(4 * M_PI * i / n));
136 } 138 }
137 } 139 }
138 break; 140 break;
139 141
140 case BlackmanHarrisWindow: 142 case BlackmanHarrisWindow:
141 if (n > 1) { 143 if (n > 1) {
142 for (i = 0; i < n; ++i) { 144 for (i = 0; i < n; ++i) {
143 mult[i] = mult[i] * (0.35875 145 mult[i] = mult[i] * (0.35875
144 - 0.48829 * cos(2 * M_PI * i / n) 146 - 0.48829 * cos(2 * M_PI * i / n)
145 + 0.14128 * cos(4 * M_PI * i / n) 147 + 0.14128 * cos(4 * M_PI * i / n)
146 - 0.01168 * cos(6 * M_PI * i / n)); 148 - 0.01168 * cos(6 * M_PI * i / n));
147 } 149 }
148 } 150 }
149 break; 151 break;
150 } 152 }
151 153
152 m_cache = mult; 154 m_cache = mult;
153 } 155 }
154 156
155 #endif 157 #endif