demod lowpass: minor correction, lpFM speedup

pull/53/head
Zilog80 2022-10-04 00:17:17 +02:00
rodzic bb39e3922f
commit e995797201
8 zmienionych plików z 84 dodań i 84 usunięć

Wyświetl plik

@ -484,7 +484,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
ui32_t n;
double complex w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float complex)w;
}
@ -492,7 +492,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -503,9 +503,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0;
int n;
int s = sample % taps;
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}

Wyświetl plik

@ -457,7 +457,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
ui32_t n;
double complex w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float complex)w;
}
@ -465,7 +465,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -476,9 +476,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0;
int n;
int s = sample % taps;
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
@ -493,18 +493,18 @@ static float re_lowpass0(float buffer[], ui32_t sample, ui32_t taps, float *ws)
ui32_t n;
double w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float)w;
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double w = 0;
float w = 0;
int n;
int 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)w;
return w;
}
@ -578,7 +578,7 @@ static int if_fm(dsp_t *dsp, float complex *z_out, float *s) {
// IF-lowpass
if (dsp->opt_lp & LP_IQ) {
dsp->lpIQ_buf[_sample % dsp->lpIQtaps] = z;
z = lowpass(dsp->lpIQ_buf, _sample, dsp->lpIQtaps, dsp->ws_lpIQ);
z = lowpass(dsp->lpIQ_buf, _sample+1, dsp->lpIQtaps, dsp->ws_lpIQ);
}
if (dsp->opt_fm) {
@ -590,7 +590,7 @@ static int if_fm(dsp_t *dsp, float complex *z_out, float *s) {
if (dsp->opt_lp & LP_FM) {
dsp->lpFM_buf[_sample % dsp->lpFMtaps] = s_fm;
if (m+1 == dsp->decFM) {
s_fm = re_lowpass(dsp->lpFM_buf, _sample, dsp->lpFMtaps, dsp->ws_lpFM);
s_fm = re_lowpass(dsp->lpFM_buf, _sample+1, dsp->lpFMtaps, dsp->ws_lpFM);
}
}
}

Wyświetl plik

@ -277,7 +277,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
ui32_t n;
double complex w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float complex)w;
}
@ -285,7 +285,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -294,13 +294,13 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps,
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double w = 0;
float w = 0;
int n;
int 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)w;
return w;
}
/* -------------------------------------------------------------------------- */
@ -384,7 +384,7 @@ static int fm_demod(dsp_t *dsp, float *s) {
if ( f32read_csample(dsp, &z) == EOF ) return EOF;
dsp->lpIQ_buf[_sample % dsp->lpIQtaps] = z;
z1 = lowpass(dsp->lpIQ_buf, _sample, dsp->lpIQtaps, dsp->ws_lpIQ);
z1 = lowpass(dsp->lpIQ_buf, _sample+1, dsp->lpIQtaps, dsp->ws_lpIQ);
w = z1 * conj(z0);
s_fm = gain * carg(w)/M_PI;
@ -395,7 +395,7 @@ static int fm_demod(dsp_t *dsp, float *s) {
if (dsp->opt_lp & LP_FM) {
dsp->lpFM_buf[_sample % dsp->lpFMtaps] = s_fm;
if (m+1 == dsp->decFM) {
s_fm = re_lowpass(dsp->lpFM_buf, _sample, dsp->lpFMtaps, dsp->ws_lpFM);
s_fm = re_lowpass(dsp->lpFM_buf, _sample+1, dsp->lpFMtaps, dsp->ws_lpFM);
}
}

Wyświetl plik

@ -618,17 +618,17 @@ static int lowpass_update(float f, int taps, float *ws) {
}
static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t n; // sample: oldest_sample
double complex w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float complex)w;
}
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);
ui32_t 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]
}
@ -639,7 +639,7 @@ static float complex lowpass1a(float complex buffer[], ui32_t sample, ui32_t tap
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -650,9 +650,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0;
int n; // -Ofast
int s = sample % taps;
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
@ -664,16 +664,16 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
}
static float complex lowpass0_sym(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
double complex w = buffer[(sample+(taps+1)/2) % taps]*ws[(taps-1)/2]; // (N+1)/2 = (N-1)/2 + 1
double complex w = buffer[(sample+(taps-1)/2) % taps]*ws[(taps-1)/2]; // (N+1)/2 = (N-1)/2 + 1
for (n = 0; n < (taps-1)/2; n++) {
w += (buffer[(sample+n+1)%taps]+buffer[(sample+taps-n)%taps])*ws[n];
w += (buffer[(sample+n)%taps]+buffer[(sample+taps-n-1)%taps])*ws[n];
}
return (float complex)w;
}
static float complex lowpass2_sym(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
float complex w = 0;
int n;
int s = (sample+1) % taps; // lpIQ
int s = sample % taps; // lpIQ
int SW = (taps-1)/2;
int B1 = s + SW;
int n1 = SW - s;
@ -704,18 +704,18 @@ static float re_lowpass0(float buffer[], ui32_t sample, ui32_t taps, float *ws)
ui32_t n;
double w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float)w;
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double w = 0;
float w = 0;
int n;
int 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)w;
return w;
}
@ -750,7 +750,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
}
if (dsp->decM > 1)
{
z = lowpass(dsp->decXbuffer, dsp->sample_decX, dsp->dectaps, ws_dec);
z = lowpass(dsp->decXbuffer, dsp->sample_decX, dsp->dectaps, ws_dec); // oldest sample: dsp->sample_decX
}
}
else if ( f32read_csample(dsp, &z) == EOF ) return EOF;
@ -764,7 +764,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
// IF-lowpass
if (dsp->opt_lp & LP_IQ) {
dsp->lpIQ_buf[dsp->sample_in % dsp->lpIQtaps] = z;
z = lowpass(dsp->lpIQ_buf, dsp->sample_in, dsp->lpIQtaps, dsp->ws_lpIQ);
z = lowpass(dsp->lpIQ_buf, dsp->sample_in+1, dsp->lpIQtaps, dsp->ws_lpIQ);
}
@ -842,7 +842,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
// FM-lowpass
if (dsp->opt_lp & LP_FM) {
dsp->lpFM_buf[dsp->sample_in % dsp->lpFMtaps] = s_fm;
s_fm = re_lowpass(dsp->lpFM_buf, dsp->sample_in, dsp->lpFMtaps, dsp->ws_lpFM);
s_fm = re_lowpass(dsp->lpFM_buf, dsp->sample_in+1, dsp->lpFMtaps, dsp->ws_lpFM);
if (dsp->opt_iq < 2) s = s_fm;
}

