From 89863732bdba2ed1296b0cb8fab5a83a9f60494b Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 5 Aug 2015 06:05:46 +0000 Subject: [PATCH] anti Git rant and some mods to c2sim to support playing with mel-lsps for a new improved rate 700 codec git-svn-id: https://svn.code.sf.net/p/freetel/code@2257 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/README | 21 +++- codec2-dev/octave/cohpsk_frame_design.ods | Bin 51340 -> 51690 bytes codec2-dev/octave/melvq.m | 130 ++++++++++++++++++++++ codec2-dev/octave/sd.m | 29 ++++- codec2-dev/src/c2sim.c | 32 +++++- codec2-dev/src/codec2.c | 2 +- codec2-dev/src/dump.c | 20 ++++ codec2-dev/src/dump.h | 1 + 8 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 codec2-dev/octave/melvq.m diff --git a/codec2-dev/README b/codec2-dev/README index a6e8b605..4cd93a59 100644 --- a/codec2-dev/README +++ b/codec2-dev/README @@ -1,7 +1,7 @@ Codec 2 README -------------- -Codec 2 is an open source (LGPL licensed) speech codec for 2400 bit/s +Codec 2 is an open source (LGPL licensed) speech codec for 3200 bit/s and below. For more information please see: http://rowetel.com/codec2.html @@ -10,6 +10,25 @@ Also included is a FDMDV modem (README_fdmdv.txt), a coherent PSK modem and an API for embedding FreeDV in other programs (see example below). For more information on building Codec 2 see README.cmake +SVN Repository +-------------- + +Check out the latest (development branch) code using: + + $ svn co https://svn.code.sf.net/p/freetel/code/codec2-dev codec2-dev + +There are 3rd party GIT mirrors of Codec2 and FreeDV. Use Git at your +own risk. + + GIT IS NOT SUPPORTED!!! + +All patches, support questions etc, need to be against the SVN +repository above. + +Please do not email me (David), or the codec2-dev mailing list +suggesting we change to Git. I get these emails every week. Really, +I understand the arguments, but am content with SVN for now. + Quickstart ---------- diff --git a/codec2-dev/octave/cohpsk_frame_design.ods b/codec2-dev/octave/cohpsk_frame_design.ods index f1b2c9187fddea7be3335a34c6547ef0fc8d0c6e..91d16ad491bb21c95ff24e5ce09e84e9e8299a60 100644 GIT binary patch delta 6245 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
    V;2c&?2+B#++-3=m6{=RB&<*e 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 diff --git a/codec2-dev/octave/melvq.m b/codec2-dev/octave/melvq.m new file mode 100644 index 00000000..aab22033 --- /dev/null +++ b/codec2-dev/octave/melvq.m @@ -0,0 +1,130 @@ +% melvq.m +% David Rowe Aug 2015 +% +% Experimenting with VQ design for mel LSPs + +% todo: +% [ ] Sorting inside search what happens if we get a order issue, fix and calc SD +% [ ] Search to avoid a worst case error rather than average? This could be included +% in training. +% [ ] nested/staged search + +1; + +% train up multi-stage VQ + +function vq = trainvq(training_data, Nvec, stages) + + vq = []; + for i=1:stages + [idx centers] = kmeans(training_data, Nvec); + quant_error = centers(idx,:) - training_data; + printf("mse stage %d: %f\n", i, mean(std(quant_error))); + training_data = quant_error; + vq(:,:,i) = centers; + end + +end + + +function [mse_list index_list] = search_vq(vq, target, m) + + [Nvec order] = size(vq); + + mse = zeros(1, Nvec); + + % find mse for each vector + + for i=1:Nvec + mse(i) = sum((target - vq(i,:)) .^2); + end + + % sort and keep top m matches + + [mse_list index_list ] = sort(mse); + + mse_list = mse_list(1:m); + index_list = index_list(1:m); + +endfunction + + +% Search multi-stage VQ, retaining m best candidates at each stage + +function [res ind] = mbest(vqset, input_vecs, m) + + [Nvec order stages] = size(vqset); + [Ninput tmp] = size(input_vecs); + + res = []; % residual error after VQ + ind = []; % index of vqs + + for i=1:Ninput + + % first stage, find mbest candidates + + [mse_list index_list] = search_vq(vqset(:,:,1), input_vecs(i,:), m); + cand_list = [mse_list' index_list']; + cand_list = sortrows(cand_list,1); + + % subsequent stages ........... + + for s=2:stages + + % compute m targets for next stage, and update path + + prev_indexes = zeros(m,s-1); + for t=1:m + target(t,:) = input_vecs(i,:); + for v=1:s-1 + target(t,:) -= vqset(cand_list(t,v+1),:,v); + end + prev_indexes(t,:) = cand_list(t,2:s); + end + + % search stage s using m targets from stage s-1 + % with m targets, we do m searches which return the m best possibilities + % so we get a matrix with one row per candidate, m*m rows total + % prev_indexes provides us with the path through the VQs for each candidate row + + avq = vqset(:,:,s); + cand_list = []; + for t=1:m + [mse_list index_list] = search_vq(avq, target(t,:), m); + x = ones(m,1)*prev_indexes(t,:); + cand_row = [mse_list' x index_list']; + cand_list = [cand_list; cand_row]; + end + + % sort into m best rows + + cand_list = sortrows(cand_list,1); + cand_list = cand_list(1:m,:); + + end + + % final residual + target(1,:) = input_vecs(i,:); + for v=1:s + target(1,:) -= vqset(cand_list(1,v+1),:,v); + end + res = [res; target(1,:)]; + ind = [ind; cand_list(1,2:1+stages)]; + end + +endfunction + +more off; +load "../build_linux/src/all_mel.txt" +load vq; +[res1 ind] = mbest(vq, all_mel(1,:),3); +mean(std(res1)) + +% save text file of "vq quantised mels" +% load back into c2sim at run time +% train on continuous mels +% sorting/stability +% see how it sounds +% Goal is to get VQ sounding OK, similar to UQ at 20 or 40ms dec, +% sig better than current 700 +% analysis of data, outliers, different training diff --git a/codec2-dev/octave/sd.m b/codec2-dev/octave/sd.m index 7995a9c2..d3005240 100644 --- a/codec2-dev/octave/sd.m +++ b/codec2-dev/octave/sd.m @@ -52,7 +52,7 @@ function sd(raw_filename, dump_file_prefix, f) axis([1 length(s) -20E3 20E3]) subplot(212) [a b c] = plotyy(1:frames, sd, 1:frames, e); - axis(a, [1 frames 0 10]) + %axis(a, [1 frames 0 10]) lsp1_filename = sprintf("%s_lsp.txt", dump_file_prefix); lsp2_filename = sprintf("%s_lsp_.txt", dump_file_prefix); @@ -77,9 +77,25 @@ function sd(raw_filename, dump_file_prefix, f) subplot(211) ind = find(e > 0); hist(sd(ind)) + title('Histogram of SD'); subplot(212) plot((1:Ndft)*8000/Ndft, spec_err) axis([300 3000 0 max(spec_err)]) + title('Average error across spectrum') + + mel_indexes_filename = sprintf("%s_mel_indexes.txt", dump_file_prefix); + if file_in_path(".", mel_indexes_filename) + mel_indexes = load(mel_indexes_filename); + figure(6) + bins = [15, 7, 15, 7, 7, 7]; + ind = find(e > 5); % ignore silence frames + for i=1:6 + subplot(3,2,i) + hist(mel_indexes(ind,i),0:bins(i)) + ylab = sprintf("index %d", i); + ylabel(ylab); + end + end % now enter single step mode so we can analyse each frame k = ' '; @@ -101,10 +117,10 @@ function sd(raw_filename, dump_file_prefix, f) figure(3); clf; - plot((1:Ndft/2)*4000/(Ndft/2), A1(fr,1:(Ndft/2)),";A1;r"); + plot((1:Ndft/2)*4000/(Ndft/2), A1(fr,1:(Ndft/2)),";A enc;r"); axis([1 4000 -20 40]); hold on; - plot((1:Ndft/2)*4000/(Ndft/2), A2(fr,1:(Ndft/2)),";A2;"); + plot((1:Ndft/2)*4000/(Ndft/2), A2(fr,1:(Ndft/2)),";A dec;"); if file_in_path(".",weights_filename) plot(lsp1(fr,:)*4000/pi, weights(fr,:),";weights;g+"); end @@ -118,9 +134,10 @@ function sd(raw_filename, dump_file_prefix, f) endfor printf("\n"); - plot(0,0,';lsp1;r'); - plot(0,0,';lsp2;b'); - sd_str = sprintf(";sd %3.2f dB*dB;", sd(fr)); + plot(0,0,';lsp enc;r'); + plot(0,0,';lsp dec;b'); + plot(0,0,';mel dec;g'); + sd_str = sprintf(";sd %3.2f dB*dB;", sd(f)); plot(0,0,sd_str); hold off; diff --git a/codec2-dev/src/c2sim.c b/codec2-dev/src/c2sim.c index f0ed0efb..89afbd04 100644 --- a/codec2-dev/src/c2sim.c +++ b/codec2-dev/src/c2sim.c @@ -235,8 +235,8 @@ int main(int argc, char *argv[]) } else if(strcmp(long_options[option_index].name, "dec") == 0) { decimate = atoi(optarg); - if ((decimate != 2) && (decimate != 4)) { - fprintf(stderr, "Error in --dec, must be 2 or 4\n"); + if ((decimate != 2) && (decimate != 3) && (decimate != 4)) { + fprintf(stderr, "Error in --dec, must be 2, 3, or 4\n"); exit(1); } @@ -624,20 +624,42 @@ int main(int argc, char *argv[]) mel[i] = floor(2595.0*log10(1.0 + f/700.0) + 0.5); } + /* round to the nearest x hz */ + #define MEL_ROUND 50 + 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] = bpf_out[i]; + bpf_speech[i] = speech[i]; /* frame 1 --------------------------------------------------------*/ diff --git a/codec2-dev/src/dump.c b/codec2-dev/src/dump.c index 82600727..f172424d 100644 --- a/codec2-dev/src/dump.c +++ b/codec2-dev/src/dump.c @@ -56,6 +56,7 @@ static FILE *flsp = NULL; static FILE *fweights = NULL; static FILE *flsp_ = NULL; static FILE *fmel = NULL; +static FILE *fmel_indexes = NULL; static FILE *fphase = NULL; static FILE *fphase_ = NULL; static FILE *ffw = NULL; @@ -107,6 +108,8 @@ void dump_off(){ fclose(flsp_); if (fmel != NULL) fclose(fmel); + if (fmel_indexes != NULL) + fclose(fmel_indexes); if (fphase != NULL) fclose(fphase); if (fphase_ != NULL) @@ -494,6 +497,23 @@ void dump_mel(float mel[], int order) { fprintf(fmel,"\n"); } +void dump_mel_indexes(int mel_indexes[], int order) { + int i; + char s[MAX_STR]; + + if (!dumpon) return; + + if (fmel_indexes == NULL) { + sprintf(s,"%s_mel_indexes.txt", prefix); + fmel_indexes = fopen(s, "wt"); + assert(fmel_indexes != NULL); + } + + for(i=0; i