/* Note that the lpc-lsp conversion finds the roots of polynomial with aniterativerootpolisher(CACMalgorithm283).It*is*possible toconfusethisalgorithmintonotconverging;thatshouldonly happenwithabsurdlycloselyspacedroots(verysharppeaksinthe LPCfresponse)whichinturnshouldbeimpossibleinouruseof thecode.Ifthis*does*happenanyway,it'sabuginthefloor finder;findthecauseoftheconfusion(probablyasinglebin spikeoraccidentalnear-float-limitresolutionproblems)and
correct it. */
/* three possible LSP to f curve functions; the exact computation (float),alookupbasedfloatimplementation,andaninteger implementation.Thefloatlookupislikelytheoptimalchoiceon anymachinewithanFPU.Theintegerimplementationis*not*fixed point(duetotheneedforalargedynamicrangeandthusa separatelytrackedexponent)andthusmuchmorecomplexthanthe relativelysimplefloatimplementations.It'smostlyforfuture workonafullyfixedpointimplementationforprocessorslikethe
ARM family. */
/* define either of these (preferably FLOAT_LOOKUP) to have faster
but less precise implementation. */ #undef FLOAT_LOOKUP #undef INT_LOOKUP
#ifdef FLOAT_LOOKUP #include"vorbis_lookup.c"/* catch this in the build system; we #include for compilers(likegcc)thatcan'tinlineacross
modules */
/* side effect: changes *lsp to cosines of lsp */ void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, float amp,float ampoffset){ int i; float wdel=M_PI/ln;
vorbis_fpu_control fpu;
if(m&1){ /* odd order filter; slightly assymetric */ /* the last coefficient */
q*=ftmp[0]-w;
q*=q;
p*=p*(1.f-w*w);
}else{ /* even order filter; still symmetric */
q*=q*(1.f+w);
p*=p*(1.f-w);
}
/* side effect: changes *lsp to cosines of lsp */ void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, float amp,float ampoffset){
/* 0 <= m < 256 */
/* set up for using all int later */ int i; int ampoffseti=rint(ampoffset*4096.f); int ampi=rint(amp*16.f); long *ilsp=alloca(m*sizeof(*ilsp)); for(i=0;i<m;i++)ilsp[i]=vorbis_coslook_i(lsp[i]/M_PI*65536.f+.5f);
i=0; while(i<n){ int j,k=map[i]; unsignedlong pi=46341; /* 2**-.5 in 0.16 */ unsignedlong qi=46341; int qexp=0,shift; long wi=vorbis_coslook_i(k*65536/ln);
/* we've let the normalization drift because it wasn't important; however,forthelookup,thingsmustbenormalizedagain.We
need at most one right shift or a number of left shifts */
if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */
qi>>=1; qexp++;
}else while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/
qi<<=1; qexp--;
}
/* for spit-and-polish only */ staticint Newton_Raphson(float *a,int ord,float *r){ int i, k, count=0; double error=1.f; double *root=alloca(ord*sizeof(*root));
/* Replaced the original bubble sort with a real sort. With your
help, we can eliminate the bubble sort in our lifetime. --Monty */
for(i=0; i<ord;i++) r[i] = root[i]; return(0);
}
/* Convert lpc coefficients to lsp coefficients */ int vorbis_lpc_to_lsp(float *lpc,float *lsp,int m){ int order2=(m+1)>>1; int g1_order,g2_order; float *g1=alloca(sizeof(*g1)*(order2+1)); float *g2=alloca(sizeof(*g2)*(order2+1)); float *g1r=alloca(sizeof(*g1r)*(order2+1)); float *g2r=alloca(sizeof(*g2r)*(order2+1)); int i;
/* even and odd are slightly different base cases */
g1_order=(m+1)>>1;
g2_order=(m) >>1;
/* Compute the lengths of the x polynomials. */ /* Compute the first half of K & R F1 & F2 polynomials. */ /* Compute half of the symmetric and antisymmetric polynomials. */ /* Remove the roots at +1 and -1. */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.