⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codebook.c

📁 16kb/s Low Delay CELP 算法
💻 C
字号:
/*************************************************************************//*                                                                       *//*                            LD-CELP  G.728                             *//*                                                                       *//*    Low-Delay Code Excitation Linear Prediction speech compression.    *//*                                                                       *//*    Code edited by Michael Concannon.                                  *//*    Based on code written by Alex Zatsman, Analog Devices 1993         *//*                                                                       *//*************************************************************************/#include "common.h"#include "prototyp.h"#include "fast.h"#include "data.h"/* Impulse Response Vector Calculator */void iresp_vcalc(real COEFF_MEM sf_co[], 		  real COEFF_MEM pwf_z_co[], real COEFF_MEM pwf_p_co[], 		  real h[]){    static real temp[IDIM];    static real rc[IDIM];    real a0,a1,a2;    int i,k;    temp[0] = rc[0] = 1.0;    for (k=1; k<IDIM; k++) {   	a0=a1=a2=0.0;   	for (i=k; i>=1; i--) {	    temp[i] = temp[i-1];	    rc[i] = rc[i-1];	    a0 -= sf_co[i]   * temp[i];	    a1 += pwf_z_co[i] * temp[i];	    a2 -= pwf_p_co[i] * rc[i];  	}   	temp[0] = a0;   	rc[0] = a0+a1+a2;    }    for (k=0; k<IDIM; k++)	h[k] = rc[IDIM-1-k];}/* Cb_shape Codevector Convolution Module and Energy Table Calculator *//* The output is energy table */#ifdef PIPELINEvoidshape_conv(real h[], real shen[]){    int j;    real *shep = shen;    real CBMEM *cp = (real CBMEM *) cb_shape;    real *hp = h;    real	lmul1, lmul2, rmul1, rmul2, ladd1, ladd2, ladd3, radd1, radd2;#define e0  ladd1#define x0  ladd2#define x2  ladd2#define x4  ladd2#define x1  ladd3#define x3  ladd3#define e1  radd1#define e2  radd1#define e3  radd1#define e4  radd1#define t01 radd1#define t11 radd1#define t12 radd1#define t22 radd1#define t40 radd1#define t20 radd2#define t21 radd2#define t03 radd2#define t13 radd2#define t31 radd2#define c0 lmul1#define c2 lmul1#define c4 lmul1#define c1 lmul2#define c3 lmul2#define h0 rmul1#define h2 rmul1#define h4 rmul1#define h1 rmul2#define h3 rmul2    for (j=0; j<NCWD; j++) {				c0=*cp++; h0=*hp++;		x0 =c0*h0;		e0 =x0*x0;	c1=*cp--;		x1 =c1*h0;	c0=*cp++; h1=*hp++;		t01=c0*h1;		  h2=*hp--;x1+=t01;	x2 =c0*h2;		e1 =x1*x1;	c1=*cp++; h1=*hp--;e0+=e1;		t11=c1*h1;	c2=*cp++; h0=*hp++;x2+=t11;	t20=c2*h0;	c3=*cp--;x2+=t20;	x3 =c3*h0;		e2 =x2*x2;	c2=*cp--; h1=*hp++;e0+=e2;		t21=c2*h1;	c1=*cp--; h2=*hp++;x3+=t21;	t12=c1*h2;	c0=*cp++; h3=*hp++;x3+=t12;	t03=c0*h3;		  h4=*hp--;x3+=t03;	x4 =c0*h4;		e3 =x3*x3;	c1=*cp++; h3=*hp--;e0+=e3;		t13=c1*h3;	c2=*cp++; h2=*hp--;x4+=t13;	t22=c2*h2;	c3=*cp++; h1=*hp--;x4+=t22;	t31=c3*h1;	c4=*cp++; h0=*hp;x4+=t31;	t40=c4*h0;x4+=t40;		e4=x4*x4;e0+=e4;				*shep++=e0;    }}#else/** Unoptimized version -- kept for reference */voidshape_conv(real h[], real shen[]){    int j;    real h0 = h[0], h1 = h[1], h2 = h[2], h3 = h[3], h4 = h[4], tmp;    for (j=0; j<NCWD; j++) {	real energy=0;	tmp = h0*cb_shape[j][0];	energy += tmp*tmp;	tmp = h0*cb_shape[j][1] + h1*cb_shape[j][0];	energy += tmp*tmp;	tmp = h0*cb_shape[j][2] + h1*cb_shape[j][1] + h2*cb_shape[j][0];	energy += tmp*tmp;	tmp = h0*cb_shape[j][3] + h1*cb_shape[j][2] + h2*cb_shape[j][1] +	      h3*cb_shape[j][0];	energy += tmp*tmp;	tmp = h0*cb_shape[j][4] + h1*cb_shape[j][3] + h2*cb_shape[j][2] +	      h3*cb_shape[j][1] + h4*cb_shape[j][0];	energy += tmp*tmp;	shen[j] = energy;    }}#endif/* Time Reversed Convolution Module -- Block 13 */voidtrev_conv(real h[], real target[],	  real pn[]){    int j, k;    for (k=0; k<IDIM; k++) {	real tmp=0.0;   	for (j=k; j<IDIM; j++)	    tmp += target[j]*h[j-k];	pn[k] = tmp;    }}/* Error Calculator and Best Codebook Index Selector *//* Blocks 17 and 18 */voidcb_excitation (int ix, real v[]){    int	i,	sx = ix >>3,	gx = ix & 7;    real gain = cb_gain[gx];    for(i=0; i<IDIM; i++)	v[i] = cb_shape[sx][i] * gain;}#define GTINC(A,B,X) if(A>B)X++intcb_index (real pn[]){    real  d, distm = BIG;    int	j,	is=0,		/* best shape index */	ig=0,		/* best gain index */	idxg,		/* current gain index */	ichan;		/* resulting combined index */    real CBMEM *shape_ptr = (real CBMEM *) cb_shape;    real *sher_ptr  = shape_energy;    real pcor, b0, b1, b2;    real *pb=pn;    real g2, gsq;    register real	cgm0 REG(r0) = cb_gain_mid_0,	cgm1 REG(r1) = cb_gain_mid_1,	x REG(r2),	cgm2  = cb_gain_mid_2,	energy REG(r4), y REG(r5),	cor REG(r8) = 0,	t REG(r12);    register int minus5 REG(m0) = -5;        for (j=0; j<NCWD; j++) {	cor=cor-cor;	energy = *sher_ptr++;	b0 = cgm0 * energy; x=*shape_ptr++; y=*pb++;	            t=x*y;  x=*shape_ptr++; y=*pb++;	cor+=t;     t=x*y;  x=*shape_ptr++; y=*pb++;	cor+=t;     t=x*y;  x=*shape_ptr++; y=*pb++;	cor+=t;     t=x*y;  x=*shape_ptr++; y=*pb++;	cor+=t;     t=x*y;	cor+=t;     b1 = cgm1 * energy;		pb += minus5;	b2 = cgm2 * energy;	idxg=idxg-idxg;	pcor = cor;	if (cor < 0.0) {	    pcor = -cor;	    idxg += 4;	}	GTINC(pcor, b0, idxg);	GTINC(pcor, b1, idxg);	GTINC(pcor, b2, idxg);		g2 = cb_gain2[idxg];	gsq = cb_gain_sq[idxg];	d = gsq * energy - g2 * cor;		if (d < distm) {	    ig = idxg;	    is = j;	    distm = d;	}    }    ichan = (is  << 3) + ig;    return ichan;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -