diff --git a/demod/iq_svcl/iq_base.c b/demod/iq_svcl/iq_base.c index 9b7ffbc..b8161a3 100644 --- a/demod/iq_svcl/iq_base.c +++ b/demod/iq_svcl/iq_base.c @@ -305,7 +305,7 @@ static int f32_cblk(dsp_t *dsp) { int BL = dsp->decM * blk_sz; int len = BL; float x, y; - ui8_t s[4*2*BL]; //uin8,int16,flot32 + ui8_t s[4*2*BL]; //uin8,int16,float32 ui8_t *u = (ui8_t*)s; short *b = (short*)s; float *f = (float*)s; @@ -488,20 +488,21 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -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; +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; + int n; // -Ofast + int S = taps-1 - (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } - return (float complex)w; + return 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 +static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; int n; - int s = sample % taps; // lpIQ + int s = sample % taps; int S1 = s+1; int S1N = S1-taps; int n0 = taps-1-s; diff --git a/demod/iq_svcl/iq_dec.c b/demod/iq_svcl/iq_dec.c index a0cdfd8..09b9f2c 100644 --- a/demod/iq_svcl/iq_dec.c +++ b/demod/iq_svcl/iq_dec.c @@ -336,7 +336,7 @@ static int f32read_cblock(dsp_t *dsp) { int n; int len; float x, y; - ui8_t s[4*2*dsp->decM]; //uin8,int16,flot32 + ui8_t s[4*2*dsp->decM]; //uin8,int16,float32 ui8_t *u = (ui8_t*)s; short *b = (short*)s; float *f = (float*)s; @@ -461,20 +461,21 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -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; +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; + int n; // -Ofast + int S = taps-1 - (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } - return (float complex)w; + return 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 +static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; int n; - int s = sample % taps; // lpIQ + int s = sample % taps; int S1 = s+1; int S1N = S1-taps; int n0 = taps-1-s; diff --git a/demod/iq_svcl/iq_fm.c b/demod/iq_svcl/iq_fm.c index 16b2a28..7185dc4 100644 --- a/demod/iq_svcl/iq_fm.c +++ b/demod/iq_svcl/iq_fm.c @@ -273,9 +273,18 @@ static int lowpass_init(float f, int taps, float **pws) { return taps; } +static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + ui32_t n; + double complex w = 0; + for (n = 0; n < taps; n++) { + w += buffer[(sample+n+1)%taps]*ws[taps-1-n]; + } + return (float complex)w; +} +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - float complex w = 0; // -Ofast - int n; + float complex w = 0; + int n; // -Ofast int S = taps-1 - (sample % taps); for (n = 0; n < taps; n++) { w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] diff --git a/demod/mod/demod_mod.c b/demod/mod/demod_mod.c index 197414f..0b1dc0c 100644 --- a/demod/mod/demod_mod.c +++ b/demod/mod/demod_mod.c @@ -625,20 +625,20 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -static float complex lowpass1d(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - ui32_t n; - ui32_t s = sample % taps; +static float complex lowpass1a(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { double complex w = 0; + ui32_t n; + ui32_t S = taps + (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } -//static __attribute__((optimize("-ffast-math"))) float complex lowpass1bf() +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - float complex w = 0; // -Ofast - int n; + float complex w = 0; + int n; // -Ofast int S = taps-1 - (sample % taps); for (n = 0; n < taps; n++) { w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] @@ -646,11 +646,10 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, return w; // symmetry: ws[n] == ws[taps-1-n] } -//static __attribute__((optimize("-ffast-math"))) float complex lowpass2() static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - float complex w = 0; // -Ofast - int n; - int s = sample % taps; // lpIQ + float complex w = 0; + int n; // -Ofast + int s = sample % taps; int S1 = s+1; int S1N = S1-taps; int n0 = taps-1-s; diff --git a/demod/multi/demod_base.c b/demod/multi/demod_base.c index b45fc98..898424a 100644 --- a/demod/multi/demod_base.c +++ b/demod/multi/demod_base.c @@ -699,20 +699,21 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -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; +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; + int n; // -Ofast + int S = taps-1 - (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } - return (float complex)w; + return 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 +static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; + int n; // -Ofast + int s = sample % taps; int S1 = s+1; int S1N = S1-taps; int n0 = taps-1-s; diff --git a/imet/imet4iq.c b/imet/imet4iq.c index f678733..9c82e3d 100644 --- a/imet/imet4iq.c +++ b/imet/imet4iq.c @@ -394,18 +394,28 @@ static int lowpass_init(float f, int taps, float **pws) { return taps; } - -static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - ui32_t n; - ui32_t s = sample % taps; +static float complex lowpass1a(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { double complex w = 0; + ui32_t n; + ui32_t S = taps + (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; + int n; // -Ofast + int S = taps-1 - (sample % taps); + for (n = 0; n < taps; n++) { + w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} +static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { float complex w = 0; // -Ofast int n; int s = sample % taps; // lpIQ diff --git a/mk2a/mk2a1680mod.c b/mk2a/mk2a1680mod.c index b020d25..5dad2d8 100644 --- a/mk2a/mk2a1680mod.c +++ b/mk2a/mk2a1680mod.c @@ -645,7 +645,7 @@ static int f32read_cblock(dsp_t *dsp) { int n; int len; float x, y; - ui8_t s[4*2*dsp->decM]; //uin8,int16,flot32 + ui8_t s[4*2*dsp->decM]; //uin8,int16,float32 ui8_t *u = (ui8_t*)s; short *b = (short*)s; float *f = (float*)s; @@ -732,21 +732,31 @@ static int lowpass_init(float f, int taps, float **pws) { return taps; } - -static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - ui32_t n; - ui32_t s = sample % taps; +static float complex lowpass1a(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { double complex w = 0; + ui32_t n; + ui32_t S = taps + (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } return (float complex)w; // symmetry: ws[n] == ws[taps-1-n] } +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { - float complex w = 0; // -Ofast + float complex w = 0; + int n; // -Ofast + int S = taps-1 - (sample % taps); + for (n = 0; n < taps; n++) { + w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + } + return w; +// symmetry: ws[n] == ws[taps-1-n] +} +static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; int n; - int s = sample % taps; // lpIQ + int s = sample % taps; int S1 = s+1; int S1N = S1-taps; int n0 = taps-1-s; diff --git a/scan/dft_detect.c b/scan/dft_detect.c index 2cfd032..42b32c2 100644 --- a/scan/dft_detect.c +++ b/scan/dft_detect.c @@ -650,20 +650,21 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps } return (float complex)w; } -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; +//static __attribute__((optimize("-ffast-math"))) float complex lowpass() +static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; + int n; // -Ofast + int S = taps-1 - (sample % taps); for (n = 0; n < taps; n++) { - w += buffer[n]*ws[taps+s-n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] + w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps] } - return (float complex)w; + return 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 +static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) { + float complex w = 0; int n; - int s = sample % taps; // lpIQ + int s = sample % taps; int S1 = s+1; int S1N = S1-taps; int n0 = taps-1-s;