Skip to content

Commit d02db79

Browse files
authored
Merge pull request #144 from czietz/window_loss
Compensate IFFT window / zero-padding loss in TD
2 parents bc1b57c + 4d64ef6 commit d02db79

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

main.c

+30-16
Original file line numberDiff line numberDiff line change
@@ -198,40 +198,54 @@ transform_domain(void)
198198
// and calculate ifft for time domain
199199
float* tmp = (float*)spi_buffer;
200200

201+
// correct IFFT window and zero-padding loss
202+
// assuming a 2*POINT_COUNT window
203+
float wincorr = 1.0f;
204+
float beta = 0.0;
205+
switch (domain_mode & TD_WINDOW) {
206+
case TD_WINDOW_MINIMUM:
207+
beta = 0.0; // this is rectangular
208+
// loss by zero-padding 202 to 256 points
209+
wincorr = (float)FFT_SIZE / (float)(2*POINTS_COUNT);
210+
break;
211+
case TD_WINDOW_NORMAL:
212+
beta = 6.0;
213+
// additional window loss: 1/mean(kaiser(202,6)) = 2.01
214+
wincorr = (float)FFT_SIZE / (float)(2*POINTS_COUNT) * 2.01f;
215+
break;
216+
case TD_WINDOW_MAXIMUM:
217+
beta = 13;
218+
// additional window loss: 1/mean(kaiser(202,13)) = 2.92
219+
wincorr = (float)FFT_SIZE / (float)(2*POINTS_COUNT) * 2.92f;
220+
break;
221+
}
222+
201223
uint8_t window_size = POINTS_COUNT, offset = 0;
202224
uint8_t is_lowpass = FALSE;
203225
switch (domain_mode & TD_FUNC) {
204226
case TD_FUNC_BANDPASS:
205227
offset = 0;
206228
window_size = POINTS_COUNT;
229+
// window size is half the size as assumed above => twice the IFFT loss
230+
wincorr *= 2.0f;
207231
break;
208-
case TD_FUNC_LOWPASS_IMPULSE:
209232
case TD_FUNC_LOWPASS_STEP:
233+
// no IFFT losses need to be considered to calculate the step response
234+
wincorr = 1.0f;
235+
// fall-through
236+
case TD_FUNC_LOWPASS_IMPULSE:
210237
is_lowpass = TRUE;
211238
offset = POINTS_COUNT;
212239
window_size = POINTS_COUNT * 2;
213240
break;
214241
}
215242

216-
float beta = 0.0;
217-
switch (domain_mode & TD_WINDOW) {
218-
case TD_WINDOW_MINIMUM:
219-
beta = 0.0; // this is rectangular
220-
break;
221-
case TD_WINDOW_NORMAL:
222-
beta = 6.0;
223-
break;
224-
case TD_WINDOW_MAXIMUM:
225-
beta = 13;
226-
break;
227-
}
228-
229243
for (int ch = 0; ch < 2; ch++) {
230244
memcpy(tmp, measured[ch], sizeof(measured[0]));
231245
for (int i = 0; i < POINTS_COUNT; i++) {
232246
float w = kaiser_window(i + offset, window_size, beta);
233-
tmp[i * 2 + 0] *= w;
234-
tmp[i * 2 + 1] *= w;
247+
tmp[i * 2 + 0] *= w * wincorr;
248+
tmp[i * 2 + 1] *= w * wincorr;
235249
}
236250
for (int i = POINTS_COUNT; i < FFT_SIZE; i++) {
237251
tmp[i * 2 + 0] = 0.0;

0 commit comments

Comments
 (0)