📄 filters_tm.h
字号:
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 + -