From 28006535b7d264691f4e781d61449c3608fc9a39 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sun, 13 Sep 2009 06:27:53 +0000 Subject: [PATCH] added some basic pitch tracking to nlp to help with erros in mmt1. Seems to work OK and not upset other samples git-svn-id: https://svn.code.sf.net/p/freetel/code@61 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2/README.txt | 46 ++++++++++++++++++++++++++++++++++ codec2/raw/forig_speex_8k.raw | Bin 0 -> 25280 bytes codec2/src/code.sh | 2 +- codec2/src/defines.h | 2 +- codec2/src/listen1.sh | 2 +- codec2/src/nlp.c | 29 +++++++++++++++------ codec2/src/nlp.h | 2 +- codec2/src/phase.c | 1 - codec2/src/quantise.c | 31 +++++++++++++++-------- codec2/unittest/tnlp.c | 5 +++- 10 files changed, 96 insertions(+), 24 deletions(-) create mode 100644 codec2/raw/forig_speex_8k.raw diff --git a/codec2/README.txt b/codec2/README.txt index 2c75b568..a756cf51 100644 --- a/codec2/README.txt +++ b/codec2/README.txt @@ -214,10 +214,56 @@ Nope - I don't think it's possible to build a compatible codec without infringing on patents or access to commercial in confidence information. +[[hacking]] +Hacking +------- + +If you would like to work on the Codec2 code base here are some +notes: + +* src/code.sh will perform the several processing steps + required to output speech files at various processing steps, for + example: + + $ ./code.sh hts1a ++ +will produce hts1a_uq (unquantised, i.e. baseline sinusoidal model), +hts1a_phase0 (zero phase model), hts1a_lpc10 (10th order LPC model). + +* You can then listen to all of these samples (and the original) + using: + + $ ./listen.sh hts1a + +* Specific notes about LPC and Phase modelling are below. + +* There are some useful scripts in the scripts directory, for example + wav2raw.sh, raw2wav.sh, playraw.sh, menu.sh. Note that code.sh and + listen.sh are in the src directory as thats where they get used most + of the time. + [[lpc]] LPC Modelling Notes ------------------- +Linear Prediction Coefficient (LPC) modelling is used to model the +sine wave amplitudes { A }. The use of LPC in speech coding is +common, although the application of LPC modelling to frequency domain +coding is fairly novel. They are mainly used for time domain codecs +like LPC-10 and CELP. + +LPC modelling has a couple of advantages: + +* From time domain coding we know a lot about LPC, for example how to + quantise them efficiently using Line Spectrum Pairs (LSPs). + +* The number of amplitudes varies each frame as Wo and hence L vary. + This makes the { A } tricky to quantise and transmit. However it is + possible to convey the same information using a fixed number of + LPCs which makes the quantisation problem easier. + +To test LPC modelling: + $ ./sinedec ../raw/hts1a.raw hts1a.mdl --lpc 10 - hts1a_lpc10.raw The blog post [4] discusses why LPC modelling works so well when Am diff --git a/codec2/raw/forig_speex_8k.raw b/codec2/raw/forig_speex_8k.raw new file mode 100644 index 0000000000000000000000000000000000000000..e95302ef59780c9014be252d83037d843606f4e0 GIT binary patch literal 25280 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 Hb!7hs@+hNg literal 0 HcmV?d00001 diff --git a/codec2/src/code.sh b/codec2/src/code.sh index 7be303c5..9ab6b0a6 100644 --- a/codec2/src/code.sh +++ b/codec2/src/code.sh @@ -7,6 +7,6 @@ ../unittest/tnlp ../raw/$1.raw ../unittest/$1_nlp.p ../src/sinenc ../raw/$1.raw %1.mdl 300 ../unittest/$1_nlp.p ../src/sinedec ../raw/$1.raw %1.mdl -o $1_uq.raw -../src/sinedec ../raw/$1.raw %1.mdl --phase 0 -o $1_phase0.raw +../src/sinedec ../raw/$1.raw %1.mdl --phase 0 -o $1_phase0.raw --postfilter ../src/sinedec ../raw/$1.raw %1.mdl --lpc 10 -o $1_lpc10.raw diff --git a/codec2/src/defines.h b/codec2/src/defines.h index 255f0f0f..e9702f05 100644 --- a/codec2/src/defines.h +++ b/codec2/src/defines.h @@ -58,7 +58,7 @@ #define AW_DEC 160 /* number of samples in synthesis window */ #define FFT_DEC 512 /* number of points in DFT */ -#define TW 40 /* Trapezoidal UV synthesis window overlap */ +#define TW 40 /* Trapezoidal synthesis window overlap */ #define MAX_STR 256 /*---------------------------------------------------------------------------*\ diff --git a/codec2/src/listen1.sh b/codec2/src/listen1.sh index a9b156ce..c609b189 100755 --- a/codec2/src/listen1.sh +++ b/codec2/src/listen1.sh @@ -4,6 +4,6 @@ # # Run menu with common sample file options, headphone version -../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw -d /dev/dsp1 +../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw ../raw/$1_speex_8k.raw -d /dev/dsp1 diff --git a/codec2/src/nlp.c b/codec2/src/nlp.c index 8b81c479..d1077894 100644 --- a/codec2/src/nlp.c +++ b/codec2/src/nlp.c @@ -109,7 +109,8 @@ float nlp_fir[] = { float test_candidate_mbe(COMP Sw[], float f0); float post_process_mbe(COMP Fw[], int pmin, int pmax, float gmax); float post_process_sub_multiples(COMP Fw[], - int pmin, int pmax, float gmax, int gmax_bin); + int pmin, int pmax, float gmax, int gmax_bin, + float *prev_Wo); extern int frames; /*---------------------------------------------------------------------------*\ @@ -149,7 +150,8 @@ float nlp( int pmin, /* minimum pitch value */ int pmax, /* maximum pitch value */ float *pitch, /* estimated pitch period in samples */ - COMP Sw[] /* Freq domain version of Sn[] */ + COMP Sw[], /* Freq domain version of Sn[] */ + float *prev_Wo ) { static float sq[PMAX_M]; /* squared speech samples */ @@ -192,8 +194,9 @@ float nlp( Fw[i].real = 0.0; Fw[i].imag = 0.0; } - for(i=0; i= min_bin) { @@ -273,7 +278,15 @@ float post_process_sub_multiples(COMP Fw[], bmax = 1.2*b; if (bmin < min_bin) bmin = min_bin; - + + /* lower threshold to favour previous frames pitch estimate, + this is a form of pitch tracking */ + + if ((prev_f0_bin > bmin) && (prev_f0_bin < bmax)) + thresh = CNLP*0.5*gmax; + else + thresh = CNLP*gmax; + lmax = 0; for (b=bmin; b<=bmax; b++) /* look for maximum in interval */ if (Fw[b].real > lmax) { @@ -282,7 +295,7 @@ float post_process_sub_multiples(COMP Fw[], } if (lmax > thresh) - if (lmax > Fw[lmax_bin-1].real && lmax > Fw[lmax_bin+1].real) { + if ((lmax > Fw[lmax_bin-1].real) && (lmax > Fw[lmax_bin+1].real)) { cmax = lmax; cmax_bin = lmax_bin; } diff --git a/codec2/src/nlp.h b/codec2/src/nlp.h index b39c02e7..05000617 100644 --- a/codec2/src/nlp.h +++ b/codec2/src/nlp.h @@ -33,6 +33,6 @@ #define NLP_NTAP 48 /* Decimation LPF order */ -float nlp(float Sn[], int n, int m, int pmin, int pmax, float *pitch, COMP Sw[]); +float nlp(float Sn[], int n, int m, int pmin, int pmax, float *pitch, COMP Sw[], float *prev_Wo); #endif diff --git a/codec2/src/phase.c b/codec2/src/phase.c index 25dcf946..e13e99c6 100644 --- a/codec2/src/phase.c +++ b/codec2/src/phase.c @@ -342,7 +342,6 @@ void phase_synth_zero_order( /* generate excitation */ if (m <= Lrand) { - b = floor(m*model.Wo*FFT_DEC/TWO_PI + 0.5); Ex[m].real = cos(ex_phase[0]*m); Ex[m].imag = sin(ex_phase[0]*m); diff --git a/codec2/src/quantise.c b/codec2/src/quantise.c index d00036b5..d855412f 100644 --- a/codec2/src/quantise.c +++ b/codec2/src/quantise.c @@ -321,6 +321,9 @@ void aks_to_M2( float Em; /* energy in band */ float Am; /* spectral amplitude sample */ float signal, noise; + float E1,Am1; + + Am1 = model->A[1]; r = TWO_PI/(FFT_DEC); @@ -359,17 +362,25 @@ void aks_to_M2( } *snr = 10.0*log10(signal/noise); - /* attenuate fundamental by 30dB if F0 < 150 Hz. LPC modelling often makes - big errors on 1st harmonic, which is usually at very low level due to - analog HPF. + /* + Attenuate fundamental by 30dB if F0 < 150 Hz and LPC modelling + error for A[1] is larger than 6dB. - Another option is to use a single bit to swith thos attenuation - in and out based on measured error an encoder. That way - non-HPF speech won't be impaired. - */ + LPC modelling often makes big errors on 1st harmonic, for example + when the fundamental has been removed by analog high pass + filtering before sampling. However on unfiltered speech from + high quality sources we would like to keep the fundamental to + maintain the speech quality. So we check the error in A[1] and + attenuate it if the error is large to avoid annoying low + frequency energy after LPC modelling. - if (model->Wo < PI*150.0/4000) { - model->A[1] *= 0.032; - } + This will require a single bit to quantise, on top of the other + spectral magnitude bits (i.e. LSP bits + 1 total). + */ + E1 = fabs(20.0*log10(Am1) - 20.0*log10(model->A[1])); + if (E1 > 6.0) + if (model->Wo < (PI*150.0/4000)) { + model->A[1] *= 0.032; + } } diff --git a/codec2/unittest/tnlp.c b/codec2/unittest/tnlp.c index 0a9f51ab..dec36bb6 100644 --- a/codec2/unittest/tnlp.c +++ b/codec2/unittest/tnlp.c @@ -80,6 +80,7 @@ char *argv[]; float pitch; int i; int dump; + float prev_Wo; if (argc < 3) { printf("\nusage: tnlp InputRawSpeechFile OutputPitchTextFile " @@ -109,6 +110,7 @@ char *argv[]; make_window(NW); frames = 0; + prev_Wo = 0; while(fread(buf,sizeof(short),N,fin)) { frames++; @@ -121,7 +123,8 @@ char *argv[]; dft_speech(); dump_Sn(Sn); dump_Sw(Sw); - nlp(Sn,N,M,PITCH_MIN,PITCH_MAX,&pitch,Sw); + nlp(Sn,N,M,PITCH_MIN,PITCH_MAX,&pitch,Sw,&prev_Wo); + prev_Wo = TWO_PI/pitch; fprintf(fout,"%f\n",pitch); } -- 2.25.1