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

📄 filters_tm.h

📁 一个开源的sip源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
	if(ord==10)
		fir_mem16_10(x, num, y, N, mem);
	else if (ord==8)
		fir_mem16_8(x, num, y, N, mem);

#ifndef REMARK_ON
   	(void)stack;
#endif

	FIRMEM16_STOP();
}



#define OVERRIDE_SYN_PERCEP_ZERO16
void syn_percep_zero16(const Int16 *xx, const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N, int ord, char *stack)
{
	register int i,j;
	VARDECL(Int32 *mem);
	ALLOC(mem, ord, Int32);
	
	TMDEBUG_ALIGNMEM(mem);

	for ( i=0,j=0 ; i<ord ; ++i,j+=4 )
		st32d(j,mem,0);
	iir_mem16(xx, ak, y, N, ord, mem, stack);
	for ( i=0,j=0 ; i<ord ; ++i,j+=4 )
		st32d(j,mem,0);
	filter_mem16(y, awk1, awk2, y, N, ord, mem, stack);
}


#define OVERRIDE_RESIDUE_PERCEP_ZER016
void residue_percep_zero16(const Int16 *xx, const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N, int ord, char *stack)
{
	register int i,j;
	VARDECL(Int32 *mem);
	ALLOC(mem, ord, Int32);

	TMDEBUG_ALIGNMEM(mem);

	for ( i=0,j=0 ; i<ord ; ++i,j+=4 )
		st32d(j,mem,0);
	filter_mem16(xx, ak, awk1, y, N, ord, mem, stack);
	for ( i=0,j=0 ; i<ord ; ++i,j+=4 )
		st32d(j,mem,0);
	fir_mem16(y, awk2, y, N, ord, mem, stack);
}



void compute_impulse_response_10(const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N)
{
	register int awk_01, awk_23, awk_45, awk_67, awk_89;
	register int y10, y32, y54, y76, y98, yi;
	register int i, acc0, acc1, N_2;

	N_2		= N << 1;

	awk_01 = ld32(awk1); 
	awk_23 = ld32x(awk1,1); 
	awk_45 = ld32x(awk1,2); 
	awk_67 = ld32x(awk1,3); 
	awk_89 = ld32x(awk1,4);

	y10 = funshift2(awk_01, LPC_SCALING << 16);
	st32d(0, y, y10);
	y32 = funshift2(awk_23, awk_01);
	st32d(4, y, y32);
	y54 = funshift2(awk_45, awk_23);
	st32d(8, y, y54);
	y76 = funshift2(awk_67, awk_45);
	st32d(12, y, y76);
	y98 = funshift2(awk_89, awk_67);
	st32d(16, y, y98);
	y10 = funshift2(0, awk_89);
	st32d(20, y, y10);
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unroll=2
#pragma TCS_unrollexact=1
#endif
	for ( i=24 ; i<N_2 ; i+=4 )
	{	st32d(i, y, 0);
	}
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
	y10 = y32 = y54 = y76 = y98 = 0;
	awk_01 = ld32(awk2); 
	awk_23 = ld32x(awk2,1); 
	awk_45 = ld32x(awk2,2); 
	awk_67 = ld32x(awk2,3); 
	awk_89 = ld32x(awk2,4);	
	
	awk_01 = funshift2(awk_01, awk_01);
	awk_23 = funshift2(awk_23, awk_23);
	awk_45 = funshift2(awk_45, awk_45);
	awk_67 = funshift2(awk_67, awk_67);
	awk_89 = funshift2(awk_89, awk_89);

#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
#endif
	for ( i=0 ; i<N ; ++i )
	{
		yi	= y[i];

		acc0 = ifir16(y10, awk_89) + ifir16(y32, awk_67);
		acc1 = ifir16(y54, awk_45) + ifir16(y76, awk_23);
		yi   += PSHR32(acc0 + acc1 + ifir16(y98, awk_01),LPC_SHIFT);
		y[i] = yi;

		y10 = funshift2(y32, y10);
		y32 = funshift2(y54, y32);
		y54 = funshift2(y76, y54);
		y76 = funshift2(y98, y76);
		y98 = funshift2(ineg(yi), y98);
	}
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
	y10 = y32 = y54 = y76 = y98 = 0;
	awk_01 = ld32(ak); 
	awk_23 = ld32x(ak,1); 
	awk_45 = ld32x(ak,2); 
	awk_67 = ld32x(ak,3); 
	awk_89 = ld32x(ak,4);
	awk_01 = funshift2(awk_01, awk_01);
	awk_23 = funshift2(awk_23, awk_23);
	awk_45 = funshift2(awk_45, awk_45);
	awk_67 = funshift2(awk_67, awk_67);
	awk_89 = funshift2(awk_89, awk_89);
	
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
#endif
	for ( i=0 ; i<N ; ++i )
	{
		yi	= y[i];

		acc0 = ifir16(y10, awk_89) + ifir16(y32, awk_67);
		acc1 = ifir16(y54, awk_45) + ifir16(y76, awk_23);
		yi   = PSHR32(SHL32(yi,LPC_SHIFT+1) + acc0 + acc1 + ifir16(y98, awk_01),LPC_SHIFT);
		y[i] = yi;

		y10 = funshift2(y32, y10);
		y32 = funshift2(y54, y32);
		y54 = funshift2(y76, y54);
		y76 = funshift2(y98, y76);
		y98 = funshift2(ineg(yi), y98);
	}
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
}

