From d7497540e2bc9c4466dba93a7843c6c0e9b0a7b2 Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Thu, 22 Sep 2022 23:58:41 +0200 Subject: [PATCH] demod_mod: decimate/lowpass -Ofast speed-up --- demod/mod/demod_mod.c | 18 +++++++++++++++++- demod/multi/demod_base.c | 18 +++++++++++++++++- imet/imet4iq.c | 18 +++++++++++++++++- mk2a/mk2a1680mod.c | 18 +++++++++++++++++- scan/dft_detect.c | 18 +++++++++++++++++- 5 files changed, 85 insertions(+), 5 deletions(-) diff --git a/demod/mod/demod_mod.c b/demod/mod/demod_mod.c index e62e41b..113a82d 100644 --- a/demod/mod/demod_mod.c +++ b/demod/mod/demod_mod.c @@ -625,7 +625,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { +static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; ui32_t s = sample % taps; double complex w = 0; @@ -635,6 +635,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; // -Ofast + int n; + int s = sample % taps; // lpIQ + int S1 = s+1; + int S1N = S1-taps; + int n0 = taps-1-s; + for (n = 0; n < n0; n++) { + w += buffer[S1+n]*ws[n]; + } + for (n = n0; n < taps; n++) { + w += buffer[S1N+n]*ws[n]; + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} static float re_lowpass0(float buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; diff --git a/demod/multi/demod_base.c b/demod/multi/demod_base.c index 4103a94..b45fc98 100644 --- a/demod/multi/demod_base.c +++ b/demod/multi/demod_base.c @@ -699,7 +699,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { +static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; ui32_t s = sample % taps; double complex w = 0; @@ -709,6 +709,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; // -Ofast + int n; + int s = sample % taps; // lpIQ + int S1 = s+1; + int S1N = S1-taps; + int n0 = taps-1-s; + for (n = 0; n < n0; n++) { + w += buffer[S1+n]*ws[n]; + } + for (n = n0; n < taps; n++) { + w += buffer[S1N+n]*ws[n]; + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} static float re_lowpass0(float buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; diff --git a/imet/imet4iq.c b/imet/imet4iq.c index 1afc74d..f678733 100644 --- a/imet/imet4iq.c +++ b/imet/imet4iq.c @@ -395,7 +395,7 @@ static int lowpass_init(float f, int taps, float **pws) { } -static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { +static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; ui32_t s = sample % taps; double complex w = 0; @@ -405,6 +405,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; // -Ofast + int n; + int s = sample % taps; // lpIQ + int S1 = s+1; + int S1N = S1-taps; + int n0 = taps-1-s; + for (n = 0; n < n0; n++) { + w += buffer[S1+n]*ws[n]; + } + for (n = n0; n < taps; n++) { + w += buffer[S1N+n]*ws[n]; + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; diff --git a/mk2a/mk2a1680mod.c b/mk2a/mk2a1680mod.c index cdf89cc..b020d25 100644 --- a/mk2a/mk2a1680mod.c +++ b/mk2a/mk2a1680mod.c @@ -733,7 +733,7 @@ static int lowpass_init(float f, int taps, float **pws) { } -static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { +static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; ui32_t s = sample % taps; double complex w = 0; @@ -743,6 +743,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; // -Ofast + int n; + int s = sample % taps; // lpIQ + int S1 = s+1; + int S1N = S1-taps; + int n0 = taps-1-s; + for (n = 0; n < n0; n++) { + w += buffer[S1+n]*ws[n]; + } + for (n = n0; n < taps; n++) { + w += buffer[S1N+n]*ws[n]; + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; diff --git a/scan/dft_detect.c b/scan/dft_detect.c index b01e33d..2cfd032 100644 --- a/scan/dft_detect.c +++ b/scan/dft_detect.c @@ -650,7 +650,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { +static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { ui32_t n; ui32_t s = sample % taps; double complex w = 0; @@ -660,6 +660,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; // -Ofast + int n; + int s = sample % taps; // lpIQ + int S1 = s+1; + int S1N = S1-taps; + int n0 = taps-1-s; + for (n = 0; n < n0; n++) { + w += buffer[S1+n]*ws[n]; + } + for (n = n0; n < taps; n++) { + w += buffer[S1N+n]*ws[n]; + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} static int f32buf_sample(FILE *fp, int inv) {