From 3ac55e6cf012ca59799d74b282e74f540529c9ea Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Sun, 25 Sep 2022 16:26:04 +0200 Subject: [PATCH] iq_server: decimate speedup, RF64 --- demod/iq_svcl/iq_base.c | 37 +++++++++++++++++++++++++++++-------- demod/iq_svcl/iq_base.h | 5 +++-- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/demod/iq_svcl/iq_base.c b/demod/iq_svcl/iq_base.c index f3380cf..9b7ffbc 100644 --- a/demod/iq_svcl/iq_base.c +++ b/demod/iq_svcl/iq_base.c @@ -160,7 +160,7 @@ static int findstr(char *buff, char *str, int pos) { return i; } -float read_wav_header(pcm_t *pcm) { +int read_wav_header(pcm_t *pcm) { FILE *fp = pcm->fp; char txt[4+1] = "\0\0\0\0"; unsigned char dat[4]; @@ -168,11 +168,13 @@ float read_wav_header(pcm_t *pcm) { int sample_rate = 0, bits_sample = 0, channels = 0; if (fread(txt, 1, 4, fp) < 4) return -1; - if (strncmp(txt, "RIFF", 4)) return -1; + if (strncmp(txt, "RIFF", 4) && strncmp(txt, "RF64", 4)) return -1; + if (fread(txt, 1, 4, fp) < 4) return -1; // pos_WAVE = 8L if (fread(txt, 1, 4, fp) < 4) return -1; if (strncmp(txt, "WAVE", 4)) return -1; + // pos_fmt = 12L for ( ; ; ) { if ( (byte=fgetc(fp)) == EOF ) return -1; @@ -486,7 +488,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; @@ -496,23 +498,42 @@ 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] +} /* -------------------------------------------------------------------------- */ int read_ifblock(dsp_t *dsp, float complex *z) { - ui32_t s_reset = dsp->dectaps*dsp->lut_len; + //ui32_t s_reset = dsp->dectaps*dsp->lut_len; int j; if ( f32read_cblock(dsp) < dsp->decM ) return EOF; //if ( f32read_cblock(dsp) < dsp->decM * blk_sz) return EOF; + for (j = 0; j < dsp->decM; j++) { - dsp->decXbuffer[dsp->sample_dec % dsp->dectaps] = dsp->decMbuf[j] * dsp->ex[dsp->sample_dec % dsp->lut_len]; - dsp->sample_dec += 1; - if (dsp->sample_dec == s_reset) dsp->sample_dec = 0; + dsp->decXbuffer[dsp->sample_decX] = dsp->decMbuf[j] * dsp->ex[dsp->sample_decM]; + dsp->sample_decX += 1; if (dsp->sample_decX >= dsp->dectaps) dsp->sample_decX = 0; + dsp->sample_decM += 1; if (dsp->sample_decM >= dsp->lut_len) dsp->sample_decM = 0; } - *z = lowpass(dsp->decXbuffer, dsp->sample_dec, dsp->dectaps, ws_dec); + *z = lowpass(dsp->decXbuffer, dsp->sample_decX, dsp->dectaps, ws_dec); + + //dsp->sample_in += 1; return 0; } diff --git a/demod/iq_svcl/iq_base.h b/demod/iq_svcl/iq_base.h index eca90c5..89f0135 100644 --- a/demod/iq_svcl/iq_base.h +++ b/demod/iq_svcl/iq_base.h @@ -70,8 +70,9 @@ typedef struct { int blk_cnt; ui32_t sr_base; ui32_t dectaps; - ui32_t sample_dec; + ui32_t sample_decX; ui32_t lut_len; + ui32_t sample_decM; float complex *decXbuffer; float complex *decMbuf; float complex *ex; // exp_lut @@ -105,7 +106,7 @@ typedef struct { -float read_wav_header(pcm_t *); +int read_wav_header(pcm_t *); int init_buffers(dsp_t *); int free_buffers(dsp_t *);