int bpf_en = 0;
int bpfb_en = 0;
float bpf_buf[BPF_N+N];
-
+ float lspmelvq_mse = 0.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 },
{ "lspmelread", required_argument, &lspmelread, 1 },
- { "lspmelvq", required_argument, &lspmelvq, 1 },
+ { "lspmelvq", no_argument, &lspmelvq, 1 },
{ "lsp", no_argument, &lsp, 1 },
{ "lspd", no_argument, &lspd, 1 },
{ "lspvq", no_argument, &lspvq, 1 },
f = (4000.0/PI)*lsps[i];
mel[i] = floor(2595.0*log10(1.0 + f/700.0) + 0.5);
}
-
+
#ifdef DUMP
dump_mel(mel, order);
#endif
-
+
encode_mels_scalar(mel_indexes, mel, 6);
#ifdef DUMP
dump_mel_indexes(mel_indexes, 6);
//decode_mels_scalar(mel, mel_indexes, 6);
/* read in VQed lsp-mels from octave/melvq.m */
-
+
if (lspmelread) {
- int ret = fread(mel, sizeof(float), order, flspmel);
+ float mel_[order];
+ int ret = fread(mel_, sizeof(float), order, flspmel);
assert(ret == order);
+ for(i=0; i<order; i++) {
+ lspmelvq_mse += pow(mel[i] - mel_[i], 2.0);
+ mel[i] = mel_[i];
+ }
}
-
+
if (lspmelvq) {
- lspmelvq_quantise(mel, mel, 6);
+ //lspmelvq_mse += lspmelvq_quantise(mel, mel, order);
+ lspmelvq_mse += lspmelvq_mbest_quantise(mel, mel, order, 5);
}
-
+
/* ensure no unstable filters after quantisation */
-
+
#define MEL_ROUND 10
for(i=1; i<order; i++) {
if (mel[i] <= mel[i-1]+MEL_ROUND) {
i = 1;
}
}
-
+
for(i=0; i<order; i++) {
f_ = 700.0*( pow(10.0, mel[i]/2595.0) - 1.0);
lsps_[i] = f_*(PI/4000.0);
}
-
+
lsp_to_lpc(lsps_, ak, order);
+
}
-
+
if (scalar_quant_Wo_e) {
e = decode_energy(encode_energy(e, E_BITS), E_BITS);
model.Wo = decode_Wo(encode_Wo(model.Wo, WO_BITS), WO_BITS);
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 */
for(i=0; i<decimate-1; i++)
model_dec[i] = model_dec[i+1];
model_dec[decimate-1] = model;
-
+
if ((frames % decimate) == 0) {
for(i=0; i<order; i++)
lsps_dec[decimate-1][i] = lsps_[i];
synth_one_frame(fft_inv_cfg, buf, &model_dec[i], Sn_, Pn, prede, &de_mem, gain);
if (fout != NULL) fwrite(buf,sizeof(short),N,fout);
}
- /*
- for(i=0; i<decimate; i++) {
- printf("%d Wo: %f L: %d v: %d\n", frames, model_dec[i].Wo, model_dec[i].L, model_dec[i].voiced);
- }
- if (frames == 4*50)
- exit(0);
- */
+
/* update memories for next frame ----------------------------*/
prev_model_dec = model_dec[decimate-1];
}
}
-
+
/*----------------------------------------------------------------*\
End Main Loop
\*----------------------------------------------------------------*/
fclose(fin);
-
+
if (fout != NULL)
fclose(fout);
- if (lpc_model)
+ if (lpc_model) {
fprintf(stderr, "SNR av = %5.2f dB\n", sum_snr/frames);
+ if (lspmelvq || lspmelread)
+ fprintf(stderr, "lspmelvq std = %3.1f Hz\n", sqrt(lspmelvq_mse/frames));
+ }
if (phaseexp)
phase_experiment_destroy(pexp);
}
-/* simple (non mbest) 6th order LSP MEL VQ quantiser */
+/* simple (non mbest) 6th order LSP MEL VQ quantiser. Returns MSE of result */
-void lspmelvq_quantise(float *x, float *xq, int order)
+float 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];
+ float err[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];
+ float mse;
assert(order == lspmelvq_cb[0].k);
n1 = find_nearest(codebook1, lspmelvq_cb[0].m, x, order);
-
+
for (i=0; i<order; i++) {
tmp[i] = codebook1[order*n1+i];
err[i] = x[i] - tmp[i];
n3 = find_nearest(codebook3, lspmelvq_cb[2].m, err, order);
+ mse = 0.0;
for (i=0; i<order; i++) {
tmp[i] += codebook3[order*n3+i];
+ err[i] = x[i] - tmp[i];
+ mse += err[i]*err[i];
}
for (i=0; i<order; i++) {
xq[i] = tmp[i];
}
+
+ return mse;
}
-#ifdef __EXPERIMENTAL__
-
#define MBEST_STAGES 4
struct MBEST_LIST {
static void mbest_print(char title[], struct MBEST *mbest) {
int i,j;
- printf("%s\n", title);
+ fprintf(stderr, "%s\n", title);
for(i=0; i<mbest->entries; i++) {
for(j=0; j<MBEST_STAGES; j++)
- printf(" %4d ", mbest->list[i].index[j]);
- printf(" %f\n", mbest->list[i].error);
+ fprintf(stderr, " %4d ", mbest->list[i].index[j]);
+ fprintf(stderr, " %f\n", mbest->list[i].error);
}
}
}
-/* 3 stage VQ LSP quantiser. Design and guidance kindly submitted by Anssi, OH3GDD */
+/* 3 stage VQ LSP quantiser useing mbest search. Design and guidance kindly submitted by Anssi, OH3GDD */
-void lspanssi_quantise(float *x, float *xq, int ndim, int mbest_entries)
+float lspmelvq_mbest_quantise(float *x, float *xq, int ndim, int mbest_entries)
{
- int i, j, n1, n2, n3, n4;
- float w[LPC_ORD];
- const float *codebook1 = lsp_cbvqanssi[0].cb;
- const float *codebook2 = lsp_cbvqanssi[1].cb;
- const float *codebook3 = lsp_cbvqanssi[2].cb;
- const float *codebook4 = lsp_cbvqanssi[3].cb;
- struct MBEST *mbest_stage1, *mbest_stage2, *mbest_stage3, *mbest_stage4;
- float target[LPC_ORD];
+ int i, j, n1, n2, n3;
+ const float *codebook1 = lspmelvq_cb[0].cb;
+ const float *codebook2 = lspmelvq_cb[1].cb;
+ const float *codebook3 = lspmelvq_cb[2].cb;
+ struct MBEST *mbest_stage1, *mbest_stage2, *mbest_stage3;
+ float target[ndim];
+ float w[ndim];
int index[MBEST_STAGES];
+ float mse, tmp;
+ for(i=0; i<ndim; i++)
+ w[i] = 1.0;
mbest_stage1 = mbest_create(mbest_entries);
mbest_stage2 = mbest_create(mbest_entries);
mbest_stage3 = mbest_create(mbest_entries);
- mbest_stage4 = mbest_create(mbest_entries);
for(i=0; i<MBEST_STAGES; i++)
index[i] = 0;
- compute_weights_anssi_mode2(x, w, ndim);
-
- #ifdef DUMP
- dump_weights(w, ndim);
- #endif
-
/* Stage 1 */
- mbest_search(codebook1, x, w, ndim, lsp_cbvqanssi[0].m, mbest_stage1, index);
- mbest_print("Stage 1:", mbest_stage1);
+ mbest_search(codebook1, x, w, ndim, lspmelvq_cb[0].m, mbest_stage1, index);
+ //mbest_print("Stage 1:", mbest_stage1);
/* Stage 2 */
index[1] = n1 = mbest_stage1->list[j].index[0];
for(i=0; i<ndim; i++)
target[i] = x[i] - codebook1[ndim*n1+i];
- mbest_search(codebook2, target, w, ndim, lsp_cbvqanssi[1].m, mbest_stage2, index);
+ mbest_search(codebook2, target, w, ndim, lspmelvq_cb[1].m, mbest_stage2, index);
}
- mbest_print("Stage 2:", mbest_stage2);
+ //mbest_print("Stage 2:", mbest_stage2);
/* Stage 3 */
index[1] = n2 = mbest_stage2->list[j].index[0];
for(i=0; i<ndim; i++)
target[i] = x[i] - codebook1[ndim*n1+i] - codebook2[ndim*n2+i];
- mbest_search(codebook3, target, w, ndim, lsp_cbvqanssi[2].m, mbest_stage3, index);
+ mbest_search(codebook3, target, w, ndim, lspmelvq_cb[2].m, mbest_stage3, index);
}
- mbest_print("Stage 3:", mbest_stage3);
-
- /* Stage 4 */
-
- for (j=0; j<mbest_entries; j++) {
- index[3] = n1 = mbest_stage3->list[j].index[2];
- index[2] = n2 = mbest_stage3->list[j].index[1];
- index[1] = n3 = mbest_stage3->list[j].index[0];
- for(i=0; i<ndim; i++)
- target[i] = x[i] - codebook1[ndim*n1+i] - codebook2[ndim*n2+i] - codebook3[ndim*n3+i];
- mbest_search(codebook4, target, w, ndim, lsp_cbvqanssi[3].m, mbest_stage4, index);
+ //mbest_print("Stage 3:", mbest_stage3);
+
+ n1 = mbest_stage3->list[0].index[2];
+ n2 = mbest_stage3->list[0].index[1];
+ n3 = mbest_stage3->list[0].index[0];
+ mse = 0.0;
+ for (i=0;i<ndim;i++) {
+ tmp = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i];
+ mse += (x[i]-tmp)*(x[i]-tmp);
+ xq[i] = tmp;
}
- mbest_print("Stage 4:", mbest_stage4);
-
- n1 = mbest_stage4->list[0].index[3];
- n2 = mbest_stage4->list[0].index[2];
- n3 = mbest_stage4->list[0].index[1];
- n4 = mbest_stage4->list[0].index[0];
- for (i=0;i<ndim;i++)
- xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i] + codebook4[ndim*n4+i];
mbest_destroy(mbest_stage1);
mbest_destroy(mbest_stage2);
mbest_destroy(mbest_stage3);
- mbest_destroy(mbest_stage4);
+
+ return mse;
}
-#endif
+
int check_lsp_order(float lsp[], int order)
{