void compute_impulse_response_8(const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N)
{
	register int awk_01, awk_23, awk_45, awk_67;
	register int y10, y32, y54, y76, yi;
	register int i, acc0, acc1, N_2;

	N_2		= N << 1;

	awk_01 = ld32(awk1); 
	awk_23 = ld32x(awk1,1); 
	awk_45 = ld32x(awk1,2); 
	awk_67 = ld32x(awk1,3);

	y10 = funshift2(awk_01, LPC_SCALING << 16);
	st32d(0, y, y10);
	y32 = funshift2(awk_23, awk_01);
	st32d(4, y, y32);
	y54 = funshift2(awk_45, awk_23);
	st32d(8, y, y54);
	y76 = funshift2(awk_67, awk_45);
	st32d(12, y, y76);
	y10 = funshift2(0, awk_67);
	st32d(16, y, y10);
	st32d(20, y, 0);

#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unroll=2
#pragma TCS_unrollexact=1
#endif
	for ( i=24 ; i<N_2 ; i+=4 )
	{	st32d(i, y, 0);
	}
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
	y10 = y32 = y54 = y76 = 0;
	awk_01 = ld32(awk2); 
	awk_23 = ld32x(awk2,1); 
	awk_45 = ld32x(awk2,2); 
	awk_67 = ld32x(awk2,3); 
	
	awk_01 = funshift2(awk_01, awk_01);
	awk_23 = funshift2(awk_23, awk_23);
	awk_45 = funshift2(awk_45, awk_45);
	awk_67 = funshift2(awk_67, awk_67);
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
#endif
	for ( i=0 ; i<N ; ++i )
	{
		yi	= y[i];

		acc0 = ifir16(y10, awk_67) + ifir16(y32, awk_45);
		acc1 = ifir16(y54, awk_23) + ifir16(y76, awk_01);
		yi   += PSHR32(acc0 + acc1,LPC_SHIFT);
		y[i] = yi;

		y10 = funshift2(y32, y10);
		y32 = funshift2(y54, y32);
		y54 = funshift2(y76, y54);
		y76 = funshift2(ineg(yi), y76);
	}
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
	y10 = y32 = y54 = y76 = 0;
	awk_01 = ld32(ak); 
	awk_23 = ld32x(ak,1); 
	awk_45 = ld32x(ak,2); 
	awk_67 = ld32x(ak,3);
	awk_01 = funshift2(awk_01, awk_01);
	awk_23 = funshift2(awk_23, awk_23);
	awk_45 = funshift2(awk_45, awk_45);
	awk_67 = funshift2(awk_67, awk_67);
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
#endif	
	for ( i=0 ; i<N ; ++i )
	{
		yi	= y[i];

		acc0 = ifir16(y10, awk_67) + ifir16(y32, awk_45);
		acc1 = ifir16(y54, awk_23) + ifir16(y76, awk_01);
		yi   = PSHR32(SHL32(yi,LPC_SHIFT+1) + acc0 + acc1,LPC_SHIFT);
		y[i] = yi;

		y10 = funshift2(y32, y10);
		y32 = funshift2(y54, y32);
		y54 = funshift2(y76, y54);
		y76 = funshift2(ineg(yi), y76);
	}
#if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
}


