- float amp;
- long bits=0;
- long val=0;
- static int seq=0;
-
-#ifdef TRAIN_LSP
- FILE *of;
- FILE *ef;
- char buffer[80];
-
-#if 1
- sprintf(buffer,"lsp0coeff_%d.vqd",vb->mode);
- of=fopen(buffer,"a");
-#endif
-#endif
-
- /* our floor comes in on a [-Inf...0] dB scale. The curve has to be
- positive, so we offset it. */
-
- for(j=0;j<look->n;j++)
- flr[j]+=info->ampdB;
-
- /* use 'out' as temp storage */
- /* Convert our floor to a set of lpc coefficients */
- amp=sqrt(_curve_to_lpc(flr,flr,look));
-
- /* amp is in the range (0. to ampdB]. Encode that range using
- ampbits bits */
-
- {
- long maxval=(1L<<info->ampbits)-1;
-
- val=rint(amp/info->ampdB*maxval);
-
- if(val<0)val=0; /* likely */
- if(val>maxval)val=maxval; /* not bloody likely */
-
- oggpack_write(&vb->opb,val,info->ampbits);
- if(val>0)
- amp=(float)val/maxval*info->ampdB;
- else
- amp=0;
- }
-
- if(val){
- float *lspwork=alloca(look->m*sizeof(float));
-
- /* the spec supports using one of a number of codebooks. Right
- now, encode using this lib supports only one */
- backend_lookup_state *be=vb->vd->backend_state;
- codebook *b;
- int booknum;
-
- /* LSP <-> LPC is orthogonal and LSP quantizes more stably */
- _analysis_output("lpc",seq,flr,look->m,0,0);
-
- vorbis_lpc_to_lsp(flr,flr,look->m);
-
- _analysis_output("lsp",seq,flr,look->m,0,0);
-
-#ifdef ANALYSIS
- {
- float *lspwork2=alloca(look->m*sizeof(float));
- memcpy(lspwork2,flr,sizeof(float)*look->m);
- memcpy(lspwork,flr,sizeof(float)*look->m);
- vorbis_lsp_to_curve(flr,look->linearmap,look->n,look->ln,
- lspwork2,look->m,amp,info->ampdB);
-
- _analysis_output("prefit",seq++,flr,look->n,0,1);
- memcpy(flr,lspwork,sizeof(float)*look->m);
- }
-
-#endif
-
- /* which codebook to use? We do it only by range right now. */
- if(info->numbooks>1){
- float last=0.;
- for(j=0;j<look->m;j++){
- float val=flr[j]-last;
- if(val<info->lessthan || val>info->greaterthan)break;
- last=flr[j];
- }
- if(j<look->m)
- booknum=0;
- else
- booknum=1;
- }else
- booknum=0;
-
- b=be->fullbooks+info->books[booknum];
- oggpack_write(&vb->opb,booknum,_ilog(info->numbooks));