From 186b03b997a0e61ac07d8b0b68da87d6c2630954 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Fri, 20 Aug 2010 08:29:14 +0000 Subject: [PATCH] support scripts for c2sim git-svn-id: https://svn.code.sf.net/p/freetel/code@179 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2/src/Makefile | 14 +- codec2/src/c2sim.c | 372 ++++++++++++++++++++++++++++++++++++++++ codec2/src/interp.c | 3 +- codec2/src/listen.sh | 10 +- codec2/src/listensim.sh | 9 + codec2/src/sim.sh | 18 ++ 6 files changed, 408 insertions(+), 18 deletions(-) create mode 100644 codec2/src/c2sim.c mode change 100755 => 100644 codec2/src/listen.sh create mode 100755 codec2/src/listensim.sh create mode 100755 codec2/src/sim.sh diff --git a/codec2/src/Makefile b/codec2/src/Makefile index f037794b..d59afe93 100644 --- a/codec2/src/Makefile +++ b/codec2/src/Makefile @@ -1,17 +1,13 @@ CC=gcc CFLAGS=-g -Wall -I. -I../src -Wall -g -DFLOATING_POINT -DVAR_ARRAYS -SINENC_OBJ = sine.o four1.o sinenc.o dump.o -SINEDEC_OBJ = sine.o four1.o dump.o quantise.o lpc.o lsp.o phase.o \ - postfilter.o interp.o sinedec.o +C2SIM_OBJ = sine.o nlp.o four1.o dump.o quantise.o lpc.o lsp.o phase.o \ + postfilter.o interp.o c2sim.o -all: sinenc sinedec +all: c2sim -sinenc: $(SINENC_OBJ) - $(CC) $(CFLAGS) $(SINENC_OBJ) -o sinenc -lm - -sinedec: $(SINEDEC_OBJ) - $(CC) $(CFLAGS) $(SINEDEC_OBJ) -o sinedec -lm +c2sim: $(C2SIM_OBJ) + $(CC) $(CFLAGS) $(C2SIM_OBJ) -o c2sim -lm %.o : %.c $(CC) -c $(CFLAGS) $< -o $@ diff --git a/codec2/src/c2sim.c b/codec2/src/c2sim.c new file mode 100644 index 00000000..04407bd6 --- /dev/null +++ b/codec2/src/c2sim.c @@ -0,0 +1,372 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2sim.c + AUTHOR......: David Rowe + DATE CREATED: 20/8/2010 + + Codec2 simulation. Combines encoder and decoder and allows switching in + out various algorithms and quantisation steps. + +\*---------------------------------------------------------------------------*/ + +/* + 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 General Public License version 2, 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 General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "nlp.h" +#include "dump.h" +#include "lpc.h" +#include "quantise.h" +#include "phase.h" +#include "postfilter.h" +#include "interp.h" + +/*---------------------------------------------------------------------------*\ + + switch_present() + + Searches the command line arguments for a "switch". If the switch is + found, returns the command line argument where it ws found, else returns + NULL. + +\*---------------------------------------------------------------------------*/ + +int switch_present(sw,argc,argv) +register char sw[]; /* switch in string form */ +register int argc; /* number of command line arguments */ +register char *argv[]; /* array of command line arguments in string form */ +{ + register int i; /* loop variable */ + + for(i=1; i 20)) { + printf("Error in lpc order: %d\n", order); + exit(1); + } + } + + dump = switch_present("--dump",argc,argv); + if (dump) + dump_on(argv[dump+1]); + + lsp = switch_present("--lsp",argc,argv); + lsp_quantiser = 0; + + phase0 = switch_present("--phase0",argc,argv); + if (phase0) { + ex_phase[0] = 0; + } + + hand_snr = switch_present("--hand_snr",argc,argv); + if (hand_snr) { + fsnr = fopen(argv[hand_snr+1],"rt"); + assert(fsnr != NULL); + } + + bg_est = 0.0; + postfilt = switch_present("--postfilter",argc,argv); + + decimate = switch_present("--dec",argc,argv); + transition = 0; + + /* Initialise ------------------------------------------------------------*/ + + make_analysis_window(w,W); + make_synthesis_window(Pn); + quantise_init(); + + /* Main loop ------------------------------------------------------------*/ + + frames = 0; + sum_snr = 0; + while(fread(buf,sizeof(short),N,fin)) { + frames++; + + /* Read input speech */ + + for(i=0; i 2.0; + } + phase_synth_zero_order(&model, ak_phase, voiced, ex_phase); + + if (postfilt) + postfilter(&model, voiced, &bg_est); + } + + /* optional LPC model amplitudes */ + + if (lpc_model) { + snr = lpc_model_amplitudes(Sn, w, &model, order, lsp, ak); + sum_snr += snr; + dump_quantised_model(&model); + } + + /* option decimation to 20ms rate, which enables interpolation + routine to synthesise in between frame */ + + if (decimate) { + if (frames%2) { + + /* odd frames use the original model parameters */ + + model_synth = model_2; + transition = 0; + } + else { + interp(&model_3, &model_1, &model_synth, &model_a, &model_b, + &transition); + + /* phase need to be supplied outside of this routine, e.g. via + a phase model */ + + for(i=1; i<=model_synth.L; i++) + model_synth.phi[i] = model_2.phi[i]; + } + + model_3 = model_2; + model_2 = model_1; + model_1 = model; + model = model_synth; + } + + /* + Simulate Wo quantisation noise + model.Wo += 2.0*(PI/8000)*(1.0 - 2.0*(float)rand()/RAND_MAX); + if (model.Wo > TWO_PI/20.0) model.Wo = TWO_PI/20.0; + if (model.Wo < TWO_PI/160.0) model.Wo = TWO_PI/160.0; + model.L = floor(PI/model.Wo); + */ + + /* Synthesise speech */ + + if (fout != NULL) { + + if (transition) { + synthesise(Sn_,&model_a,Pn,1); + synthesise(Sn_,&model_b,Pn,0); + } + else { + synthesise(Sn_,&model,Pn,1); + } + + /* Save output speech to disk */ + + for(i=0; i 32767.0) + buf[i] = 32767; + else if (Sn_[i] < -32767.0) + buf[i] = -32767; + else + buf[i] = Sn_[i]; + } + fwrite(buf,sizeof(short),N,fout); + } + } + + if (fout != NULL) + fclose(fout); + + if (lpc_model) + printf("SNR av = %5.2f dB\n", sum_snr/frames); + + if (dump) + dump_off(); + + if (hand_snr) + fclose(fsnr); + + return 0; +} + diff --git a/codec2/src/interp.c b/codec2/src/interp.c index 70ed274f..21112b57 100644 --- a/codec2/src/interp.c +++ b/codec2/src/interp.c @@ -37,8 +37,7 @@ interp() Given two frames decribed by model parameters 20ms apart, determines the - model parameters of the 10ms frame between them. Note that phases are - not interpolated, they must be set external to this function. + model parameters of the 10ms frame between them. \*---------------------------------------------------------------------------*/ diff --git a/codec2/src/listen.sh b/codec2/src/listen.sh old mode 100755 new mode 100644 index 14c0a4fd..bebd106f --- a/codec2/src/listen.sh +++ b/codec2/src/listen.sh @@ -1,13 +1,9 @@ #!/bin/sh -# listen.sh +# listensim.sh # David Rowe 10 Sep 2009 # -# Run menu with common sample file options +# Listen to files processed with sim.sh -# listen to various modelling and quantisation steps -../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw $1_lsp.raw $1_phase0_lpc10.raw $1_phase0_lsp.raw ../raw/$1_g729a.raw $2 $3 +../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw $1_lsp.raw $1_phase0_lpc10.raw $1_phase0_lsp.raw $1_phase0_lsp.raw $2 $3 -# compare to other codecs - -#../script/menu.sh ../raw/$1.raw $1_phase0_lsp.raw $1_phase0_lsp_20.raw $1_phase0_lsp_20_EWo.raw ../raw/$1_g729a.raw ../raw/$1_gsm13k.raw ../raw/$1_speex_8k.raw $2 $3 diff --git a/codec2/src/listensim.sh b/codec2/src/listensim.sh new file mode 100755 index 00000000..64f7455a --- /dev/null +++ b/codec2/src/listensim.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# listensim.sh +# David Rowe 10 Sep 2009 +# +# Listen to files processed with sim.sh + +../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw $1_lsp.raw $1_phase0_lpc10.raw $1_phase0_lsp.raw $1_phase0_lsp_dec.raw $2 $3 + + diff --git a/codec2/src/sim.sh b/codec2/src/sim.sh new file mode 100755 index 00000000..ed298e34 --- /dev/null +++ b/codec2/src/sim.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# sim.sh +# David Rowe 10 Sep 2009 + +# Process a source file using the codec 2 simulation. An output +# speech file is generated for each major processing step, from the +# unquantised siusoidal model to fully quantised. This way we can +# listen to the effect of each processing step. Use listensim.sh to +# test the output files. + +../src/c2sim ../raw/$1.raw -o $1_uq.raw +../src/c2sim ../raw/$1.raw --phase0 -o $1_phase0.raw --postfilter +../src/c2sim ../raw/$1.raw --lpc 10 -o $1_lpc10.raw +../src/c2sim ../raw/$1.raw --lpc 10 --lsp -o $1_lsp.raw +../src/c2sim ../raw/$1.raw --phase0 --lpc 10 -o $1_phase0_lpc10.raw --postfilter +../src/c2sim ../raw/$1.raw --phase0 --lpc 10 --lsp -o $1_phase0_lsp.raw --postfilter +../src/c2sim ../raw/$1.raw --phase0 --lpc 10 --lsp -o $1_phase0_lsp_dec.raw --postfilter --dec + -- 2.25.1