#define OVERRIDE_COMPUTE_IMPULSE_RESPONSE
void compute_impulse_response(const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N, int ord, char *stack)
{
	TMDEBUG_ALIGNMEM(ak);
	TMDEBUG_ALIGNMEM(awk1);
	TMDEBUG_ALIGNMEM(awk2);
	TMDEBUG_ALIGNMEM(y);

	COMPUTEIMPULSERESPONSE_START();
	if ( ord == 10 )
		compute_impulse_response_10(ak,awk1,awk2,y,N);
	else
		compute_impulse_response_8(ak,awk1,awk2,y,N);

	(void)stack;

	COMPUTEIMPULSERESPONSE_STOP();
}


#define OVERRIDE_QMFSYNTH
void qmf_synth(const Int16 *x1, const Int16 *x2, const Int16 *a, Int16 *y, int N, int M, Int32 *mem1, Int32 *mem2, char *stack)
   /* assumptions:
      all odd x[i] are zero -- well, actually they are left out of the array now
      N and M are multiples of 4 */
{
	register int i, j;
	register int M2, N2;
	VARDECL(int *x12);
	M2 = M>>1;
	N2 = N>>1;
	ALLOC(x12, M2+N2, int);


	TMDEBUG_ALIGNMEM(a);
	TMDEBUG_ALIGNMEM(x12);
	TMDEBUG_ALIGNMEM(mem1);
	TMDEBUG_ALIGNMEM(mem2);

	QMFSYNTH_START();
   
#if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
#endif	
	for ( i=0 ; i<N2 ; ++i )
	{	register int index = N2-1-i;
		x12[i] = pack16lsb(x1[index],x2[index]);
	}

	for ( j= 0; j<M2 ; ++j)
	{	register int index = (j << 1) + 1;
		x12[N2+j] = pack16lsb(mem1[index],mem2[index]);
	}
#if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif	 
	for (i = 0; i < N2; i += 2) 
	{
		register int y0, y1, y2, y3;
		register int x12_0;

		y0 = y1 = y2 = y3 = 0;
		x12_0 = x12[N2-2-i];

		for (j = 0; j < M2; j += 2) 
		{
			register int x12_1;
			register int a10, a11, a0_0;
			register int _a10, _a11, _a0_0;

			a10 = ld32x(a,j);
			a11 = pack16msb(a10,a10);
			a0_0= pack16lsb(a10,ineg(sex16(a10)));
			x12_1 = x12[N2-1+j-i];

			y0 += ifir16(a0_0,x12_1);
			y1 += ifir16(a11, x12_1);
			y2 += ifir16(a0_0,x12_0);
			y3 += ifir16(a11 ,x12_0);


			_a10   = ld32x(a,j+1);
			_a11   = pack16msb(_a10,_a10);
			_a0_0  = pack16lsb(_a10,ineg(sex16(_a10)));
			x12_0  = x12[N2+j-i];
			
			y0 += ifir16(_a0_0,x12_0);
			y1 += ifir16(_a11, x12_0);
			y2 += ifir16(_a0_0,x12_1);
			y3 += ifir16(_a11 ,x12_1);

		}
		y[2*i]   = EXTRACT16(SATURATE32(PSHR32(y0,15),32767));
		y[2*i+1] = EXTRACT16(SATURATE32(PSHR32(y1,15),32767));
		y[2*i+2] = EXTRACT16(SATURATE32(PSHR32(y2,15),32767));
		y[2*i+3] = EXTRACT16(SATURATE32(PSHR32(y3,15),32767));
	}

#if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
#endif	
	for (i = 0; i < M2; ++i)
	{	mem1[2*i+1] = asri(16,x12[i]);
		mem2[2*i+1] = sex16(x12[i]);
	}
#if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif	 

	QMFSYNTH_STOP();
}


