@@ -198,40 +198,54 @@ transform_domain(void)
198
198
// and calculate ifft for time domain
199
199
float * tmp = (float * )spi_buffer ;
200
200
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
+
201
223
uint8_t window_size = POINTS_COUNT , offset = 0 ;
202
224
uint8_t is_lowpass = FALSE;
203
225
switch (domain_mode & TD_FUNC ) {
204
226
case TD_FUNC_BANDPASS :
205
227
offset = 0 ;
206
228
window_size = POINTS_COUNT ;
229
+ // window size is half the size as assumed above => twice the IFFT loss
230
+ wincorr *= 2.0f ;
207
231
break ;
208
- case TD_FUNC_LOWPASS_IMPULSE :
209
232
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 :
210
237
is_lowpass = TRUE;
211
238
offset = POINTS_COUNT ;
212
239
window_size = POINTS_COUNT * 2 ;
213
240
break ;
214
241
}
215
242
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
-
229
243
for (int ch = 0 ; ch < 2 ; ch ++ ) {
230
244
memcpy (tmp , measured [ch ], sizeof (measured [0 ]));
231
245
for (int i = 0 ; i < POINTS_COUNT ; i ++ ) {
232
246
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 ;
235
249
}
236
250
for (int i = POINTS_COUNT ; i < FFT_SIZE ; i ++ ) {
237
251
tmp [i * 2 + 0 ] = 0.0 ;
0 commit comments