Wyświetl plik

@ -695,7 +695,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
ui32_t n;
double complex w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float complex)w;
}
@ -703,7 +703,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -714,9 +714,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0;
int n; // -Ofast
int s = sample % taps;
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
@ -731,18 +731,18 @@ static float re_lowpass0(float buffer[], ui32_t sample, ui32_t taps, float *ws)
ui32_t n;
double w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float)w;
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double w = 0;
float w = 0;
int n;
int 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)w;
return w;
}
@ -784,7 +784,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
// IF-lowpass
if (dsp->opt_lp) {
dsp->lpIQ_buf[dsp->sample_in % dsp->lpIQtaps] = z;
z = lowpass(dsp->lpIQ_buf, dsp->sample_in, dsp->lpIQtaps, dsp->ws_lpIQ);
z = lowpass(dsp->lpIQ_buf, dsp->sample_in+1, dsp->lpIQtaps, dsp->ws_lpIQ);
}
@ -798,7 +798,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
// FM-lowpass
if (dsp->opt_lp) {
dsp->lpFM_buf[dsp->sample_in % dsp->lpFMtaps] = s;
s = re_lowpass(dsp->lpFM_buf, dsp->sample_in, dsp->lpFMtaps, dsp->ws_lpFM);
s = re_lowpass(dsp->lpFM_buf, dsp->sample_in+1, dsp->lpFMtaps, dsp->ws_lpFM);
}
dsp->fm_buffer[dsp->sample_in % dsp->M] = s;

Wyświetl plik