#define OVERRIDE_QMFDECOMP
void qmf_decomp(const Int16 *xx, const Int16 *aa, Int16 *y1, Int16 *y2, int N, int M, Int16 *mem, char *stack)
{
	VARDECL(int *_a);
	VARDECL(int *_x);
	register int i, j, k, MM, M2, N2;  
	register int _xx10, _mm10;
	register int *_x2;

	M2=M>>1;
	N2=N>>1;
	MM=(M-2)<<1;

	ALLOC(_a, M2, int);
	ALLOC(_x, N2+M2, int);
	_x2 = _x + M2 - 1;

	TMDEBUG_ALIGNMEM(xx);
	TMDEBUG_ALIGNMEM(aa);
	TMDEBUG_ALIGNMEM(y1);
	TMDEBUG_ALIGNMEM(y2);
	TMDEBUG_ALIGNMEM(mem);
	TMDEBUG_ALIGNMEM(_a);
	TMDEBUG_ALIGNMEM(_x);

	QMFDECOMP_START();

	_xx10 = ld32(xx);
	_xx10 = dualasr(_xx10,1);
	_mm10 = ld32(mem);
	_x2[0] = pack16lsb(_xx10,_mm10);

#if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0)
#pragma TCS_unroll=2
#pragma TCS_unrollexact=1
#endif	
	for ( i=0 ; i<M2 ; ++i )
	{	register int a10;
		
		a10 = ld32x(aa,i);
		a10 = funshift2(a10, a10);
		_a[M2-i-1] = a10;		
	}

	for ( j=1 ; j<N2 ; ++j )
	{	register int _xx32;

		_xx32   = ld32x(xx,j);
		_xx32   = dualasr(_xx32,1);
		_x2[j]  = funshift2(_xx32, _xx10);
		_xx10   = _xx32;
	}

	for ( k=1 ; k<M2; ++k )
	{	register int _mm32;

		_mm32   = ld32x(mem,k);
		_mm10   = funshift2(_mm10,_mm10);
		_x2[-k] = pack16lsb(_mm10,_mm32);
		_mm10 = _mm32;
	}


	for ( i=N2-1,j=0 ; j<MM ; --i,j+=4 )
	{	register int _xx;

		_xx = ld32x(xx,i);
		_xx = dualasr(_xx,1);
		_xx = funshift2(_xx,_xx);
		st32d(j, mem, _xx);
	}
#if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
	mem[M-2] = xx[N-M+1] >> 1;


	M2 >>= 1;
	for ( i=0 ; i<N2 ; ++i )
	{	register int y1k, y2k;

		y1k = y2k = 0;

		for ( j=0 ; j<M2 ; j+=2 )
		{	register int _aa, _acc0, _acc1;
			register int __xx10, __mm10, __acc0, __acc1, __aa;
			register int _tmp0, _tmp1, _tmp2, _tmp3;

			_xx10 = ld32x(_x, i+j);
			_mm10 = ld32x(_x2,i-j);
			_aa	  = ld32x(_a, j);
			_mm10 = funshift2(_mm10,_mm10);
			_acc0 = dspidualadd(_xx10, _mm10);
			_acc1 = dspidualsub(_xx10, _mm10);

			__xx10 = ld32x(_x, i+j+1);
			__mm10 = ld32x(_x2,i-j-1);
			__aa   = ld32x(_a, j+1);
			__mm10 = funshift2(__mm10,__mm10);
			__acc0 = dspidualadd(__xx10, __mm10);
			__acc1 = dspidualsub(__xx10, __mm10);

			y1k   += ifir16(_aa, _acc0);
			y1k   += ifir16(__aa, __acc0);

			_tmp0 = pack16lsb(_aa,__aa);
			_tmp1 = pack16msb(_aa,__aa);
			_tmp2 = pack16lsb(_acc1, __acc1);
			_tmp3 = pack16msb(_acc1, __acc1);

			y2k	  -= ifir16(_tmp0, _tmp2);
			y2k	  += ifir16(_tmp1, _tmp3);

		}

		y1[i] = iclipi(PSHR32(y1k,15),32767);
		y2[i] = iclipi(PSHR32(y2k,15),32767);
	}

	QMFDECOMP_STOP();
}

#endif

⌨️ 快捷键说明

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