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 }