void fm_demod(struct demod_state *fm) { int i, pcm = 0; int16_t *lp = fm->lowpassed; int16_t pr = fm->pre_r; int16_t pj = fm->pre_j; for (i = 0; i < (fm->lp_len-1); i += 2) { switch (fm->custom_atan) { case 0: pcm = polar_discriminant(lp[i], lp[i+1], pr, pj); break; case 1: pcm = polar_disc_fast(lp[i], lp[i+1], pr, pj); break; case 2: pcm = polar_disc_lut(lp[i], lp[i+1], pr, pj); break; case 3: pcm = esbensen(lp[i], lp[i+1], pr, pj); break; } pr = lp[i]; pj = lp[i+1]; fm->lowpassed[i/2] = (int16_t)pcm; } fm->pre_r = pr; fm->pre_j = pj; fm->lp_len = fm->lp_len / 2; }
void fm_demod(struct demod_state *fm) { int i, pcm; int16_t *lp = fm->lowpassed; pcm = polar_discriminant(lp[0], lp[1], fm->pre_r, fm->pre_j); fm->result[0] = (int16_t)pcm; for (i = 2; i < (fm->lp_len-1); i += 2) { switch (fm->custom_atan) { case 0: pcm = polar_discriminant(lp[i], lp[i+1], lp[i-2], lp[i-1]); break; case 1: pcm = polar_disc_fast(lp[i], lp[i+1], lp[i-2], lp[i-1]); break; case 2: pcm = polar_disc_lut(lp[i], lp[i+1], lp[i-2], lp[i-1]); break; case 3: pcm = esbensen(lp[i], lp[i+1], lp[i-2], lp[i-1]); break; } fm->result[i/2] = (int16_t)pcm; } fm->pre_r = lp[fm->lp_len - 2]; fm->pre_j = lp[fm->lp_len - 1]; fm->result_len = fm->lp_len/2; }