Code updates

This commit is contained in:
pagefault
2001-09-06 15:35:26 +00:00
parent 6c62722e58
commit 5a61b0af86
2 changed files with 51 additions and 8 deletions

View File

@@ -1764,7 +1764,8 @@ section .text
mov [prev0],edx mov [prev0],edx
%endmacro %endmacro
EXTSYM fir_downsample ;EXTSYM fir_downsample
EXTSYM fir_lut_co
%macro ProcessDynamicLowPass 0 %macro ProcessDynamicLowPass 0
mov ecx,[curvoice] mov ecx,[curvoice]
@@ -1948,6 +1949,42 @@ ALIGN16
mov [ebx+20*4],eax mov [ebx+20*4],eax
mov [ebx+25*4],eax mov [ebx+25*4],eax
%if 1
mov ecx,16
sub edx,0F80000h
shr edx,15
and edx,7FFF0h
add edx,[fir_lut_co]
movq mm2,[edx]
movq mm3,[edx+8]
%%DLPF_fir_loop
movq mm0,[ebx]
packssdw mm0,[ebx+8]
movq mm1,[ebx+16]
packssdw mm1,[ebx+24]
pmaddwd mm0,mm2
pmaddwd mm1,mm3
paddd mm0,mm1
movq [fir_tmp],mm0
mov edx,[fir_tmp]
add edx,[fir_tmp+4]
sar edx,14
cmp edx,32767
jle %%DLPF_fir_clip
mov edx,32767
%%DLPF_fir_clip
cmp edx,-32768
jge %%DLPF_fir_clip2
mov edx,-32768
%%DLPF_fir_clip2
mov [edi],dx
add edi,2
add ebx,4
dec ecx
jnz %%DLPF_fir_loop
emms
%else
push edi push edi
push ebx push ebx
@@ -1955,6 +1992,7 @@ ALIGN16
call fir_downsample call fir_downsample
add esp,+12 add esp,+12
add edi,32 add edi,32
%endif
ret ret
%endmacro %endmacro

View File

@@ -70,7 +70,7 @@ inline float log2(float f) {
// cutoff (1.0 == pi/2) // cutoff (1.0 == pi/2)
#define WFIR_CUTOFF 0.90f #define WFIR_CUTOFF 0.90f
#define WFIR_CUTOFFBITS 12 #define WFIR_CUTOFFBITS 12
#define WFIR_CUTOFFLEN (1L<<(WFIR_CUTOFFBITS)) #define WFIR_CUTOFFLEN ((1L<<(WFIR_CUTOFFBITS))+1)
// wfir type // wfir type
#define WFIR_HANN 0 #define WFIR_HANN 0
#define WFIR_HAMMING 1 #define WFIR_HAMMING 1
@@ -139,11 +139,11 @@ class CzWINDOWEDFIR
return (float)(_LWc*_LSi); return (float)(_LWc*_LSi);
} }
static signed short lut[WFIR_LUTLEN*WFIR_WIDTH]; static signed short lut[WFIR_LUTLEN*WFIR_WIDTH];
static signed int lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH]; static signed short lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH];
}; };
signed short CzWINDOWEDFIR::lut[WFIR_LUTLEN*WFIR_WIDTH]; signed short CzWINDOWEDFIR::lut[WFIR_LUTLEN*WFIR_WIDTH];
signed int CzWINDOWEDFIR::lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH]; signed short CzWINDOWEDFIR::lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH];
CzWINDOWEDFIR::CzWINDOWEDFIR() CzWINDOWEDFIR::CzWINDOWEDFIR()
{ int _LPcl; { int _LPcl;
@@ -177,7 +177,7 @@ CzWINDOWEDFIR::CzWINDOWEDFIR()
for( _LCc=0; _LCc<WFIR_WIDTH;_LCc++ ) for( _LCc=0; _LCc<WFIR_WIDTH;_LCc++ )
{ {
float _LCoef = (float)floor( 0.5 + _LScale*_LCoefs[_LCc]*_LGain ); float _LCoef = (float)floor( 0.5 + _LScale*_LCoefs[_LCc]*_LGain );
lut_co[_LIdx+_LCc] = (signed int)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) ); lut_co[_LIdx+_LCc] = (signed short)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) );
} }
} }
} }
@@ -239,6 +239,7 @@ float coef( int _PCnr, float _POfs, float _PCut, int _PWidth, int _PType ) //flo
CzWINDOWEDFIR sfir; CzWINDOWEDFIR sfir;
extern "C" signed short *fir_lut = &CzWINDOWEDFIR::lut[0]; extern "C" signed short *fir_lut = &CzWINDOWEDFIR::lut[0];
extern "C" signed short *fir_lut_co = &CzWINDOWEDFIR::lut_co[0];
#if 0 #if 0
@@ -273,8 +274,10 @@ extern "C" int fir_interpolate(unsigned int nPos, int *p)
#endif #endif
#define WFIR_CUTOFFSHIFT (32-(WFIR_CUTOFFBITS+WFIR_LOG2WIDTH)) #if 0
#define WFIR_CUTOFFMASK ((((1L<<(32-WFIR_CUTOFFSHIFT))-1)&~((1L<<WFIR_LOG2WIDTH)-1)))
#define WFIR_CUTOFFSHIFT (32-(WFIR_CUTOFFBITS+1+WFIR_LOG2WIDTH))
#define WFIR_CUTOFFMASK ((((1L<<(33-WFIR_CUTOFFSHIFT))-1)&~((1L<<WFIR_LOG2WIDTH)-1)))
#define WFIR_CUTOFFHALVE (1L<<(32-(WFIR_CUTOFFBITS+1))) #define WFIR_CUTOFFHALVE (1L<<(32-(WFIR_CUTOFFBITS+1)))
inline void __fir_downsample(unsigned int freq, signed int *p, signed short *out) inline void __fir_downsample(unsigned int freq, signed int *p, signed short *out)
@@ -328,3 +331,5 @@ extern "C" void fir_downsample(unsigned int freq, signed int *p, signed short *o
{ {
__fir_downsample(freq, p, out); __fir_downsample(freq, p, out);
} }
#endif