@@ -28,11 +28,11 @@ class WindowFunction {
28
28
virtual void begin (int samples) {
29
29
this ->samples_minus_1 = -1 .0f + samples;
30
30
this ->i_samples = samples;
31
- this ->i_half_samples = samples / 2 ;
31
+ this ->i_half_samples = samples / 2 - 1 ;
32
32
}
33
33
34
- inline float ratio (int idx) {
35
- return idx < i_half_samples ? factor (idx) : factor (i_samples-idx);
34
+ inline float factor (int idx) {
35
+ return idx < i_half_samples ? factor_internal (idx) : factor_internal (i_samples-idx- 1 );
36
36
}
37
37
38
38
inline int samples () { return i_samples; }
@@ -46,8 +46,12 @@ class WindowFunction {
46
46
const float sixPi = 18 .84955593f ;
47
47
48
48
// virtual function provide implementation in subclass
49
- virtual float factor (int idx) = 0;
49
+ virtual float factor_internal (int idx) = 0;
50
50
51
+ inline float ratio (int idx) {
52
+ float result = (static_cast <float >(idx)) / samples_minus_1;
53
+ return result>1 .0f ? 1 .0f : result;
54
+ }
51
55
52
56
};
53
57
@@ -63,26 +67,27 @@ class BufferedWindow : public WindowFunction {
63
67
BufferedWindow (BufferedWindow const &) = delete ;
64
68
BufferedWindow& operator =(BufferedWindow const &) = delete ;
65
69
66
- virtual void begin (int samples) {
70
+ virtual void begin (int samples) override {
67
71
// process only if there is a change
72
+ WindowFunction::begin (samples);
68
73
if (p_wf->samples () != samples) {
69
74
p_wf->begin (samples);
70
75
len = samples / 2 ;
71
76
buffer.resize (len);
72
77
for (int j = 0 ; j < len; j++) {
73
- buffer[j] = p_wf->ratio (j);
78
+ buffer[j] = p_wf->factor (j);
74
79
}
75
80
}
76
81
}
77
82
78
- inline float factor (int idx) {
79
- return idx < len ? buffer[idx] : buffer[i_samples - idx];
80
- }
81
-
82
83
protected:
83
84
WindowFunction* p_wf = nullptr ;
84
85
Vector<float > buffer{0 };
85
86
int len;
87
+
88
+ float factor_internal (int idx) override {
89
+ return idx < len ? buffer[idx] : buffer[i_samples - idx];
90
+ }
86
91
};
87
92
88
93
/* *
@@ -93,7 +98,7 @@ class BufferedWindow : public WindowFunction {
93
98
class Rectange : public WindowFunction {
94
99
public:
95
100
Rectange () = default ;
96
- float factor (int idx) { return 1 .0f ; }
101
+ float factor_internal (int idx) { return 1 .0f ; }
97
102
};
98
103
99
104
/* *
@@ -104,7 +109,7 @@ class Rectange : public WindowFunction {
104
109
class Hamming : public WindowFunction {
105
110
public:
106
111
Hamming () = default ;
107
- float factor (int idx) {
112
+ float factor_internal (int idx) {
108
113
return 0 .54f - (0 .46f * cos (twoPi * ratio (idx)));
109
114
}
110
115
};
@@ -117,7 +122,7 @@ class Hamming : public WindowFunction {
117
122
class Hann : public WindowFunction {
118
123
public:
119
124
Hann () = default ;
120
- float factor (int idx) {
125
+ float factor_internal (int idx) {
121
126
return 0 .54f * (1 .0f - cos (twoPi * ratio (idx)));
122
127
}
123
128
};
@@ -130,7 +135,7 @@ class Hann : public WindowFunction {
130
135
class Triangle : public WindowFunction {
131
136
public:
132
137
Triangle () = default ;
133
- float factor (int idx) {
138
+ float factor_internal (int idx) {
134
139
return 1 .0f - ((2 .0f * fabs ((idx - 1 ) -
135
140
(static_cast <float >(i_samples - 1 ) / 2 .0f ))) /
136
141
samples_minus_1);
@@ -146,7 +151,7 @@ class Triangle : public WindowFunction {
146
151
class Nuttall : public WindowFunction {
147
152
public:
148
153
Nuttall () = default ;
149
- float factor (int idx) {
154
+ float factor_internal (int idx) override {
150
155
float r = ratio (idx);
151
156
return 0 .355768f - (0 .487396f * (cos (twoPi * r))) +
152
157
(0 .144232f * (cos (fourPi * r))) - (0 .012604f * (cos (sixPi * r)));
@@ -162,7 +167,7 @@ class Nuttall : public WindowFunction {
162
167
class Blackman : public WindowFunction {
163
168
public:
164
169
Blackman () = default ;
165
- float factor (int idx) {
170
+ float factor_internal (int idx)override {
166
171
float r = ratio (idx);
167
172
return 0 .42323f - (0 .49755f * (cos (twoPi * r))) +
168
173
(0 .07922f * (cos (fourPi * r)));
@@ -177,7 +182,7 @@ class Blackman : public WindowFunction {
177
182
class BlackmanNuttall : public WindowFunction {
178
183
public:
179
184
BlackmanNuttall () = default ;
180
- float factor (int idx) {
185
+ float factor_internal (int idx) override {
181
186
float r = ratio (idx);
182
187
return 0 .3635819f - (0 .4891775f * (cos (twoPi * r))) +
183
188
(0 .1365995f * (cos (fourPi * r))) - (0 .0106411f * (cos (sixPi * r)));
@@ -192,7 +197,7 @@ class BlackmanNuttall : public WindowFunction {
192
197
class BlackmanHarris : public WindowFunction {
193
198
public:
194
199
BlackmanHarris () = default ;
195
- float factor (int idx) {
200
+ float factor_internal (int idx) override {
196
201
float r = ratio (idx);
197
202
return 0 .35875f - (0 .48829f * (cos (twoPi * r))) +
198
203
(0 .14128f * (cos (fourPi * r))) - (0 .01168f * (cos (sixPi * r)));
@@ -207,7 +212,7 @@ class BlackmanHarris : public WindowFunction {
207
212
class FlatTop : public WindowFunction {
208
213
public:
209
214
FlatTop () = default ;
210
- float factor (int idx) {
215
+ float factor_internal (int idx) override {
211
216
float r = ratio (idx);
212
217
return 0 .2810639f - (0 .5208972f * cos (twoPi * r)) +
213
218
(0 .1980399f * cos (fourPi * r));
@@ -222,7 +227,7 @@ class FlatTop : public WindowFunction {
222
227
class Welch : public WindowFunction {
223
228
public:
224
229
Welch () = default ;
225
- float factor (int idx) {
230
+ float factor_internal (int idx) override {
226
231
float tmp = (((idx - 1 ) - samples_minus_1 / 2 .0f ) / (samples_minus_1 / 2 .0f ));
227
232
return 1 .0f - (tmp*tmp);
228
233
}
0 commit comments