From 472b895d5b23ab8440c351326471355bbf8927ae Mon Sep 17 00:00:00 2001 From: cho45 Date: Wed, 11 Sep 2019 22:35:44 +0900 Subject: [PATCH] windowing --- main.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 5d0a327..8f88c27 100644 --- a/main.c +++ b/main.c @@ -108,6 +108,28 @@ toggle_sweep(void) sweep_enabled = !sweep_enabled; } +float bessel0(float x) { + const float eps = 0.0001; + + float ret = 0; + float term = 1; + float m = 0; + + while (term > eps * ret) { + ret += term; + ++m; + term *= (x*x) / (4*m*m); + } + + return ret; +} + +float kaiser_window(float k, float n, float beta) { + if (beta == 0.0) return 1.0; + float r = (2 * k) / (n - 1) - 1; + return bessel0(beta * sqrt(1 - r * r)) / bessel0(beta); +} + static void transform_domain(void) @@ -116,9 +138,43 @@ transform_domain(void) // use spi_buffer as temporary buffer // and calculate ifft for time domain float* tmp = (float*)spi_buffer; + + uint8_t window_size, offset; + switch (domain_mode & TDR_FUNC) { + case TDR_FUNC_BANDPASS: + offset = 0; + window_size = 101; + break; + case TDR_FUNC_LOWPASS_IMPULSE: + case TDR_FUNC_LOWPASS_STEP: + offset = 101; + window_size = 202; + break; + } + + float beta = 0.0; + switch (domain_mode & TDR_WINDOW) { + case TDR_WINDOW_MINIMUM: + beta = 0.0; // this is rectangular + break; + case TDR_WINDOW_NORMAL: + beta = 6.0; + break; + case TDR_WINDOW_MAXIMUM: + beta = 13; + break; + } + for (int ch = 0; ch < 2; ch++) { memcpy(tmp, measured[ch], sizeof(measured[0])); - for (int i = 101+1; i < 128; i++) { + if (beta != 0.0) { + for (int i = 0; i < 101; i++) { + float w = kaiser_window(i+offset, window_size, beta); + tmp[i*2+0] *= w; + tmp[i*2+1] *= w; + } + } + for (int i = 101; i < 128; i++) { tmp[i*2+0] = 0.0; tmp[i*2+1] = 0.0; }