From cdcbd692b980bf0f518e095dd37c0281c7b5a04b Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sat, 8 Aug 2015 22:29:03 +0000 Subject: [PATCH] first pass at lspmel VQ for 700b, still needs work; new BPF for 700b; new switches for c2sim to support 700b; removed unused quantisers from makefile git-svn-id: https://svn.code.sf.net/p/freetel/code@2263 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/bpf.m | 4 +- codec2-dev/octave/melvq.m | 6 +- codec2-dev/octave/tcohpsk.m | 2 +- codec2-dev/src/CMakeLists.txt | 83 ++++---------------- codec2-dev/src/bpfb.h | 105 ++++++++++++++++++++++++++ codec2-dev/src/c2sim.c | 45 ++++++++--- codec2-dev/src/codebook/lspmelvq1.txt | 65 ++++++++++++++++ codec2-dev/src/codebook/lspmelvq2.txt | 65 ++++++++++++++++ codec2-dev/src/codebook/lspmelvq3.txt | 65 ++++++++++++++++ codec2-dev/src/codec2.c | 2 +- codec2-dev/src/defines.h | 1 + codec2-dev/src/quantise.c | 43 +++++++++++ codec2-dev/src/quantise.h | 1 + 13 files changed, 403 insertions(+), 84 deletions(-) create mode 100644 codec2-dev/src/bpfb.h create mode 100644 codec2-dev/src/codebook/lspmelvq1.txt create mode 100644 codec2-dev/src/codebook/lspmelvq2.txt create mode 100644 codec2-dev/src/codebook/lspmelvq3.txt diff --git a/codec2-dev/octave/bpf.m b/codec2-dev/octave/bpf.m index 5649a5c6..9e0af8fb 100644 --- a/codec2-dev/octave/bpf.m +++ b/codec2-dev/octave/bpf.m @@ -23,9 +23,9 @@ function write_c_array(filename, arrayname, vec) fclose(f); endfunction -b=firls(100,[0 400 500 2400 2600 4000]/4000,[0.01 0.01 1 1 0.01 0.01]); +b=firls(100,[0 250 300 2600 2700 4000]/4000,[0.01 0.01 1 1 0.01 0.01]); freqz(b) -write_c_array("../src/bpf.h", "bpf", b) +write_c_array("../src/bpfb.h", "bpfb", b) % C header file of noise samples so C version gives extacly the same results diff --git a/codec2-dev/octave/melvq.m b/codec2-dev/octave/melvq.m index 7d5c47bd..1de92b78 100644 --- a/codec2-dev/octave/melvq.m +++ b/codec2-dev/octave/melvq.m @@ -152,7 +152,11 @@ function ind = test_run(samplename) fclose(fmel_); end -ind = test_run("all") +ind = test_run("cq_ref"); + +%load "../build_linux/src/all_mel.txt" +%vq = trainvq(all_mel, 64, 3); +%save vq; % [X] save text file of "vq quantised mels" % [X] load back into c2sim at run time diff --git a/codec2-dev/octave/tcohpsk.m b/codec2-dev/octave/tcohpsk.m index dd64c9de..e6c2db24 100644 --- a/codec2-dev/octave/tcohpsk.m +++ b/codec2-dev/octave/tcohpsk.m @@ -153,7 +153,7 @@ Fcentre = afdmdv.Fcentre = 1500; afdmdv.Fsep = afdmdv.Rs*(1+excess_bw); afdmdv.phase_tx = ones(afdmdv.Nc+1,1); % non linear carrier spacing, combined with clip, helps PAPR a lot! -freq_hz = afdmdv.Fsep*( -Nc*Nd/2 - 0.5 + (1:Nc*Nd).^0.98 ); +freq_hz = afdmdv.Fsep*( -Nc*Nd/2 - 0.5 + (1:Nc*Nd).^0.98 ) afdmdv.freq_pol = 2*pi*freq_hz/Fs; afdmdv.freq = exp(j*afdmdv.freq_pol); afdmdv.Fcentre = 1500; diff --git a/codec2-dev/src/CMakeLists.txt b/codec2-dev/src/CMakeLists.txt index 89e228fc..3827fa82 100644 --- a/codec2-dev/src/CMakeLists.txt +++ b/codec2-dev/src/CMakeLists.txt @@ -34,50 +34,12 @@ set(CODEBOOKSD ${D}/dlsp10.txt ) -# lspd VQ quantisers - -set(CODEBOOKSVQ - ${D}/lsp1.txt - ${D}/lsp2.txt - ${D}/lsp3.txt - ${D}/lsp4.txt - ${CMAKE_SOURCE_DIR}/unittest/lsp45678910.txt -) - -set(CODEBOOKSJND - ${D}/lsp1.txt - ${D}/lsp2.txt - ${D}/lsp3.txt - ${D}/lsp4.txt - ${CMAKE_SOURCE_DIR}/unittest/lspjnd5-10.txt -) - -set(CODEBOOKSDT - ${D}/lspdt1.txt - ${D}/lspdt2.txt - ${D}/lspdt3.txt - ${D}/lspdt4.txt - ${D}/lspdt5.txt - ${D}/lspdt6.txt - ${D}/lspdt7.txt - ${D}/lspdt8.txt - ${D}/lspdt9.txt - ${D}/lspdt10.txt -) - set(CODEBOOKSJVM ${D}/lspjvm1.txt ${D}/lspjvm2.txt ${D}/lspjvm3.txt ) -set(CODEBOOKSVQANSSI - ${D}/lspvqanssi1.txt - ${D}/lspvqanssi2.txt - ${D}/lspvqanssi3.txt - ${D}/lspvqanssi4.txt -) - set(CODEBOOKSMEL ${D}/mel1.txt ${D}/mel2.txt @@ -87,6 +49,12 @@ set(CODEBOOKSMEL ${D}/mel6.txt ) +set(CODEBOOKSLSPMELVQ + ${D}/lspmelvq1.txt + ${D}/lspmelvq2.txt + ${D}/lspmelvq3.txt +) + set(CODEBOOKSGE ${D}/gecb.txt) # when crosscompiling we need a native executable @@ -129,27 +97,6 @@ add_custom_command( DEPENDS generate_codebook ${CODEBOOKSD} ) -# codebookdt.c -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookdt.c - COMMAND generate_codebook lsp_cbdt ${CODEBOOKSDT} > ${CMAKE_CURRENT_BINARY_DIR}/codebookdt.c - DEPENDS generate_codebook ${CODEBOOKSDT} -) - -# codebookvq.c -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookvq.c - COMMAND generate_codebook lsp_cbvq ${CODEBOOKSVQ} > ${CMAKE_CURRENT_BINARY_DIR}/codebookvq.c - DEPENDS generate_codebook ${CODEBOOKSVQ} -) - -# codebookjnd.c -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjnd.c - COMMAND generate_codebook lsp_cbjnd ${CODEBOOKSJND} > ${CMAKE_CURRENT_BINARY_DIR}/codebookjnd.c - DEPENDS generate_codebook ${CODEBOOKSJND} -) - # codebookjvm.c add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjvm.c @@ -157,12 +104,6 @@ add_custom_command( DEPENDS generate_codebook ${CODEBOOKSJVM} ) -# codebookvqanssi.c -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookvqanssi.c - COMMAND generate_codebook lsp_cbvqanssi ${CODEBOOKSVQANSSI} > ${CMAKE_CURRENT_BINARY_DIR}/codebookvqanssi.c - DEPENDS generate_codebook ${CODEBOOKSVQANSSI} -) # codebookmel.c add_custom_command( @@ -171,6 +112,13 @@ add_custom_command( DEPENDS generate_codebook ${CODEBOOKSMEL} ) +# codebooklspmelvq.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooklspmelvq.c + COMMAND generate_codebook lspmelvq_cb ${CODEBOOKSLSPMELVQ} > ${CMAKE_CURRENT_BINARY_DIR}/codebooklspmelvq.c + DEPENDS generate_codebook ${CODEBOOKSLSPMELVQ} +) + # codebookge.c add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c @@ -202,12 +150,9 @@ set(CODEC2_SRCS pack.c codebook.c codebookd.c - codebookvq.c - codebookjnd.c codebookjvm.c - codebookvqanssi.c - codebookdt.c codebookmel.c + codebooklspmelvq.c codebookge.c golay23.c freedv_api.c diff --git a/codec2-dev/src/bpfb.h b/codec2-dev/src/bpfb.h new file mode 100644 index 00000000..73b1a691 --- /dev/null +++ b/codec2-dev/src/bpfb.h @@ -0,0 +1,105 @@ +#define BPFB_N 101 + +float bpfb[]={ + 0.003795, + 0.006827, + 0.002261, + 0.002523, + 0.005758, + -0.000264, + -0.000674, + 0.003113, + -0.004144, + -0.004923, + 0.000043, + -0.008017, + -0.008711, + -0.001802, + -0.010210, + -0.010428, + -0.000899, + -0.009413, + -0.009072, + 0.003469, + -0.005335, + -0.004828, + 0.010724, + 0.000941, + 0.000708, + 0.018957, + 0.007084, + 0.004825, + 0.025418, + 0.010147, + 0.004452, + 0.027434, + 0.007550, + -0.002861, + 0.023483, + -0.001944, + -0.018138, + 0.014122, + -0.017583, + -0.040768, + 0.002598, + -0.036604, + -0.069541, + -0.004273, + -0.054876, + -0.107289, + 0.010068, + -0.068052, + -0.200119, + 0.207287, + 0.597150, + 0.207287, + -0.200119, + -0.068052, + 0.010068, + -0.107289, + -0.054876, + -0.004273, + -0.069541, + -0.036604, + 0.002598, + -0.040768, + -0.017583, + 0.014122, + -0.018138, + -0.001944, + 0.023483, + -0.002861, + 0.007550, + 0.027434, + 0.004452, + 0.010147, + 0.025418, + 0.004825, + 0.007084, + 0.018957, + 0.000708, + 0.000941, + 0.010724, + -0.004828, + -0.005335, + 0.003469, + -0.009072, + -0.009413, + -0.000899, + -0.010428, + -0.010210, + -0.001802, + -0.008711, + -0.008017, + 0.000043, + -0.004923, + -0.004144, + 0.003113, + -0.000674, + -0.000264, + 0.005758, + 0.002523, + 0.002261, + 0.006827, + 0.003795 +}; \ No newline at end of file diff --git a/codec2-dev/src/c2sim.c b/codec2-dev/src/c2sim.c index 814a0306..15e37fc6 100644 --- a/codec2-dev/src/c2sim.c +++ b/codec2-dev/src/c2sim.c @@ -49,6 +49,7 @@ #include "ampexp.h" #include "phaseexp.h" #include "bpf.h" +#include "bpfb.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[]); @@ -66,6 +67,7 @@ int main(int argc, char *argv[]) FILE *fin; /* input speech file */ short buf[N]; /* input/output buffer */ float buf_float[N]; + float buf_float_bpf[N]; float Sn[M]; /* float input speech samples */ float Sn_pre[N]; /* pre-emphasised input speech samples */ COMP Sw[FFT_ENC]; /* DFT of Sn[] */ @@ -89,7 +91,7 @@ int main(int argc, char *argv[]) int lpc_model = 0, order = LPC_ORD; int lsp = 0, lspd = 0, lspvq = 0; int lspres = 0; - int lspjvm = 0, lspjnd = 0, lspmel = 0; + int lspjvm = 0, lspjnd = 0, lspmel = 0, lspmelvq = 0; #ifdef __EXPERIMENTAL__ int lspanssi = 0, #endif @@ -103,6 +105,7 @@ int main(int argc, char *argv[]) float ex_phase[MAX_AMP+1]; int postfilt; + float bg_est = 0.0; int hand_voicing = 0, phaseexp = 0, ampexp = 0, hi = 0, simlpcpf = 0, lspmelread = 0; int lpcpf = 0; @@ -135,6 +138,7 @@ int main(int argc, char *argv[]) struct AEXP *aexp = NULL; float gain = 1.0; int bpf_en = 0; + int bpfb_en = 0; float bpf_buf[BPF_N+N]; char* opt_string = "ho:"; @@ -143,6 +147,7 @@ int main(int argc, char *argv[]) { "lspjnd", no_argument, &lspjnd, 1 }, { "lspmel", no_argument, &lspmel, 1 }, { "lspmelread", required_argument, &lspmelread, 1 }, + { "lspmelvq", required_argument, &lspmelvq, 1 }, { "lsp", no_argument, &lsp, 1 }, { "lspd", no_argument, &lspd, 1 }, { "lspvq", no_argument, &lspvq, 1 }, @@ -167,6 +172,7 @@ int main(int argc, char *argv[]) { "rate", required_argument, NULL, 0 }, { "gain", required_argument, NULL, 0 }, { "bpf", no_argument, &bpf_en, 1 }, + { "bpfb", no_argument, &bpfb_en, 1 }, #ifdef DUMP { "dump", required_argument, &dump, 1 }, #endif @@ -373,6 +379,8 @@ int main(int argc, char *argv[]) if (ampexp) aexp = amp_experiment_create(); + if (bpfb_en) + bpf_en = 1; if (bpf_en) { for(i=0; ibpf_buf[BPF_N+i] = speech[i]; inverse_filter(&c2->bpf_buf[BPF_N], bpf, 4*N, bpf_out, BPF_N); for(i=0; i<4*N; i++) - bpf_speech[i] = speech[i]; + bpf_speech[i] = bpf_out[i]; /* frame 1 --------------------------------------------------------*/ diff --git a/codec2-dev/src/defines.h b/codec2-dev/src/defines.h index eac1ab70..5275ad7f 100644 --- a/codec2-dev/src/defines.h +++ b/codec2-dev/src/defines.h @@ -91,5 +91,6 @@ extern const struct lsp_codebook lsp_cbjvm[]; extern const struct lsp_codebook lsp_cbvqanssi[]; extern const struct lsp_codebook mel_cb[]; extern const struct lsp_codebook ge_cb[]; +extern const struct lsp_codebook lspmelvq_cb[]; #endif diff --git a/codec2-dev/src/quantise.c b/codec2-dev/src/quantise.c index 3e4adfd3..261a1ccc 100644 --- a/codec2-dev/src/quantise.c +++ b/codec2-dev/src/quantise.c @@ -136,6 +136,8 @@ long quantise(const float * cb, float vec[], float w[], int k, int m, float *se) return(besti); } + + /*---------------------------------------------------------------------------*\ encode_lspds_scalar() @@ -198,6 +200,7 @@ void encode_lspds_scalar( } + void decode_lspds_scalar( float lsp_[], int indexes[], @@ -531,6 +534,46 @@ void lspjvm_quantise(float *x, float *xq, int order) } } + +/* simple (non mbest) 6th order LSP MEL VQ quantiser */ + +void lspmelvq_quantise(float *x, float *xq, int order) +{ + int i, n1, n2, n3; + float err[order], err2[order], err3[order]; + float w[order], w2[order], w3[order]; + const float *codebook1 = lspmelvq_cb[0].cb; + const float *codebook2 = lspmelvq_cb[1].cb; + const float *codebook3 = lspmelvq_cb[2].cb; + float tmp[order]; + + assert(order == lspmelvq_cb[0].k); + + n1 = find_nearest(codebook1, lspmelvq_cb[0].m, x, order); + + for (i=0; i