Mercurial > hg > svcore
comparison base/Window.h @ 141:4f26f623a8bc
* Finish preferences dialog (as far as it's going at the moment) and connect it up
* Fix Parzen window shape (was triangular!)
* Various fixes to spectrogram draw coordinates in smoothing mode etc
* Draw C keys in grey on the piano
author | Chris Cannam |
---|---|
date | Fri, 21 Jul 2006 16:03:42 +0000 |
parents | a35098a9c814 |
children | 0ba66b160a02 |
comparison
equal
deleted
inserted
replaced
140:a35098a9c814 | 141:4f26f623a8bc |
---|---|
67 }; | 67 }; |
68 | 68 |
69 template <typename T> | 69 template <typename T> |
70 void Window<T>::encache() | 70 void Window<T>::encache() |
71 { | 71 { |
72 size_t n = m_size; | 72 int n = int(m_size); |
73 T *mult = new T[n]; | 73 T *mult = new T[n]; |
74 size_t i; | 74 int i; |
75 for (i = 0; i < n; ++i) mult[i] = 1.0; | 75 for (i = 0; i < n; ++i) mult[i] = 1.0; |
76 | 76 |
77 switch (m_type) { | 77 switch (m_type) { |
78 | 78 |
79 case RectangularWindow: | 79 case RectangularWindow: |
80 for (i = 0; i < n; ++i) { | 80 for (i = 0; i < n; ++i) { |
81 mult[i] = mult[i] * 0.5; | 81 mult[i] *= 0.5; |
82 } | 82 } |
83 break; | 83 break; |
84 | 84 |
85 case BartlettWindow: | 85 case BartlettWindow: |
86 for (i = 0; i < n/2; ++i) { | 86 for (i = 0; i < n/2; ++i) { |
87 mult[i] = mult[i] * (i / T(n/2)); | 87 mult[i] *= (i / T(n/2)); |
88 mult[i + n/2] = mult[i + n/2] * (1.0 - (i / T(n/2))); | 88 mult[i + n/2] *= (1.0 - (i / T(n/2))); |
89 } | 89 } |
90 break; | 90 break; |
91 | 91 |
92 case HammingWindow: | 92 case HammingWindow: |
93 for (i = 0; i < n; ++i) { | 93 for (i = 0; i < n; ++i) { |
94 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n)); | 94 mult[i] *= (0.54 - 0.46 * cos(2 * M_PI * i / n)); |
95 } | 95 } |
96 break; | 96 break; |
97 | 97 |
98 case HanningWindow: | 98 case HanningWindow: |
99 for (i = 0; i < n; ++i) { | 99 for (i = 0; i < n; ++i) { |
100 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n)); | 100 mult[i] *= (0.50 - 0.50 * cos(2 * M_PI * i / n)); |
101 } | 101 } |
102 break; | 102 break; |
103 | 103 |
104 case BlackmanWindow: | 104 case BlackmanWindow: |
105 for (i = 0; i < n; ++i) { | 105 for (i = 0; i < n; ++i) { |
106 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n) | 106 mult[i] *= (0.42 - 0.50 * cos(2 * M_PI * i / n) |
107 + 0.08 * cos(4 * M_PI * i / n)); | 107 + 0.08 * cos(4 * M_PI * i / n)); |
108 } | 108 } |
109 break; | 109 break; |
110 | 110 |
111 case GaussianWindow: | 111 case GaussianWindow: |
112 for (i = 0; i < n; ++i) { | 112 for (i = 0; i < n; ++i) { |
113 mult[i] = mult[i] * exp(-(pow(i - (n-1)/2.0, 2) / | 113 mult[i] *= exp(-(pow(i - (n-1)/2.0, 2) / |
114 (2 * pow(0.25 * n, 2)))); // sd = 0.25 | 114 (2 * pow(0.25 * n, 2)))); // sd = 0.25 |
115 } | 115 } |
116 break; | 116 break; |
117 | 117 |
118 case ParzenWindow: | 118 case ParzenWindow: |
119 for (i = 0; i < n; ++i) { | 119 { |
120 mult[i] = mult[i] * (1.0 - fabs((T(2*i) - n) / T(n + 1))); | 120 int N = n-1; |
121 } | 121 for (i = 0; i < N/4; ++i) { |
122 T m = 2 * pow(1.0 - (T(N)/2 - i) / (T(N)/2), 3); | |
123 mult[i] *= m; | |
124 mult[N-i] *= m; | |
125 } | |
126 for (i = N/4; i <= N/2; ++i) { | |
127 int wn = i - N/2; | |
128 T m = 1.0 - 6 * pow(wn / (T(N)/2), 2) * (1.0 - abs(wn) / (T(N)/2)); | |
129 mult[i] *= m; | |
130 mult[N-i] *= m; | |
131 } | |
132 } | |
122 break; | 133 break; |
123 } | 134 } |
124 | 135 |
125 m_cache = mult; | 136 m_cache = mult; |
126 } | 137 } |