diff options
Diffstat (limited to 'gr-vocoder/lib/codec2/c2sim.c')
-rw-r--r-- | gr-vocoder/lib/codec2/c2sim.c | 934 |
1 files changed, 0 insertions, 934 deletions
diff --git a/gr-vocoder/lib/codec2/c2sim.c b/gr-vocoder/lib/codec2/c2sim.c deleted file mode 100644 index e68f2aceeb..0000000000 --- a/gr-vocoder/lib/codec2/c2sim.c +++ /dev/null @@ -1,934 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: c2sim.c - AUTHOR......: David Rowe - DATE CREATED: 20/8/2010 - - Codec2 simulation. Combines encoder and decoder and allows - switching in and out various algorithms and quantisation steps. Used - for algorithm development. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <math.h> -#include <unistd.h> -#include <getopt.h> - -#include "defines.h" -#include "sine.h" -#include "nlp.h" -#include "dump.h" -#include "lpc.h" -#include "lsp.h" -#include "quantise.h" -#include "phase.h" -#include "postfilter.h" -#include "interp.h" -#include "ampexp.h" -#include "phaseexp.h" - -void synth_one_frame(kiss_fft_cfg fft_inv_cfg, short buf[], MODEL *model, float Sn_[], float Pn[], int prede, float *de_mem, float gain); -void print_help(const struct option *long_options, int num_opts, char* argv[]); - - -/*---------------------------------------------------------------------------*\ - - MAIN - -\*---------------------------------------------------------------------------*/ - -int main(int argc, char *argv[]) -{ - FILE *fout = NULL; /* output speech file */ - FILE *fin; /* input speech file */ - short buf[N]; /* input/output buffer */ - float Sn[M]; /* float input speech samples */ - float Sn_pre[M]; /* pre-emphasised input speech samples */ - COMP Sw[FFT_ENC]; /* DFT of Sn[] */ - kiss_fft_cfg fft_fwd_cfg; - kiss_fft_cfg fft_inv_cfg; - float w[M]; /* time domain hamming window */ - COMP W[FFT_ENC]; /* DFT of w[] */ - MODEL model; - float Pn[2*N]; /* trapezoidal synthesis window */ - float Sn_[2*N]; /* synthesised speech */ - int i; /* loop variable */ - int frames; - float prev_Wo, prev__Wo, uq_Wo, prev_uq_Wo; - float pitch; - int voiced1 = 0; - char out_file[MAX_STR]; - char ampexp_arg[MAX_STR]; - char phaseexp_arg[MAX_STR]; - float snr; - float sum_snr; - - int lpc_model = 0, order = LPC_ORD; - int lsp = 0, lspd = 0, lspvq = 0; - int lspres = 0; - int lspdt = 0, lspdt_mode = LSPDT_ALL; - int dt = 0, lspjvm = 0, lspanssi = 0, lspjnd = 0, lspmel = 0; - int prede = 0; - float pre_mem = 0.0, de_mem = 0.0; - float ak[LPC_MAX]; - COMP Sw_[FFT_ENC]; - COMP Ew[FFT_ENC]; - - int phase0 = 0; - float ex_phase[MAX_AMP+1]; - - int postfilt; - float bg_est; - - int hand_voicing = 0, phaseexp = 0, ampexp = 0, hi = 0, simlpcpf = 0; - int lpcpf = 0; - FILE *fvoicing = 0; - - MODEL prev_model, interp_model; - int decimate = 0; - float lsps[LPC_MAX]; - float prev_lsps[LPC_MAX], prev_lsps_[LPC_MAX]; - float lsps__prev[LPC_MAX]; - float lsps__prev2[LPC_MAX]; - float e, prev_e; - float ak_interp[LPC_MAX]; - int lsp_indexes[LPC_MAX]; - float lsps_[LPC_MAX]; - float Woe_[2]; - - void *nlp_states; - float hpf_states[2]; - int scalar_quant_Wo_e = 0; - int vector_quant_Wo_e = 0; - int dump_pitch_e = 0; - FILE *fjvm = NULL; - #ifdef DUMP - int dump; - #endif - struct PEXP *pexp = NULL; - struct AEXP *aexp = NULL; - float gain = 1.0; - - char* opt_string = "ho:"; - struct option long_options[] = { - { "lpc", required_argument, &lpc_model, 1 }, - { "lspjnd", no_argument, &lspjnd, 1 }, - { "lspmel", no_argument, &lspmel, 1 }, - { "lsp", no_argument, &lsp, 1 }, - { "lspd", no_argument, &lspd, 1 }, - { "lspvq", no_argument, &lspvq, 1 }, - { "lspres", no_argument, &lspres, 1 }, - #ifdef __EXPERIMENTAL__ - { "lspdt", no_argument, &lspdt, 1 }, - { "lspdt_mode", required_argument, NULL, 0 }, - #endif - { "lspjvm", no_argument, &lspjvm, 1 }, - #ifdef __EXPERIMENTAL__ - { "lspanssi", no_argument, &lspanssi, 1 }, - #endif - { "phase0", no_argument, &phase0, 1 }, - { "phaseexp", required_argument, &phaseexp, 1 }, - { "ampexp", required_argument, &exp, 1 }, - { "postfilter", no_argument, &postfilt, 1 }, - { "hand_voicing", required_argument, &hand_voicing, 1 }, - { "dec", no_argument, &decimate, 1 }, - { "dt", no_argument, &dt, 1 }, - { "hi", no_argument, &hi, 1 }, - { "simlpcpf", no_argument, &simlpcpf, 1 }, - { "lpcpf", no_argument, &lpcpf, 1 }, - { "prede", no_argument, &prede, 1 }, - { "dump_pitch_e", required_argument, &dump_pitch_e, 1 }, - { "sq_pitch_e", no_argument, &scalar_quant_Wo_e, 1 }, - { "vq_pitch_e", no_argument, &vector_quant_Wo_e, 1 }, - { "rate", required_argument, NULL, 0 }, - { "gain", required_argument, NULL, 0 }, - #ifdef DUMP - { "dump", required_argument, &dump, 1 }, - #endif - { "help", no_argument, NULL, 'h' }, - { NULL, no_argument, NULL, 0 } - }; - int num_opts=sizeof(long_options)/sizeof(struct option); - - for(i=0; i<M; i++) { - Sn[i] = 1.0; - Sn_pre[i] = 1.0; - } - for(i=0; i<2*N; i++) - Sn_[i] = 0; - - prev_uq_Wo = prev_Wo = prev__Wo = TWO_PI/P_MAX; - - prev_model.Wo = TWO_PI/P_MIN; - prev_model.L = floor(PI/prev_model.Wo); - for(i=1; i<=prev_model.L; i++) { - prev_model.A[i] = 0.0; - prev_model.phi[i] = 0.0; - } - for(i=1; i<=MAX_AMP; i++) { - //ex_phase[i] = (PI/3)*(float)rand()/RAND_MAX; - ex_phase[i] = 0.0; - } - for(i=0; i<LPC_ORD; i++) { - lsps_[i] = prev_lsps[i] = prev_lsps_[i] = i*PI/(LPC_ORD+1); - lsps__prev[i] = lsps__prev2[i] = i*PI/(LPC_ORD+1); - } - e = prev_e = 1; - hpf_states[0] = hpf_states[1] = 0.0; - - nlp_states = nlp_create(M); - - if (argc < 2) { - print_help(long_options, num_opts, argv); - } - - /*----------------------------------------------------------------*\ - - Interpret Command Line Arguments - - \*----------------------------------------------------------------*/ - - while(1) { - int option_index = 0; - int opt = getopt_long(argc, argv, opt_string, - long_options, &option_index); - if (opt == -1) - break; - switch (opt) { - case 0: - if(strcmp(long_options[option_index].name, "lpc") == 0) { - order = atoi(optarg); - if((order < 4) || (order > 20)) { - fprintf(stderr, "Error in LPC order: %s\n", optarg); - exit(1); - } - #ifdef DUMP - } else if(strcmp(long_options[option_index].name, "dump") == 0) { - if (dump) - dump_on(optarg); - #endif - } else if(strcmp(long_options[option_index].name, "lsp") == 0 - || strcmp(long_options[option_index].name, "lspd") == 0 - || strcmp(long_options[option_index].name, "lspvq") == 0) { - assert(order == LPC_ORD); - } else if(strcmp(long_options[option_index].name, "lspdt_mode") == 0) { - if (strcmp(optarg,"all") == 0) - lspdt_mode = LSPDT_ALL; - else if (strcmp(optarg,"low") == 0) - lspdt_mode = LSPDT_LOW; - else if (strcmp(optarg,"high") == 0) - lspdt_mode = LSPDT_HIGH; - else { - fprintf(stderr, "Error in lspdt_mode: %s\n", optarg); - exit(1); - } - } else if(strcmp(long_options[option_index].name, "hand_voicing") == 0) { - if ((fvoicing = fopen(optarg,"rt")) == NULL) { - fprintf(stderr, "Error opening voicing file: %s: %s.\n", - optarg, strerror(errno)); - exit(1); - } - } else if(strcmp(long_options[option_index].name, "dump_pitch_e") == 0) { - if ((fjvm = fopen(optarg,"wt")) == NULL) { - fprintf(stderr, "Error opening pitch & energy dump file: %s: %s.\n", - optarg, strerror(errno)); - exit(1); - } - } else if(strcmp(long_options[option_index].name, "phaseexp") == 0) { - strcpy(phaseexp_arg, optarg); - } else if(strcmp(long_options[option_index].name, "ampexp") == 0) { - strcpy(ampexp_arg, optarg); - } else if(strcmp(long_options[option_index].name, "gain") == 0) { - gain = atof(optarg); - } else if(strcmp(long_options[option_index].name, "rate") == 0) { - if(strcmp(optarg,"3200") == 0) { - lpc_model = 1; order = 10; - scalar_quant_Wo_e = 1; - lspd = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - lpcpf = 1; - } else if(strcmp(optarg,"2400") == 0) { - lpc_model = 1; order = 10; - vector_quant_Wo_e = 1; - lsp = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - lpcpf = 1; - } else if(strcmp(optarg,"1400") == 0) { - lpc_model = 1; order = 10; - vector_quant_Wo_e = 1; - lsp = 1; lspdt = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - dt = 1; - lpcpf = 1; - } else if(strcmp(optarg,"1200") == 0) { - lpc_model = 1; order = 10; - scalar_quant_Wo_e = 1; - lspjvm = 1; lspdt = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - dt = 1; - lpcpf = 1; - } else { - fprintf(stderr, "Error: invalid output rate %s\n", optarg); - exit(1); - } - } - break; - - case 'h': - print_help(long_options, num_opts, argv); - break; - - case 'o': - if (strcmp(optarg, "-") == 0) fout = stdout; - else if ((fout = fopen(optarg,"wb")) == NULL) { - fprintf(stderr, "Error opening output speech file: %s: %s.\n", - optarg, strerror(errno)); - exit(1); - } - strcpy(out_file,optarg); - break; - - default: - /* This will never be reached */ - break; - } - } - - /* Input file */ - - if ((fin = fopen(argv[optind],"rb")) == NULL) { - fprintf(stderr, "Error opening input speech file: %s: %s.\n", - argv[optind], strerror(errno)); - exit(1); - } - - ex_phase[0] = 0; - bg_est = 0.0; - Woe_[0] = Woe_[1] = 1.0; - - /* - printf("lspd: %d lspdt: %d lspdt_mode: %d phase0: %d postfilt: %d " - "decimate: %d dt: %d\n",lspd,lspdt,lspdt_mode,phase0,postfilt, - decimate,dt); - */ - - /* Initialise ------------------------------------------------------------*/ - - fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL); /* fwd FFT,used in several places */ - fft_inv_cfg = kiss_fft_alloc(FFT_DEC, 1, NULL, NULL); /* inverse FFT, used just for synth */ - make_analysis_window(fft_fwd_cfg, w, W); - make_synthesis_window(Pn); - quantise_init(); - if (phaseexp) - pexp = phase_experiment_create(); - if (ampexp) - aexp = amp_experiment_create(); - - /*----------------------------------------------------------------*\ - - Main Loop - - \*----------------------------------------------------------------*/ - - frames = 0; - sum_snr = 0; - while(fread(buf,sizeof(short),N,fin)) { - frames++; - //printf("frame: %d ", frames); - - /* Read input speech */ - - for(i=0; i<M-N; i++) { - Sn[i] = Sn[i+N]; - Sn_pre[i] = Sn_pre[i+N]; - } - for(i=0; i<N; i++) - Sn[i+M-N] = buf[i]; - - pre_emp(&Sn_pre[M-N], &Sn[M-N], &pre_mem, N); - - - /*------------------------------------------------------------*\ - - Estimate Sinusoidal Model Parameters - - \*------------------------------------------------------------*/ - - nlp(nlp_states,Sn,N,P_MIN,P_MAX,&pitch,Sw,W,&prev_uq_Wo); - model.Wo = TWO_PI/pitch; - - dft_speech(fft_fwd_cfg, Sw, Sn, w); - two_stage_pitch_refinement(&model, Sw); - estimate_amplitudes(&model, Sw, W, 1); - uq_Wo = model.Wo; - - #ifdef DUMP - dump_Sn(Sn); dump_Sw(Sw); dump_model(&model); - #endif - - if (ampexp) - amp_experiment(aexp, &model, ampexp_arg); - - if (phaseexp) { - #ifdef DUMP - dump_phase(&model.phi[0], model.L); - #endif - phase_experiment(pexp, &model, phaseexp_arg); - #ifdef DUMP - dump_phase_(&model.phi[0], model.L); - #endif - } - - if (hi) { - int m; - for(m=1; m<model.L/2; m++) - model.A[m] = 0.0; - for(m=3*model.L/4; m<=model.L; m++) - model.A[m] = 0.0; - } - - /*------------------------------------------------------------*\ - - Zero-phase modelling - - \*------------------------------------------------------------*/ - - if (phase0) { - float Wn[M]; /* windowed speech samples */ - float Rk[LPC_MAX+1]; /* autocorrelation coeffs */ - - #ifdef DUMP - dump_phase(&model.phi[0], model.L); - #endif - - /* find aks here, these are overwritten if LPC modelling is enabled */ - - if (prede) { - for(i=0; i<M; i++) - Wn[i] = Sn_pre[i]*w[i]; - } - else { - - for(i=0; i<M; i++) - Wn[i] = Sn[i]*w[i]; - } - autocorrelate(Wn,Rk,M,order); - levinson_durbin(Rk,ak,order); - - /* determine voicing */ - - snr = est_voicing_mbe(&model, Sw, W, Sw_, Ew, prev_uq_Wo); - - if (dump_pitch_e) - fprintf(fjvm, "%f %f %d ", model.Wo, snr, model.voiced); - - //printf("snr %3.2f v: %d Wo: %f prev_Wo: %f\n", snr, model.voiced, - // model.Wo, prev_uq_Wo); - #ifdef DUMP - dump_Sw_(Sw_); - dump_Ew(Ew); - dump_snr(snr); - #endif - - /* just to make sure we are not cheating - kill all phases */ - - for(i=0; i<=MAX_AMP; i++) - model.phi[i] = 0; - - if (hand_voicing) { - fscanf(fvoicing,"%d\n",&model.voiced); - } - } - - /*------------------------------------------------------------*\ - - LPC model amplitudes and LSP quantisation - - \*------------------------------------------------------------*/ - - if (lpc_model) { - - if (prede) - e = speech_to_uq_lsps(lsps, ak, Sn_pre, w, order); - else - e = speech_to_uq_lsps(lsps, ak, Sn, w, order); - - #ifdef DUMP - dump_ak(ak, LPC_ORD); - #endif - - /* tracking down -ve energy values with BW expansion */ - /* - if (e < 0.0) { - int i; - FILE*f=fopen("x.txt","wt"); - for(i=0; i<M; i++) - fprintf(f,"%f\n", Sn[i]); - fclose(f); - printf("e = %f frames = %d\n", e, frames); - for(i=0; i<order; i++) - printf("%f ", ak[i]); - exit(0); - } - */ - - if (dump_pitch_e) - fprintf(fjvm, "%f\n", e); - - #ifdef DUMP - /* dump order is different if we are decimating */ - if (!decimate) - dump_lsp(lsps); - for(i=0; i<LPC_ORD; i++) - prev_lsps[i] = lsps[i]; - #endif - - /* various LSP quantisation schemes */ - - if (lsp) { - encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); - decode_lsps_scalar(lsps_, lsp_indexes, LPC_ORD); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - if (lspd) { - encode_lspds_scalar(lsp_indexes, lsps, LPC_ORD); - decode_lspds_scalar(lsps_, lsp_indexes, LPC_ORD); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - -#ifdef __EXPERIMENTAL__ - if (lspvq) { - lspvq_quantise(lsps, lsps_, LPC_ORD); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } -#endif - - if (lspjvm) { - /* Jean-Marc's multi-stage, split VQ */ - lspjvm_quantise(lsps, lsps_, LPC_ORD); - { - float lsps_bw[LPC_ORD]; - memcpy(lsps_bw, lsps_, sizeof(float)*LPC_ORD); - bw_expand_lsps(lsps_bw, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_bw, ak, LPC_ORD); - } - } - -#ifdef __EXPERIMENTAL__ - if (lspanssi) { - /* multi-stage VQ from Anssi Ramo OH3GDD */ - - lspanssi_quantise(lsps, lsps_, LPC_ORD, 5); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } -#endif - - /* experimenting with non-linear LSP spacing to see if - it's just noticable */ - - if (lspjnd) { - for(i=0; i<LPC_ORD; i++) - lsps_[i] = lsps[i]; - locate_lsps_jnd_steps(lsps_, LPC_ORD); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - /* Another experiment with non-linear LSP spacing, this - time using a scaled version of mel frequency axis - warping. The scaling is such that the integer output - can be directly sent over the channel. - */ - - if (lspmel) { - float f, f_; - int mel[LPC_ORD]; - - for(i=0; i<LPC_ORD; i++) { - f = (4000.0/PI)*lsps[i]; - mel[i] = floor(100.0*log10(1.0 + f/700.0) + 0.5); - } - - for(i=1; i<LPC_ORD; i++) { - if (mel[i] == mel[i-1]) - mel[i]++; - } - - #ifdef DUMP - dump_mel(mel); - #endif - - for(i=0; i<LPC_ORD; i++) { - f_ = 700.0*( pow(10.0, (float)mel[i]/100.0) - 1.0); - lsps_[i] = f_*(PI/4000.0); - } - /* - for(i=5; i<10; i++) { - lsps_[i] = lsps[i]; - } - */ - - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - /* we need lsp__prev[] for lspdt and decimate. If no - other LSP quantisation is used we use original LSPs as - there is no quantised version available. TODO: this is - mess, we should have structures and standard - nomenclature for previous frames values, lsp_[] - shouldn't be overwritten as we may want to dump it for - analysis. Re-design some time. - */ - - if (!lsp && !lspd && !lspvq && !lspres && !lspjvm && !lspanssi && !lspjnd && !lspmel) - for(i=0; i<LPC_ORD; i++) - lsps_[i] = lsps[i]; - - /* Odd frames are generated by quantising the difference - between the previous frames LSPs and this frames */ - -#ifdef __EXPERIMENTAL__ - if (lspdt && !decimate) { - if (frames%2) { - lspdt_quantise(lsps, lsps_, lsps__prev, lspdt_mode); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - for(i=0; i<LPC_ORD; i++) - lsps__prev[i] = lsps_[i]; - } -#endif - - /* - When decimation is enabled we only send LSPs to the - decoder on odd frames. In the Delta-time LSPs case we - encode every second odd frame (i.e. every 3rd frame out - of 4) by quantising the difference between the 1st - frames LSPs and the 3rd frames: - - 10ms, frame 1: discard (interpolate at decoder) - 20ms, frame 2: send "full" LSP frame - 30ms, frame 3: discard (interpolate at decoder) - 40ms, frame 4: send LSPs differences between frame 4 and frame 2 - */ - - if (lspdt && decimate) { - /* print previous LSPs to make sure we are using the right set */ - if ((frames%4) == 0) { - //printf(" lspdt "); - //#define LSPDT - #ifdef LSPDT - lspdt_quantise(lsps, lsps_, lsps__prev2, lspdt_mode); - #else - for(i=0; i<LPC_ORD; i++) - lsps_[i] = lsps__prev2[i]; - #endif - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - for(i=0; i<LPC_ORD; i++) { - lsps__prev2[i] = lsps__prev[i]; - lsps__prev[i] = lsps_[i]; - } - } - #ifdef DUMP - /* if using decimated (20ms) frames we dump interp - LSPs below */ - if (!decimate) - dump_lsp_(lsps_); - #endif - - if (scalar_quant_Wo_e) { - - e = decode_energy(encode_energy(e)); - - if (!decimate) { - /* we send params every 10ms, delta-time every 20ms */ - if (dt && (frames % 2)) - model.Wo = decode_Wo_dt(encode_Wo_dt(model.Wo, prev_Wo),prev_Wo); - else - model.Wo = decode_Wo(encode_Wo(model.Wo)); - } - - if (decimate) { - /* we send params every 20ms */ - if (dt && ((frames % 4) == 0)) { - /* delta-time every 40ms */ - model.Wo = decode_Wo_dt(encode_Wo_dt(model.Wo, prev__Wo),prev__Wo); - } - else - model.Wo = decode_Wo(encode_Wo(model.Wo)); - } - - model.L = PI/model.Wo; /* if we quantise Wo re-compute L */ - } - - if (vector_quant_Wo_e) { - - /* JVM's experimental joint Wo & LPC energy quantiser */ - - //printf("\nWo %f e %f\n", model.Wo, e); - quantise_WoE(&model, &e, Woe_); - //printf("Wo %f e %f\n", model.Wo, e); - - } - - 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 - dump_ak_(ak, LPC_ORD); - #endif - - /* note SNR on interpolated frames can't be measured properly - by comparing Am as L has changed. We can dump interp lsps - and compare them, - */ - #ifdef DUMP - dump_lpc_snr(snr); - #endif - sum_snr += snr; - #ifdef DUMP - dump_quantised_model(&model); - #endif - } - - /*------------------------------------------------------------*\ - - Decimation to 20ms frame rate - - \*------------------------------------------------------------*/ - - if (decimate) { - float lsps_interp[LPC_ORD]; - - if (!phase0) { - printf("needs --phase0 to resample phase for interpolated Wo\n"); - exit(0); - } - if (!lpc_model) { - printf("needs --lpc 10 to resample amplitudes\n"); - exit(0); - } - - /* - Each 20ms we synthesise two 10ms frames: - - frame 1: discard except for voicing bit - frame 2: interpolate frame 1 LSPs from frame 2 and frame 0 - synthesise frame 1 and frame 2 speech - frame 3: discard except for voicing bit - frame 4: interpolate frame 3 LSPs from frame 4 and frame 2 - synthesise frame 3 and frame 4 speech - */ - - if ((frames%2) == 0) { - //printf("frame: %d\n", frames); - - /* decode interpolated frame */ - - interp_model.voiced = voiced1; - - interpolate_lsp(fft_fwd_cfg, &interp_model, &prev_model, &model, - prev_lsps_, prev_e, lsps_, e, ak_interp, lsps_interp); - apply_lpc_correction(&interp_model); - - /* used to compare with c2enc/c2dec version - - printf(" Wo: %1.5f L: %d v1: %d prev_e: %f\n", - interp_model.Wo, interp_model.L, interp_model.voiced, prev_e); - printf(" lsps_interp: "); - for(i=0; i<LPC_ORD; i++) - printf("%5.3f ", lsps_interp[i]); - printf("\n A..........: "); - for(i=0; i<10; i++) - printf("%5.3f ",interp_model.A[i]); - - printf("\n Wo: %1.5f L: %d e: %3.2f v2: %d\n", - model.Wo, model.L, e, model.voiced); - printf(" lsps_......: "); - for(i=0; i<LPC_ORD; i++) - printf("%5.3f ", lsps_[i]); - printf("\n A..........: "); - for(i=0; i<10; i++) - printf("%5.3f ",model.A[i]); - printf("\n"); - */ - - #ifdef DUMP - /* do dumping here so we get lsp dump file in correct order */ - dump_lsp(prev_lsps); - dump_lsp(lsps_interp); - dump_lsp(lsps); - dump_lsp(lsps_); - #endif - - if (phase0) - phase_synth_zero_order(fft_fwd_cfg, &interp_model, ak_interp, ex_phase, - order); - if (postfilt) - postfilter(&interp_model, &bg_est); - synth_one_frame(fft_inv_cfg, buf, &interp_model, Sn_, Pn, prede, &de_mem, gain); - //printf(" buf[0] %d\n", buf[0]); - if (fout != NULL) - fwrite(buf,sizeof(short),N,fout); - - /* decode this frame */ - - if (phase0) - phase_synth_zero_order(fft_fwd_cfg, &model, ak, ex_phase, order); - if (postfilt) - postfilter(&model, &bg_est); - synth_one_frame(fft_inv_cfg, buf, &model, Sn_, Pn, prede, &de_mem, gain); - //printf(" buf[0] %d\n", buf[0]); - if (fout != NULL) - fwrite(buf,sizeof(short),N,fout); - - /* update states for next time */ - - prev_model = model; - for(i=0; i<LPC_ORD; i++) - prev_lsps_[i] = lsps_[i]; - prev_e = e; - } - else { - voiced1 = model.voiced; - } - } - else { - /* no decimation - sythesise each 10ms frame immediately */ - - if (phase0) - phase_synth_zero_order(fft_fwd_cfg, &model, ak, ex_phase, order); - - if (postfilt) - postfilter(&model, &bg_est); - synth_one_frame(fft_inv_cfg, buf, &model, Sn_, Pn, prede, &de_mem, gain); - if (fout != NULL) fwrite(buf,sizeof(short),N,fout); - } - - prev__Wo = prev_Wo; - prev_Wo = model.Wo; - prev_uq_Wo = uq_Wo; - //if (frames == 8) { - // exit(0); - //} - } - - /*----------------------------------------------------------------*\ - - End Main Loop - - \*----------------------------------------------------------------*/ - - fclose(fin); - - if (fout != NULL) - fclose(fout); - - if (lpc_model) - printf("SNR av = %5.2f dB\n", sum_snr/frames); - - if (phaseexp) - phase_experiment_destroy(pexp); - if (ampexp) - amp_experiment_destroy(aexp); - #ifdef DUMP - if (dump) - dump_off(); - #endif - - if (hand_voicing) - fclose(fvoicing); - - nlp_destroy(nlp_states); - - return 0; -} - -void synth_one_frame(kiss_fft_cfg fft_inv_cfg, short buf[], MODEL *model, float Sn_[], float Pn[], int prede, float *de_mem, float gain) -{ - int i; - - synthesise(fft_inv_cfg, Sn_, model, Pn, 1); - if (prede) - de_emp(Sn_, Sn_, de_mem, N); - - for(i=0; i<N; i++) { - Sn_[i] *= gain; - if (Sn_[i] > 32767.0) - buf[i] = 32767; - else if (Sn_[i] < -32767.0) - buf[i] = -32767; - else - buf[i] = Sn_[i]; - } - -} - -void print_help(const struct option* long_options, int num_opts, char* argv[]) -{ - int i; - char *option_parameters; - - fprintf(stderr, "\nCodec2 - low bit rate speech codec - Simulation Program\n" - "\thttp://rowetel.com/codec2.html\n\n" - "usage: %s [OPTIONS] <InputFile>\n\n" - "Options:\n" - "\t-o <OutputFile>\n", argv[0]); - for(i=0; i<num_opts-1; i++) { - if(long_options[i].has_arg == no_argument) { - option_parameters=""; - } else if (strcmp("lpc", long_options[i].name) == 0) { - option_parameters = " <Order>"; - } else if (strcmp("lspdt_mode", long_options[i].name) == 0) { - option_parameters = " <all|high|low>"; - } else if (strcmp("hand_voicing", long_options[i].name) == 0) { - option_parameters = " <VoicingFile>"; - } else if (strcmp("dump_pitch_e", long_options[i].name) == 0) { - option_parameters = " <Dump File>"; - } else if (strcmp("rate", long_options[i].name) == 0) { - option_parameters = " <4800|2400|1400|1200>"; - } else if (strcmp("dump", long_options[i].name) == 0) { - option_parameters = " <DumpFilePrefix>"; - } else { - option_parameters = " <UNDOCUMENTED parameter>"; - } - fprintf(stderr, "\t--%s%s\n", long_options[i].name, option_parameters); - } - exit(1); -} |