@ -397,7 +397,7 @@ static int lowpass_init(float f, int taps, float **pws) {
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);
ui32_t 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]
}
@ -408,7 +408,7 @@ static float complex lowpass1a(float complex buffer[], ui32_t sample, ui32_t tap
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -419,9 +419,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0; // -Ofast
int n;
int s = sample % taps; // lpIQ
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
@ -433,13 +433,13 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double w = 0;
float w = 0;
int n;
int 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)w;
return w;
}
static
@ -498,7 +498,7 @@ int f32_sample(dsp_t *dsp, float *out) {
// IF-lowpass
if (dsp->opt_lp & LP_IQ) {
dsp->lpIQ_buf[_sample % dsp->lpIQtaps] = z;
z = lowpass(dsp->lpIQ_buf, _sample, dsp->lpIQtaps, dsp->ws_lpIQ);
z = lowpass(dsp->lpIQ_buf, _sample+1, dsp->lpIQtaps, dsp->ws_lpIQ);
}
@ -520,7 +520,7 @@ int f32_sample(dsp_t *dsp, float *out) {
if (dsp->opt_lp & LP_FM) {
dsp->lpFM_buf[_sample % dsp->lpFMtaps] = s_fm;
if (m+1 == decFM) {
s_fm = re_lowpass(dsp->lpFM_buf, _sample, dsp->lpFMtaps, dsp->ws_lpFM);
s_fm = re_lowpass(dsp->lpFM_buf, _sample+1, dsp->lpFMtaps, dsp->ws_lpFM);
if (dsp->opt_iq < 2 || dsp->opt_iq > 5) s = s_fm; //opt_iq==0,1,6
}
}

Wyświetl plik

@ -735,7 +735,7 @@ static int lowpass_init(float f, int taps, float **pws) {
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);
ui32_t 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]
}
@ -746,7 +746,7 @@ static float complex lowpass1a(float complex buffer[], ui32_t sample, ui32_t tap
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -757,9 +757,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0;
int n;
int s = sample % taps;
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
@ -771,13 +771,13 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double w = 0;
float w = 0;
int n;
int 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)w;
return w;
}
@ -835,7 +835,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
// IF-lowpass
if (dsp->opt_lp & LP_IQ) {
dsp->lpIQ_buf[_sample % dsp->lpIQtaps] = z;
z = lowpass(dsp->lpIQ_buf, _sample, dsp->lpIQtaps, dsp->ws_lpIQ);
z = lowpass(dsp->lpIQ_buf, _sample+1, dsp->lpIQtaps, dsp->ws_lpIQ);
}
@ -919,7 +919,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
if (dsp->opt_lp & LP_FM) {
dsp->lpFM_buf[_sample % dsp->lpFMtaps] = s_fm;
if (m+1 == decFM) {
s_fm = re_lowpass(dsp->lpFM_buf, _sample, dsp->lpFMtaps, dsp->ws_lpFM);
s_fm = re_lowpass(dsp->lpFM_buf, _sample+1, dsp->lpFMtaps, dsp->ws_lpFM);
if (dsp->opt_iq < 2 || dsp->opt_iq > 5) s = s_fm; //opt_iq==0,1,6
}
}
@ -928,7 +928,7 @@ int f32buf_sample(dsp_t *dsp, int inv) {
if (dsp->opt_lp & LP_IQFM) { // opt_iq==5
dsp->lpIQFM_buf[_sample % dsp->lpIQFMtaps] = s;
if (m+1 == decFM) {
s = re_lowpass(dsp->lpIQFM_buf, _sample, dsp->lpIQFMtaps, dsp->ws_lpIQFM);
s = re_lowpass(dsp->lpIQFM_buf, _sample+1, dsp->lpIQFMtaps, dsp->ws_lpIQFM);
}
}

Wyświetl plik

@ -646,7 +646,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
ui32_t n;
double complex w = 0;
for (n = 0; n < taps; n++) {
w += buffer[(sample+n+1)%taps]*ws[taps-1-n];
w += buffer[(sample+n)%taps]*ws[taps-1-n];
}
return (float complex)w;
}
@ -654,7 +654,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
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);
int S = taps - (sample % taps);
for (n = 0; n < taps; n++) {
w += buffer[n]*ws[S+n]; // ws[taps+s-n] = ws[(taps+sample-n)%taps]
}
@ -665,9 +665,9 @@ static float complex lowpass2(float complex buffer[], ui32_t sample, ui32_t taps
float complex w = 0;
int n;
int s = sample % taps;
int S1 = s+1;
int S1 = s;
int S1N = S1-taps;
int n0 = taps-1-s;
int n0 = taps-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
@ -711,8 +711,8 @@ static int f32buf_sample(FILE *fp, int inv) {
// b) 3 FM-streams
//
lpIQ_buf[sample_in % dsp__lpIQtaps] = z;
z_fm0 = lowpass(lpIQ_buf, sample_in, dsp__lpIQtaps, ws_lpIQ[0]);
z_fm1 = lowpass(lpIQ_buf, sample_in, dsp__lpIQtaps, ws_lpIQ[1]);
z_fm0 = lowpass(lpIQ_buf, sample_in+1, dsp__lpIQtaps, ws_lpIQ[0]);
z_fm1 = lowpass(lpIQ_buf, sample_in+1, dsp__lpIQtaps, ws_lpIQ[1]);
// IQ: different modulation indices h=h(rs) -> FM-demod
w = z_fm0 * conj(z0_fm0);