lspd_quantise
- Scalar lsp difference quantiser.
+ Scalar/VQ LSP difference quantiser.
\*---------------------------------------------------------------------------*/
int order
)
{
- int i,k,m;
+ int i,k,m,ncb, nlsp, index;
float lsp_hz[LPC_MAX];
float lsp__hz[LPC_MAX];
float dlsp[LPC_MAX];
float dlsp_[LPC_MAX];
- float wt[1];
+ float wt[LPC_MAX];
const float *cb;
float se;
int indexes[LPC_MAX];
+ for(i=0; i<LPC_ORD; i++) {
+ wt[i] = 1.0;
+ }
+
/* convert from radians to Hz so we can use human readable
frequencies */
for(i=1; i<order; i++)
dlsp[i] = lsp_hz[i] - lsp_hz[i-1];
- /* simple uniform scalar quantisers */
+ /* simple uniform scalar quantisers for LSP differences 1..4 */
wt[0] = 1.0;
for(i=0; i<4; i++) {
else
lsp__hz[0] = dlsp_[0];
}
+
+ /* VQ LSP differences 5..10 in log domain */
+
+ ncb = 4;
+ nlsp = 4;
+ k = lsp_cbd[ncb].k;
+ m = lsp_cbd[ncb].m;
+ cb = lsp_cbd[ncb].cb;
+ for(i=4; i<order; i++) {
+ dlsp[i] = log10((PI/4000.0)*dlsp[i]);
+ printf("%f ", dlsp[i]);
+ }
+ printf("\n");
+ index = quantise(cb, &dlsp[nlsp], &wt[nlsp], k, m, &se);
+ for(i=0; i<6; i++)
+ printf("%f ", cb[i]);
+ printf("\n");
+ printf("index = %d\n", index);
+ for(i=4; i<order; i++) {
+ dlsp_[i] = (4000.0/PI)*pow(10.0, cb[index*k+i-nlsp]);
+ printf("%f ", cb[index*k+i-nlsp]);
+ lsp__hz[i] = lsp__hz[i-1] + dlsp_[i];
+ }
+ printf("\n");
+ for(i=4; i<order; i++)
+ printf("%f ", dlsp_[i]);
+ printf("\n\n");
+
+ /*
for(; i<order; i++)
lsp__hz[i] = lsp_hz[i];
-
+ */
+
/* convert back to radians */
for(i=0; i<order; i++)
#define NW 279 /* frame size in samples */
#define N 80 /* frame to frame shift */
#define THRESH 40.0 /* threshold energy/sample for frame inclusion */
+#define PI 3.141592654 /* mathematical constant */
#include <stdio.h>
#include <stdlib.h>
fprintf(flsp,"%f ",log10(lsp[0]));
for(i=1; i<P; i++) {
diff = lsp[i]-lsp[i-1];
- if (diff < 25.0) diff = 25.0;
+ if (diff < (PI/4000.0)*25.0) diff = (PI/4000.0)*25.0;
fprintf(flsp,"%f ",log10(diff));
}
}
void acc(float v1[], float v2[], int k);
void norm(float v[], int k, long n);
long quantise(float cb[], float vec[], int k, int m, float *se);
-void jnd(float x[], int k);
-
-float pi;
/*-----------------------------------------------------------------------* \
float delta; /* improvement in distortion */
FILE *ftrain; /* file containing training set */
FILE *fvq; /* file containing vector quantiser */
-
- pi = 4.0*atan(1.0);
+ int ret;
/* Interpret command line arguments */
/* set up initial codebook state from samples of training set */
rewind(ftrain);
- fread(cb, sizeof(float), k*m, ftrain);
+ ret = fread(cb, sizeof(float), k*m, ftrain);
/* main loop */
se = 0.0;
rewind(ftrain);
for(i=0; i<J; i++) {
- fread(vec, sizeof(float), k, ftrain);
+ ret = fread(vec, sizeof(float), k, ftrain);
ind = quantise(cb, vec, k, m, &se);
n[ind]++;
acc(¢[ind*k], vec, k);
} while (delta > DELTAQ);
- /* check % within JND */
-
- {
- long jnd;
- int cur_jnd;
- float diff, jnd_thresh = 50.0*pi/4000.0;
-
- jnd = 0;
- se = 0.0;
- rewind(ftrain);
- for(i=0; i<J; i++) {
- fread(vec, sizeof(float), k, ftrain);
- ind = quantise(cb, vec, k, m, &se);
- cur_jnd = 0;
- for(j=0; j<k; j++) {
- diff = cb[k*ind+j] - vec[j];
- if (fabs(diff) > jnd_thresh)
- cur_jnd = 1;
- if (cur_jnd) jnd++;
- }
- }
- printf("jnd %3.2f %%\n", 100.0*(float)jnd/(J*k));
- }
-
/* save codebook to disk */
fvq = fopen(argv[4],"wt");
return(besti);
}
-void jnd(float x[], int k) {
- float lsp_hz, step = 100.0;
- int i;
-
- for(i=0; i<k; i++) {
- lsp_hz = x[i]*4000.0/pi;
- lsp_hz = floor(lsp_hz/step + 0.5)*step;
- x[i] = lsp_hz*pi/4000.0;
- if (i) {
- if (x[i] == x[i-1])
- x[i] += step*pi/4000.0;
-
- }
- }
-}