g729a_filter.c

来自「DSP上优化的G.729A代码」· C语言 代码 · 共 75 行

C
75
字号
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
#include "../Include/G729A_ld8a.h"

void G729AConvolve(Word16 x[], Word16 h[], Word16 y[], Word16 L)
{
	Word16 i, n;
	Word32 s;
	for (n = 0; n < L; n++)
	{
		s = 0;
		for (i = 0; i <= n; i++)
			s = _sadd(s, _smpy(x[i], h[n-i]));
		
		s    = _sshl(s, 3);                    
		y[n] = G729Aextract_h(s);
	}
	return;
}

void G729ASyn_filt(Word16 a[], Word16 x[], Word16 y[], Word16 lg, Word16 mem[], Word16 update)
{
	Word16 i, j;
	Word32 s;
	Word16 tmp[100];     
	Word16 *yy;
	
	yy = tmp;
	
	for(i=0; i<G729A_M; i++)
	{
		*yy++ = mem[i];
	}
	
	for (i = 0; i < lg; i++)
	{
		s = _smpy(x[i], a[0]);
		for (j = 1; j <= G729A_M; j++)
			s = _ssub(s, _smpy(a[j], yy[-j]));
		
		s = _sshl(s, 3);
		*yy++ = (Word16)(_sadd(s, (Word32)0x00008000L)>>16);
	}
	
	for(i=0; i<lg; i++)
	{
		y[i] = tmp[i+G729A_M];
	}
	
	if(update != 0)
		for (i = 0; i < G729A_M; i++)
		{
			mem[i] = y[lg-G729A_M+i];
		}
		
		return;
}

void G729AResidu(Word16 a[], Word16 x[], Word16 y[], Word16 lg)
{
	Word16 i, j;
	Word32 s;
	for (i = 0; i < lg; i++)
	{
		s = _smpy(x[i], a[0]);
		for (j = 1; j <= G729A_M; j++)
			s = _sadd(s, _smpy(a[j], x[i-j]));
		
		s = _sshl(s, 3);
		y[i] = (Word16)(_sadd(s, (Word32)0x00008000L)>>16);
	}
	return;
}

⌨️ 快捷键说明

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