Updated 8-point interpolation
This commit is contained in:
@@ -3513,6 +3513,11 @@ WaveIndex times 8 dd 0
|
|||||||
;%%DontFilter1 ;
|
;%%DontFilter1 ;
|
||||||
|
|
||||||
EXTSYM fir_interpolate
|
EXTSYM fir_interpolate
|
||||||
|
EXTSYM fir_lut
|
||||||
|
|
||||||
|
section .data
|
||||||
|
NEWSYM fir_tmp,dd 0,0
|
||||||
|
section .text
|
||||||
|
|
||||||
%macro DSPInterpolate 1
|
%macro DSPInterpolate 1
|
||||||
|
|
||||||
@@ -3558,10 +3563,37 @@ EXTSYM fir_interpolate
|
|||||||
jmp %%end
|
jmp %%end
|
||||||
|
|
||||||
%%fir_interpolate
|
%%fir_interpolate
|
||||||
|
%if 1
|
||||||
|
xor eax,eax
|
||||||
|
mov ebx,[BRRPlace0+%1*8]
|
||||||
|
mov al,[BRRPlace0+%1*8+3]
|
||||||
|
shl eax,2
|
||||||
|
and ebx,0FFFFFFh
|
||||||
|
add ebx,1000h
|
||||||
|
shr ebx,9
|
||||||
|
and ebx,0FFF0h
|
||||||
|
add ebx,[fir_lut]
|
||||||
|
movq mm0,[eax+PSampleBuf+(%1*26*4)]
|
||||||
|
packssdw mm0,[eax+PSampleBuf+(%1*26*4)+8]
|
||||||
|
movq mm1,[eax+PSampleBuf+(%1*26*4)+16]
|
||||||
|
packssdw mm1,[eax+PSampleBuf+(%1*26*4)+24]
|
||||||
|
movq mm2,[ebx]
|
||||||
|
movq mm3,[ebx+8]
|
||||||
|
pmaddwd mm0,mm2
|
||||||
|
pmaddwd mm1,mm3
|
||||||
|
paddd mm0,mm1
|
||||||
|
movq [fir_tmp],mm0
|
||||||
|
emms
|
||||||
|
mov eax,[fir_tmp]
|
||||||
|
add eax,[fir_tmp+4]
|
||||||
|
sar eax,14
|
||||||
|
|
||||||
|
%else
|
||||||
push dword PSampleBuf+(%1*26*4)
|
push dword PSampleBuf+(%1*26*4)
|
||||||
push dword [BRRPlace0+%1*8]
|
push dword [BRRPlace0+%1*8]
|
||||||
call fir_interpolate
|
call fir_interpolate
|
||||||
add esp,+8
|
add esp,+8
|
||||||
|
%endif
|
||||||
cmp eax,32767
|
cmp eax,32767
|
||||||
jle %%clip1
|
jle %%clip1
|
||||||
mov eax,32767
|
mov eax,32767
|
||||||
|
|||||||
@@ -9,11 +9,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __LINUX__
|
|
||||||
#include "../gblhdr.h"
|
|
||||||
#else
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#endif
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifndef log2
|
#ifndef log2
|
||||||
inline float log2(float f) {
|
inline float log2(float f) {
|
||||||
@@ -55,7 +52,7 @@ inline float log2(float f) {
|
|||||||
------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
// quantizer scale of window coefs
|
// quantizer scale of window coefs
|
||||||
#define WFIR_QUANTBITS 15
|
#define WFIR_QUANTBITS 14
|
||||||
#define WFIR_QUANTSCALE (1L<<WFIR_QUANTBITS)
|
#define WFIR_QUANTSCALE (1L<<WFIR_QUANTBITS)
|
||||||
#define WFIR_8SHIFT (WFIR_QUANTBITS-8)
|
#define WFIR_8SHIFT (WFIR_QUANTBITS-8)
|
||||||
#define WFIR_16BITSHIFT (WFIR_QUANTBITS)
|
#define WFIR_16BITSHIFT (WFIR_QUANTBITS)
|
||||||
@@ -137,11 +134,11 @@ class CzWINDOWEDFIR
|
|||||||
}
|
}
|
||||||
return (float)(_LWc*_LSi);
|
return (float)(_LWc*_LSi);
|
||||||
}
|
}
|
||||||
static signed int lut[WFIR_LUTLEN*WFIR_WIDTH];
|
static signed short lut[WFIR_LUTLEN*WFIR_WIDTH];
|
||||||
static signed int lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH];
|
static signed int lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
signed int CzWINDOWEDFIR::lut[WFIR_LUTLEN*WFIR_WIDTH];
|
signed short CzWINDOWEDFIR::lut[WFIR_LUTLEN*WFIR_WIDTH];
|
||||||
signed int CzWINDOWEDFIR::lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH];
|
signed int CzWINDOWEDFIR::lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH];
|
||||||
|
|
||||||
CzWINDOWEDFIR::CzWINDOWEDFIR()
|
CzWINDOWEDFIR::CzWINDOWEDFIR()
|
||||||
@@ -161,7 +158,7 @@ CzWINDOWEDFIR::CzWINDOWEDFIR()
|
|||||||
_LGain = 1.0f/_LGain;
|
_LGain = 1.0f/_LGain;
|
||||||
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[_LIdx+_LCc] = (signed int)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) );
|
lut[_LIdx+_LCc] = (signed short)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for( _LPcl=0;_LPcl<WFIR_CUTOFFLEN;_LPcl++ )
|
for( _LPcl=0;_LPcl<WFIR_CUTOFFLEN;_LPcl++ )
|
||||||
@@ -260,9 +257,13 @@ inline int __fir_interpolate(unsigned int nPos, int *p)
|
|||||||
return vol;
|
return vol;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int fir_interpolate(unsigned int nPos, int *p)
|
extern "C" {
|
||||||
{
|
signed short *fir_lut = &CzWINDOWEDFIR::lut[0];
|
||||||
return __fir_interpolate(nPos, p);
|
|
||||||
|
int fir_interpolate(unsigned int nPos, int *p)
|
||||||
|
{
|
||||||
|
return __fir_interpolate(nPos, p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define WFIR_CUTOFFSHIFT (32-(WFIR_CUTOFFBITS+WFIR_LOG2WIDTH))
|
#define WFIR_CUTOFFSHIFT (32-(WFIR_CUTOFFBITS+WFIR_LOG2WIDTH))
|
||||||
|
|||||||
Reference in New Issue
Block a user