From: drowe67 Date: Sun, 25 Nov 2012 01:39:12 +0000 (+0000) Subject: exposed lpc post filter to codec2.h interface so we can play with it in real time... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=a63a824068e2e298c767b71c72c9203bf6244963;p=freetel-svn-tracking.git exposed lpc post filter to codec2.h interface so we can play with it in real time with FreeDV. Output almost bit exact at 1400 bit/s on ve9qrp git-svn-id: https://svn.code.sf.net/p/freetel/code@1061 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/src/c2sim.c b/codec2-dev/src/c2sim.c index 6aef4ef2..d47f0bbd 100644 --- a/codec2-dev/src/c2sim.c +++ b/codec2-dev/src/c2sim.c @@ -692,7 +692,7 @@ int main(int argc, char *argv[]) } - aks_to_M2(fft_fwd_cfg, ak, order, &model, e, &snr, 1, simlpcpf, lpcpf); + aks_to_M2(fft_fwd_cfg, ak, order, &model, e, &snr, 1, simlpcpf, lpcpf, 1, LPCPF_BETA, LPCPF_GAMMA); apply_lpc_correction(&model); #ifdef DUMP diff --git a/codec2-dev/src/codec2.c b/codec2-dev/src/codec2.c index 631a1bc3..f1517a60 100644 --- a/codec2-dev/src/codec2.c +++ b/codec2-dev/src/codec2.c @@ -131,6 +131,8 @@ struct CODEC2 * CODEC2_WIN32SUPPORT codec2_create(int mode) return NULL; } + c2->lpc_pf = 1; c2->bass_boost = 1; c2->beta = LPCPF_BETA; c2->gamma = LPCPF_GAMMA; + c2->xq_enc[0] = c2->xq_enc[1] = 0.0; c2->xq_dec[0] = c2->xq_dec[1] = 0.0; @@ -374,7 +376,8 @@ void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5); for(i=0; i<2; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); apply_lpc_correction(&model[i]); } @@ -519,7 +522,8 @@ void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5); for(i=0; i<2; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); apply_lpc_correction(&model[i]); } @@ -691,7 +695,8 @@ void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * } for(i=0; i<4; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); apply_lpc_correction(&model[i]); } @@ -868,7 +873,8 @@ void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * } for(i=0; i<4; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); apply_lpc_correction(&model[i]); } @@ -998,3 +1004,14 @@ void ear_protection(float in_out[], int n) { in_out[i] *= gain; } } + +int CODEC2_WIN32SUPPORT codec2_set_lpc_post_filter(struct CODEC2 *c2, int enable, int bass_boost, float beta, float gamma) +{ + assert((beta >= 0.0) && (beta <= 1.0)); + assert((gamma >= 0.0) && (gamma <= 1.0)); + c2->lpc_pf = enable; + c2->bass_boost = bass_boost; + c2->beta = beta; + c2->gamma = gamma; +} + diff --git a/codec2-dev/src/codec2.h b/codec2-dev/src/codec2.h index 9741449c..b97fc0df 100644 --- a/codec2-dev/src/codec2.h +++ b/codec2-dev/src/codec2.h @@ -59,6 +59,7 @@ void CODEC2_WIN32SUPPORT codec2_encode(struct CODEC2 *codec2_state, unsigned cha void CODEC2_WIN32SUPPORT codec2_decode(struct CODEC2 *codec2_state, short speech_out[], const unsigned char *bits); int CODEC2_WIN32SUPPORT codec2_samples_per_frame(struct CODEC2 *codec2_state); int CODEC2_WIN32SUPPORT codec2_bits_per_frame(struct CODEC2 *codec2_state); +int CODEC2_WIN32SUPPORT codec2_set_lpc_post_filter(struct CODEC2 *codec2_state, int enable, int bass_boost, float beta, float gamma); #endif diff --git a/codec2-dev/src/codec2_internal.h b/codec2-dev/src/codec2_internal.h index b006d035..5c6d279c 100644 --- a/codec2-dev/src/codec2_internal.h +++ b/codec2-dev/src/codec2_internal.h @@ -47,6 +47,11 @@ struct CODEC2 { MODEL prev_model_dec; /* previous frame's model parameters */ float prev_lsps_dec[LPC_ORD]; /* previous frame's LSPs */ float prev_e_dec; /* previous frame's LPC energy */ + + int lpc_pf; /* LPC post filter on */ + int bass_boost; /* LPC post filter bass boost */ + float beta; /* LPC post filter parameters */ + float gamma; float xq_enc[2]; /* joint pitch and energy VQ states */ float xq_dec[2]; diff --git a/codec2-dev/src/interp.c b/codec2-dev/src/interp.c index ebb579ab..a8d818fa 100644 --- a/codec2-dev/src/interp.c +++ b/codec2-dev/src/interp.c @@ -201,7 +201,7 @@ void interpolate_lsp( /* convert back to amplitudes */ lsp_to_lpc(lsps_interp, ak_interp, LPC_ORD); - aks_to_M2(fft_fwd_cfg, ak_interp, LPC_ORD, interp, e, &snr, 0, 0, 1); + aks_to_M2(fft_fwd_cfg, ak_interp, LPC_ORD, interp, e, &snr, 0, 0, 1, 1, LPCPF_BETA, LPCPF_GAMMA); //printf(" interp: ak[1]: %f A[1] %f\n", ak_interp[1], interp->A[1]); } diff --git a/codec2-dev/src/quantise.c b/codec2-dev/src/quantise.c index 47601ac7..1153943b 100644 --- a/codec2-dev/src/quantise.c +++ b/codec2-dev/src/quantise.c @@ -901,10 +901,8 @@ float lpc_model_amplitudes( \*---------------------------------------------------------------------------*/ -#define LPCPF_GAMMA 0.5 -#define LPCPF_BETA 0.2 - -void lpc_post_filter(kiss_fft_cfg fft_fwd_cfg, MODEL *model, COMP Pw[], float ak[], int order, int dump) +void lpc_post_filter(kiss_fft_cfg fft_fwd_cfg, MODEL *model, COMP Pw[], float ak[], + int order, int dump, float beta, float gamma, int bass_boost) { int i; COMP x[FFT_ENC]; /* input to FFTs */ @@ -945,7 +943,7 @@ void lpc_post_filter(kiss_fft_cfg fft_fwd_cfg, MODEL *model, COMP Pw[], float ak } for(i=0; i<=order; i++) - x[i].real = ak[i] * pow(LPCPF_GAMMA, (float)i); + x[i].real = ak[i] * pow(gamma, (float)i); kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)x, (kiss_fft_cpx *)Ww); for(i=0; i