Merge "stagefright aacenc/amrwbenc: Remove trailing whitespace"
This commit is contained in:
@@ -59,7 +59,7 @@ LOCAL_MODULE := libstagefright_aacenc
|
|||||||
|
|
||||||
LOCAL_ARM_MODE := arm
|
LOCAL_ARM_MODE := arm
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES :=
|
LOCAL_STATIC_LIBRARIES :=
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES :=
|
LOCAL_SHARED_LIBRARIES :=
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,11 @@
|
|||||||
#include "cmnMemory.h"
|
#include "cmnMemory.h"
|
||||||
|
|
||||||
#define VO_AAC_E_OUTPUT 1
|
#define VO_AAC_E_OUTPUT 1
|
||||||
#define READ_SIZE (1024*8)
|
#define READ_SIZE (1024*8)
|
||||||
unsigned char outBuf[1024*8];
|
unsigned char outBuf[1024*8];
|
||||||
unsigned char inBuf[READ_SIZE];
|
unsigned char inBuf[READ_SIZE];
|
||||||
|
|
||||||
const char* HelpString =
|
const char* HelpString =
|
||||||
"VisualOn AAC encoder Usage:\n"
|
"VisualOn AAC encoder Usage:\n"
|
||||||
"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
|
"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
|
||||||
"-if input file name \n"
|
"-if input file name \n"
|
||||||
@@ -49,7 +49,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou
|
|||||||
{
|
{
|
||||||
// notice that:
|
// notice that:
|
||||||
// bitRate/nChannels > 8000
|
// bitRate/nChannels > 8000
|
||||||
// bitRate/nChannels < 160000
|
// bitRate/nChannels < 160000
|
||||||
// bitRate/nChannels < sampleRate*6
|
// bitRate/nChannels < sampleRate*6
|
||||||
param->adtsUsed = 1;
|
param->adtsUsed = 1;
|
||||||
param->bitRate = 0;
|
param->bitRate = 0;
|
||||||
@@ -69,7 +69,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou
|
|||||||
{
|
{
|
||||||
argv++;
|
argv++;
|
||||||
argc--;
|
argc--;
|
||||||
*input_filename = *argv;
|
*input_filename = *argv;
|
||||||
}
|
}
|
||||||
else if (!strcmp(*argv, "-of"))
|
else if (!strcmp(*argv, "-of"))
|
||||||
{
|
{
|
||||||
@@ -173,7 +173,7 @@ int main(int argc, char **argv)
|
|||||||
/* open output file */
|
/* open output file */
|
||||||
if(isOutput)
|
if(isOutput)
|
||||||
{
|
{
|
||||||
outfile = fopen(outfileName, "wb");
|
outfile = fopen(outfileName, "wb");
|
||||||
if (!outfile) {
|
if (!outfile) {
|
||||||
printf("Open output file fail...");
|
printf("Open output file fail...");
|
||||||
return -1;
|
return -1;
|
||||||
@@ -195,7 +195,7 @@ int main(int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
// Get API;
|
// Get API;
|
||||||
pfunc = dlsym(handle, "voGetAACEncAPI");
|
pfunc = dlsym(handle, "voGetAACEncAPI");
|
||||||
if(pfunc == 0)
|
if(pfunc == 0)
|
||||||
{
|
{
|
||||||
printf("open function error......");
|
printf("open function error......");
|
||||||
@@ -215,13 +215,13 @@ int main(int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
|
returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
|
||||||
|
|
||||||
inData.Buffer = inBuf;
|
inData.Buffer = inBuf;
|
||||||
bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
|
bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
|
||||||
|
|
||||||
//####################################### Encoding Section #########################################
|
//####################################### Encoding Section #########################################
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
inData.Length = bytesLeft;
|
inData.Length = bytesLeft;
|
||||||
@@ -229,9 +229,9 @@ int main(int argc, char **argv)
|
|||||||
outData.Length = 1024*8;
|
outData.Length = 1024*8;
|
||||||
|
|
||||||
t1 = clock();
|
t1 = clock();
|
||||||
|
|
||||||
returnCode = AudioAPI.SetInputData(hCodec,&inData);
|
returnCode = AudioAPI.SetInputData(hCodec,&inData);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
outData.Buffer = outBuf;
|
outData.Buffer = outBuf;
|
||||||
outData.Length = 1024*8;
|
outData.Length = 1024*8;
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_SRC_FILES := AAC_E_SAMPLES.c
|
LOCAL_SRC_FILES := AAC_E_SAMPLES.c
|
||||||
|
|
||||||
LOCAL_SRC_FILES += \
|
LOCAL_SRC_FILES += \
|
||||||
../../../Common/cmnMemory.c
|
../../../Common/cmnMemory.c
|
||||||
|
|
||||||
LOCAL_MODULE := TestvoAACEnc
|
LOCAL_MODULE := TestvoAACEnc
|
||||||
|
|
||||||
LOCAL_ARM_MODE := arm
|
LOCAL_ARM_MODE := arm
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES :=
|
LOCAL_STATIC_LIBRARIES :=
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := libvoAACEnc
|
LOCAL_SHARED_LIBRARIES := libvoAACEnc
|
||||||
|
|
||||||
@@ -20,5 +20,5 @@ LOCAL_C_INCLUDES := \
|
|||||||
$(LOCAL_PATH)/../../../Include \
|
$(LOCAL_PATH)/../../../Include \
|
||||||
|
|
||||||
LOCAL_CFLAGS := $(VO_CFLAGS)
|
LOCAL_CFLAGS := $(VO_CFLAGS)
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ VOMT:= exe
|
|||||||
|
|
||||||
|
|
||||||
# module macros
|
# module macros
|
||||||
# please append the additional macro definitions here for your module if necessary.
|
# please append the additional macro definitions here for your module if necessary.
|
||||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||||
VOMM:= #ARMV5E
|
VOMM:= #ARMV5E
|
||||||
|
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ VOTARGET:= voAACEncTestv7
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the g1.mk
|
# please modify here to be sure to see the g1.mk
|
||||||
include ../../../../Tools/eclair.mk
|
include ../../../../Tools/eclair.mk
|
||||||
|
|
||||||
# dependent libraries.
|
# dependent libraries.
|
||||||
VODEPLIBS:=-ldl
|
VODEPLIBS:=-ldl
|
||||||
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../Release/
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the doit.mk
|
# please modify here to be sure to see the doit.mk
|
||||||
include ../../../../Tools/doit.mk
|
include ../../../../Tools/doit.mk
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
# please list all objects needed by your target here
|
# please list all objects needed by your target here
|
||||||
OBJS:=AAC_E_SAMPLES.o cmnMemory.o
|
OBJS:=AAC_E_SAMPLES.o cmnMemory.o
|
||||||
|
|
||||||
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
||||||
VOSRCDIR:=../ ../../../../include ../../../../Common
|
VOSRCDIR:=../ ../../../../include ../../../../Common
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ ifeq ($(VOMT), exe)
|
|||||||
TARGET=$(VOTARGET)
|
TARGET=$(VOTARGET)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR))
|
CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||||
CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR))
|
CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||||
ifneq ($(VOTT), pc)
|
ifneq ($(VOTT), pc)
|
||||||
ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR))
|
ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS:=$(VOLDFLAGS)
|
LDFLAGS:=$(VOLDFLAGS)
|
||||||
@@ -90,7 +90,7 @@ ifneq ($(VODBG), yes)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
$(LIB_DYNAMIC):$(OBJS)
|
$(LIB_DYNAMIC):$(OBJS)
|
||||||
$(GG) $(LDFLAGS) -o $@ $(OBJDIR)/*.o -Wl,--whole-archive $(VOSTCLIBS) -Wl,--no-whole-archive $(VOTLDEPS)
|
$(GG) $(LDFLAGS) -o $@ $(OBJDIR)/*.o -Wl,--whole-archive $(VOSTCLIBS) -Wl,--no-whole-archive $(VOTLDEPS)
|
||||||
ifneq ($(VODBG), yes)
|
ifneq ($(VODBG), yes)
|
||||||
$(STRIP) $@
|
$(STRIP) $@
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -14,10 +14,10 @@
|
|||||||
# ** limitations under the License.
|
# ** limitations under the License.
|
||||||
# */
|
# */
|
||||||
|
|
||||||
# special macro definitions for building
|
# special macro definitions for building
|
||||||
VOPREDEF=-DLINUX -D_LINUX
|
VOPREDEF=-DLINUX -D_LINUX
|
||||||
|
|
||||||
VOPRJ ?=
|
VOPRJ ?=
|
||||||
VONJ ?= eclair
|
VONJ ?= eclair
|
||||||
VOTT ?= v6
|
VOTT ?= v6
|
||||||
# control the version to release out
|
# control the version to release out
|
||||||
@@ -80,19 +80,19 @@ CCTINC:=-I$(TCROOTPATH)/system/core/include \
|
|||||||
-I$(TCROOTPATH)/bionic/libthread_db/include \
|
-I$(TCROOTPATH)/bionic/libthread_db/include \
|
||||||
-I$(TCROOTPATH)/bionic/libm/arm \
|
-I$(TCROOTPATH)/bionic/libm/arm \
|
||||||
-I$(TCROOTPATH)/bionic/libm \
|
-I$(TCROOTPATH)/bionic/libm \
|
||||||
-I$(TCROOTPATH)/frameworks/base/include/android_runtime
|
-I$(TCROOTPATH)/frameworks/base/include/android_runtime
|
||||||
#-I$(TCROOTPATH)/out/target/product/$(VOTP)/obj/SHARED_LIBRARIES/libm_intermediates
|
#-I$(TCROOTPATH)/out/target/product/$(VOTP)/obj/SHARED_LIBRARIES/libm_intermediates
|
||||||
|
|
||||||
CCTCFLAGS:=-msoft-float -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0 -finline-functions -finline-limit=600 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fstrict-aliasing -funswitch-loops
|
CCTCFLAGS:=-msoft-float -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0 -finline-functions -finline-limit=600 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fstrict-aliasing -funswitch-loops
|
||||||
#-fwide-exec-charset=charset=UTF-32
|
#-fwide-exec-charset=charset=UTF-32
|
||||||
|
|
||||||
# for target exe
|
# for target exe
|
||||||
TELDFLAGS:=-nostdlib -Bdynamic -Wl,-T,$(TCROOTPATH)/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=$(CCTLIB) -L$(CCTLIB)
|
TELDFLAGS:=-nostdlib -Bdynamic -Wl,-T,$(TCROOTPATH)/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=$(CCTLIB) -L$(CCTLIB)
|
||||||
|
|
||||||
VOTEDEPS:=$(CCTLIB)/crtbegin_dynamic.o $(CCTLIB)/crtend_android.o $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a -lc -lm
|
VOTEDEPS:=$(CCTLIB)/crtbegin_dynamic.o $(CCTLIB)/crtend_android.o $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a -lc -lm
|
||||||
|
|
||||||
# for target lib
|
# for target lib
|
||||||
TLLDFLAGS:=-nostdlib -Wl,-T,$(TCROOTPATH)/build/core/armelf.xsc -Wl,--gc-sections -Wl,-shared,-Bsymbolic -L$(CCTLIB) -Wl,--no-whole-archive -Wl,--no-undefined $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a
|
TLLDFLAGS:=-nostdlib -Wl,-T,$(TCROOTPATH)/build/core/armelf.xsc -Wl,--gc-sections -Wl,-shared,-Bsymbolic -L$(CCTLIB) -Wl,--no-whole-archive -Wl,--no-undefined $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a
|
||||||
|
|
||||||
VOTLDEPS:=-lm -lc
|
VOTLDEPS:=-lm -lc
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ VOASFLAGS:=-march=armv5te -mfpu=vfp
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(VOTT), v6)
|
ifeq ($(VOTT), v6)
|
||||||
#VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s
|
#VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s
|
||||||
#VOASFLAGS:=-march=armv6
|
#VOASFLAGS:=-march=armv6
|
||||||
VOCFLAGS:=-march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp -mapcs -mtpcs-leaf-frame -mlong-calls
|
VOCFLAGS:=-march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp -mapcs -mtpcs-leaf-frame -mlong-calls
|
||||||
VOASFLAGS:=-march=armv6j -mcpu=arm1136jf-s -mfpu=arm1136jf-s -mfloat-abi=softfp -mapcs-float -mapcs-reentrant
|
VOASFLAGS:=-march=armv6j -mcpu=arm1136jf-s -mfpu=arm1136jf-s -mfloat-abi=softfp -mapcs-float -mapcs-reentrant
|
||||||
@@ -133,7 +133,7 @@ endif
|
|||||||
#global compiling options for ARM target
|
#global compiling options for ARM target
|
||||||
ifneq ($(VOTT), pc)
|
ifneq ($(VOTT), pc)
|
||||||
VOASFLAGS+=--strip-local-absolute -R
|
VOASFLAGS+=--strip-local-absolute -R
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(VODBG), yes)
|
ifeq ($(VODBG), yes)
|
||||||
@@ -167,6 +167,6 @@ ifeq ($(VODBG), yes)
|
|||||||
#VOLDFLAGS:=
|
#VOLDFLAGS:=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# where to place object files
|
# where to place object files
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
|
|||||||
#else
|
#else
|
||||||
Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
|
Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Long sub, 2 */
|
/* Long sub, 2 */
|
||||||
#if (L_SUB_IS_INLINE)
|
#if (L_SUB_IS_INLINE)
|
||||||
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
|
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
|
||||||
@@ -119,7 +119,7 @@ __inline Word16 add (Word16 var1, Word16 var2);
|
|||||||
#else
|
#else
|
||||||
Word16 add (Word16 var1, Word16 var2);
|
Word16 add (Word16 var1, Word16 var2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Short sub, 1 */
|
/* Short sub, 1 */
|
||||||
#if (SUB_IS_INLINE)
|
#if (SUB_IS_INLINE)
|
||||||
__inline Word16 sub(Word16 var1, Word16 var2);
|
__inline Word16 sub(Word16 var1, Word16 var2);
|
||||||
@@ -227,48 +227,48 @@ Word32 L_shr_r (Word32 L_var1, Word16 var2);
|
|||||||
#if ARMV4_INASM
|
#if ARMV4_INASM
|
||||||
__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
|
__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
|
||||||
{
|
{
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"MOV %[result], %[L_var1], ASR %[var2] \n"
|
"MOV %[result], %[L_var1], ASR %[var2] \n"
|
||||||
:[result]"=r"(result)
|
:[result]"=r"(result)
|
||||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
|
__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
|
||||||
{
|
{
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"MOV r2, %[L_var1] \n"
|
"MOV r2, %[L_var1] \n"
|
||||||
"MOV r3, #0x7fffffff\n"
|
"MOV r3, #0x7fffffff\n"
|
||||||
"MOV %[result], %[L_var1], ASL %[var2] \n"
|
"MOV %[result], %[L_var1], ASL %[var2] \n"
|
||||||
"TEQ r2, %[result], ASR %[var2]\n"
|
"TEQ r2, %[result], ASR %[var2]\n"
|
||||||
"EORNE %[result],r3,r2,ASR#31\n"
|
"EORNE %[result],r3,r2,ASR#31\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||||
:"r2", "r3"
|
:"r2", "r3"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
|
__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
|
||||||
{
|
{
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"CMP %[var2], #15\n"
|
"CMP %[var2], #15\n"
|
||||||
"MOVGE %[var2], #15\n"
|
"MOVGE %[var2], #15\n"
|
||||||
"MOV %[result], %[L_var1], ASR %[var2]\n"
|
"MOV %[result], %[L_var1], ASR %[var2]\n"
|
||||||
:[result]"=r"(result)
|
:[result]"=r"(result)
|
||||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
|
__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
|
||||||
{
|
{
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"CMP %[var2], #16\n"
|
"CMP %[var2], #16\n"
|
||||||
"MOVGE %[var2], #16\n"
|
"MOVGE %[var2], #16\n"
|
||||||
"MOV %[result], %[L_var1], ASL %[var2]\n"
|
"MOV %[result], %[L_var1], ASL %[var2]\n"
|
||||||
@@ -280,9 +280,9 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
|
|||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||||
:"r2", "r3"
|
:"r2", "r3"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*___________________________________________________________________________
|
/*___________________________________________________________________________
|
||||||
@@ -300,17 +300,17 @@ __inline Word16 saturate(Word32 L_var1)
|
|||||||
"MOV r3, #1\n"
|
"MOV r3, #1\n"
|
||||||
"MOV r2,%[L_var1],ASR#15\n"
|
"MOV r2,%[L_var1],ASR#15\n"
|
||||||
"RSB r3, r3, r3, LSL #15\n"
|
"RSB r3, r3, r3, LSL #15\n"
|
||||||
"TEQ r2,%[L_var1],ASR#31\n"
|
"TEQ r2,%[L_var1],ASR#31\n"
|
||||||
"EORNE %[result],r3,%[L_var1],ASR#31\n"
|
"EORNE %[result],r3,%[L_var1],ASR#31\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1)
|
:[L_var1]"r"(L_var1)
|
||||||
:"r2", "r3"
|
:"r2", "r3"
|
||||||
);
|
);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word16 var_out;
|
Word16 var_out;
|
||||||
|
|
||||||
//var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
|
//var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
|
||||||
|
|
||||||
if (L_var1 > 0X00007fffL)
|
if (L_var1 > 0X00007fffL)
|
||||||
@@ -419,13 +419,13 @@ __inline Word16 shr (Word16 var1, Word16 var2)
|
|||||||
__inline Word32 L_mult(Word16 var1, Word16 var2)
|
__inline Word32 L_mult(Word16 var1, Word16 var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_L_MULT
|
#if ARMV5TE_L_MULT
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"SMULBB %[result], %[var1], %[var2] \n"
|
"SMULBB %[result], %[var1], %[var2] \n"
|
||||||
"QADD %[result], %[result], %[result] \n"
|
"QADD %[result], %[result], %[result] \n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[var1]"r"(var1), [var2]"r"(var2)
|
:[var1]"r"(var1), [var2]"r"(var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word32 L_var_out;
|
Word32 L_var_out;
|
||||||
@@ -449,14 +449,14 @@ __inline Word32 L_mult(Word16 var1, Word16 var2)
|
|||||||
__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
|
__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_L_MSU
|
#if ARMV5TE_L_MSU
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"SMULBB %[result], %[var1], %[var2] \n"
|
"SMULBB %[result], %[var1], %[var2] \n"
|
||||||
"QADD %[result], %[result], %[result] \n"
|
"QADD %[result], %[result], %[result] \n"
|
||||||
"QSUB %[result], %[L_var3], %[result]\n"
|
"QSUB %[result], %[L_var3], %[result]\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
|
:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word32 L_var_out;
|
Word32 L_var_out;
|
||||||
@@ -473,12 +473,12 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
|
|||||||
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
|
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_L_SUB
|
#if ARMV5TE_L_SUB
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"QSUB %[result], %[L_var1], %[L_var2]\n"
|
"QSUB %[result], %[L_var1], %[L_var2]\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
|
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word32 L_var_out;
|
Word32 L_var_out;
|
||||||
@@ -588,9 +588,9 @@ __inline Word32 L_shr (Word32 L_var1, Word16 var2)
|
|||||||
__inline Word16 add (Word16 var1, Word16 var2)
|
__inline Word16 add (Word16 var1, Word16 var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_ADD
|
#if ARMV5TE_ADD
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"ADD %[result], %[var1], %[var2] \n"
|
"ADD %[result], %[var1], %[var2] \n"
|
||||||
"MOV r3, #0x1\n"
|
"MOV r3, #0x1\n"
|
||||||
"MOV r2, %[result], ASR #15\n"
|
"MOV r2, %[result], ASR #15\n"
|
||||||
"RSB r3, r3, r3, LSL, #15\n"
|
"RSB r3, r3, r3, LSL, #15\n"
|
||||||
@@ -599,7 +599,7 @@ __inline Word16 add (Word16 var1, Word16 var2)
|
|||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[var1]"r"(var1), [var2]"r"(var2)
|
:[var1]"r"(var1), [var2]"r"(var2)
|
||||||
:"r2", "r3"
|
:"r2", "r3"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word16 var_out;
|
Word16 var_out;
|
||||||
@@ -618,18 +618,18 @@ __inline Word16 add (Word16 var1, Word16 var2)
|
|||||||
__inline Word16 sub(Word16 var1, Word16 var2)
|
__inline Word16 sub(Word16 var1, Word16 var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_SUB
|
#if ARMV5TE_SUB
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"MOV r3, #1\n"
|
"MOV r3, #1\n"
|
||||||
"SUB %[result], %[var1], %[var2] \n"
|
"SUB %[result], %[var1], %[var2] \n"
|
||||||
"RSB r3,r3,r3,LSL#15\n"
|
"RSB r3,r3,r3,LSL#15\n"
|
||||||
"MOV r2, %[var1], ASR #15 \n"
|
"MOV r2, %[var1], ASR #15 \n"
|
||||||
"TEQ r2, %[var1], ASR #31 \n"
|
"TEQ r2, %[var1], ASR #31 \n"
|
||||||
"EORNE %[result], r3, %[result], ASR #31 \n"
|
"EORNE %[result], r3, %[result], ASR #31 \n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[var1]"r"(var1), [var2]"r"(var2)
|
:[var1]"r"(var1), [var2]"r"(var2)
|
||||||
:"r2", "r3"
|
:"r2", "r3"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word16 var_out;
|
Word16 var_out;
|
||||||
@@ -637,7 +637,7 @@ __inline Word16 sub(Word16 var1, Word16 var2)
|
|||||||
|
|
||||||
L_diff = (Word32) var1 - var2;
|
L_diff = (Word32) var1 - var2;
|
||||||
var_out = saturate(L_diff);
|
var_out = saturate(L_diff);
|
||||||
|
|
||||||
return (var_out);
|
return (var_out);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -657,16 +657,16 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
|
|||||||
{
|
{
|
||||||
var_out = 0;
|
var_out = 0;
|
||||||
L_num = (Word32) var1;
|
L_num = (Word32) var1;
|
||||||
|
|
||||||
L_denom = (Word32) var2;
|
L_denom = (Word32) var2;
|
||||||
|
|
||||||
//return (L_num<<15)/var2;
|
//return (L_num<<15)/var2;
|
||||||
|
|
||||||
for (iteration = 0; iteration < 15; iteration++)
|
for (iteration = 0; iteration < 15; iteration++)
|
||||||
{
|
{
|
||||||
var_out <<= 1;
|
var_out <<= 1;
|
||||||
L_num <<= 1;
|
L_num <<= 1;
|
||||||
|
|
||||||
if (L_num >= L_denom)
|
if (L_num >= L_denom)
|
||||||
{
|
{
|
||||||
L_num -= L_denom;
|
L_num -= L_denom;
|
||||||
@@ -683,8 +683,8 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
|
|||||||
__inline Word16 mult (Word16 var1, Word16 var2)
|
__inline Word16 mult (Word16 var1, Word16 var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_MULT
|
#if ARMV5TE_MULT
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"SMULBB r2, %[var1], %[var2] \n"
|
"SMULBB r2, %[var1], %[var2] \n"
|
||||||
"MOV r3, #1\n"
|
"MOV r3, #1\n"
|
||||||
"MOV %[result], r2, ASR #15\n"
|
"MOV %[result], r2, ASR #15\n"
|
||||||
@@ -695,7 +695,7 @@ __inline Word16 mult (Word16 var1, Word16 var2)
|
|||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[var1]"r"(var1), [var2]"r"(var2)
|
:[var1]"r"(var1), [var2]"r"(var2)
|
||||||
:"r2", "r3"
|
:"r2", "r3"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word16 var_out;
|
Word16 var_out;
|
||||||
@@ -718,8 +718,8 @@ __inline Word16 mult (Word16 var1, Word16 var2)
|
|||||||
__inline Word16 norm_s (Word16 var1)
|
__inline Word16 norm_s (Word16 var1)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_NORM_S
|
#if ARMV5TE_NORM_S
|
||||||
Word16 result;
|
Word16 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"MOV r2,%[var1] \n"
|
"MOV r2,%[var1] \n"
|
||||||
"CMP r2, #0\n"
|
"CMP r2, #0\n"
|
||||||
"RSBLT %[var1], %[var1], #0 \n"
|
"RSBLT %[var1], %[var1], #0 \n"
|
||||||
@@ -727,11 +727,11 @@ __inline Word16 norm_s (Word16 var1)
|
|||||||
"SUBNE %[result], %[result], #17\n"
|
"SUBNE %[result], %[result], #17\n"
|
||||||
"MOVEQ %[result], #0\n"
|
"MOVEQ %[result], #0\n"
|
||||||
"CMP r2, #-1\n"
|
"CMP r2, #-1\n"
|
||||||
"MOVEQ %[result], #15\n"
|
"MOVEQ %[result], #15\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[var1]"r"(var1)
|
:[var1]"r"(var1)
|
||||||
:"r2"
|
:"r2"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word16 var_out;
|
Word16 var_out;
|
||||||
@@ -768,15 +768,15 @@ __inline Word16 norm_s (Word16 var1)
|
|||||||
__inline Word16 norm_l (Word32 L_var1)
|
__inline Word16 norm_l (Word32 L_var1)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_NORM_L
|
#if ARMV5TE_NORM_L
|
||||||
Word16 result;
|
Word16 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"CMP %[L_var1], #0\n"
|
"CMP %[L_var1], #0\n"
|
||||||
"CLZNE %[result], %[L_var1]\n"
|
"CLZNE %[result], %[L_var1]\n"
|
||||||
"SUBNE %[result], %[result], #1\n"
|
"SUBNE %[result], %[result], #1\n"
|
||||||
"MOVEQ %[result], #0\n"
|
"MOVEQ %[result], #0\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1)
|
:[L_var1]"r"(L_var1)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
//Word16 var_out;
|
//Word16 var_out;
|
||||||
@@ -805,84 +805,84 @@ __inline Word16 norm_l (Word32 L_var1)
|
|||||||
//}
|
//}
|
||||||
//return (var_out);
|
//return (var_out);
|
||||||
Word16 a16;
|
Word16 a16;
|
||||||
Word16 r = 0 ;
|
Word16 r = 0 ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ( L_var1 < 0 ) {
|
if ( L_var1 < 0 ) {
|
||||||
L_var1 = ~L_var1;
|
L_var1 = ~L_var1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == (L_var1 & 0x7fff8000)) {
|
if (0 == (L_var1 & 0x7fff8000)) {
|
||||||
a16 = extract_l(L_var1);
|
a16 = extract_l(L_var1);
|
||||||
r += 16;
|
r += 16;
|
||||||
|
|
||||||
if (0 == (a16 & 0x7f80)) {
|
if (0 == (a16 & 0x7f80)) {
|
||||||
r += 8;
|
r += 8;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0078)) {
|
if (0 == (a16 & 0x0078)) {
|
||||||
r += 4;
|
r += 4;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0006)) {
|
if (0 == (a16 & 0x0006)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0001)) {
|
if (0 == (a16 & 0x0001)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0004)) {
|
if (0 == (a16 & 0x0004)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0060)) {
|
if (0 == (a16 & 0x0060)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0010)) {
|
if (0 == (a16 & 0x0010)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0040)) {
|
if (0 == (a16 & 0x0040)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x7800)) {
|
if (0 == (a16 & 0x7800)) {
|
||||||
r += 4;
|
r += 4;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0600)) {
|
if (0 == (a16 & 0x0600)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0100)) {
|
if (0 == (a16 & 0x0100)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0400)) {
|
if (0 == (a16 & 0x0400)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x6000)) {
|
if (0 == (a16 & 0x6000)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x1000)) {
|
if (0 == (a16 & 0x1000)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x4000)) {
|
if (0 == (a16 & 0x4000)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
@@ -892,38 +892,38 @@ __inline Word16 norm_l (Word32 L_var1)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
a16 = extract_h(L_var1);
|
a16 = extract_h(L_var1);
|
||||||
|
|
||||||
if (0 == (a16 & 0x7f80)) {
|
if (0 == (a16 & 0x7f80)) {
|
||||||
r += 8;
|
r += 8;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0078)) {
|
if (0 == (a16 & 0x0078)) {
|
||||||
r += 4 ;
|
r += 4 ;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0006)) {
|
if (0 == (a16 & 0x0006)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0001)) {
|
if (0 == (a16 & 0x0001)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0004)) {
|
if (0 == (a16 & 0x0004)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0060)) {
|
if (0 == (a16 & 0x0060)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0010)) {
|
if (0 == (a16 & 0x0010)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0040)) {
|
if (0 == (a16 & 0x0040)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
@@ -931,35 +931,35 @@ __inline Word16 norm_l (Word32 L_var1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x7800)) {
|
if (0 == (a16 & 0x7800)) {
|
||||||
r += 4;
|
r += 4;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0600)) {
|
if (0 == (a16 & 0x0600)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x0100)) {
|
if (0 == (a16 & 0x0100)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x0400)) {
|
if (0 == (a16 & 0x0400)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x6000)) {
|
if (0 == (a16 & 0x6000)) {
|
||||||
r += 2;
|
r += 2;
|
||||||
|
|
||||||
if (0 == (a16 & 0x1000)) {
|
if (0 == (a16 & 0x1000)) {
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (0 == (a16 & 0x4000)) {
|
if (0 == (a16 & 0x4000)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -967,7 +967,7 @@ __inline Word16 norm_l (Word32 L_var1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r ;
|
return r ;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -978,17 +978,17 @@ __inline Word16 norm_l (Word32 L_var1)
|
|||||||
__inline Word16 round16(Word32 L_var1)
|
__inline Word16 round16(Word32 L_var1)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_ROUND
|
#if ARMV5TE_ROUND
|
||||||
Word16 result;
|
Word16 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"MOV r1,#0x00008000\n"
|
"MOV r1,#0x00008000\n"
|
||||||
"QADD %[result], %[L_var1], r1\n"
|
"QADD %[result], %[L_var1], r1\n"
|
||||||
"MOV %[result], %[result], ASR #16 \n"
|
"MOV %[result], %[result], ASR #16 \n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1)
|
:[L_var1]"r"(L_var1)
|
||||||
:"r1"
|
:"r1"
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word16 var_out;
|
Word16 var_out;
|
||||||
Word32 L_rounded;
|
Word32 L_rounded;
|
||||||
|
|
||||||
@@ -1004,14 +1004,14 @@ __inline Word16 round16(Word32 L_var1)
|
|||||||
__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
|
__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_L_MAC
|
#if ARMV5TE_L_MAC
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"SMULBB %[result], %[var1], %[var2]\n"
|
"SMULBB %[result], %[var1], %[var2]\n"
|
||||||
"QADD %[result], %[result], %[result]\n"
|
"QADD %[result], %[result], %[result]\n"
|
||||||
"QADD %[result], %[result], %[L_var3]\n"
|
"QADD %[result], %[result], %[L_var3]\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
|
: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word32 L_var_out;
|
Word32 L_var_out;
|
||||||
@@ -1028,12 +1028,12 @@ __inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
|
|||||||
__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
|
__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_L_ADD
|
#if ARMV5TE_L_ADD
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"QADD %[result], %[L_var1], %[L_var2]\n"
|
"QADD %[result], %[L_var1], %[L_var2]\n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
|
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
Word32 L_var_out;
|
Word32 L_var_out;
|
||||||
@@ -1114,7 +1114,7 @@ __inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
|
|||||||
|
|
||||||
L_var3 = L_msu (L_var3, var1, var2);
|
L_var3 = L_msu (L_var3, var1, var2);
|
||||||
var_out = (Word16)((L_var3 + 0x8000L) >> 16);
|
var_out = (Word16)((L_var3 + 0x8000L) >> 16);
|
||||||
|
|
||||||
return (var_out);
|
return (var_out);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
File: basicop2.c
|
File: basicop2.c
|
||||||
|
|
||||||
Content: Basic arithmetic operators.
|
Content: Basic arithmetic operators.
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
@@ -462,7 +462,7 @@ Word32 L_mult(Word16 var1, Word16 var2)
|
|||||||
{
|
{
|
||||||
L_var_out = MAX_32;
|
L_var_out = MAX_32;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (L_var_out);
|
return (L_var_out);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
File: oper_32b.c
|
File: oper_32b.c
|
||||||
|
|
||||||
Content: This file contains operations in double precision.
|
Content: This file contains operations in double precision.
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#include "typedef.h"
|
#include "typedef.h"
|
||||||
@@ -200,12 +200,12 @@ Word32 Div_32 (Word32 L_num, Word32 denom)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
\brief calculates the log dualis times 4 of argument
|
\brief calculates the log dualis times 4 of argument
|
||||||
iLog4(x) = (Word32)(4 * log(value)/log(2.0))
|
iLog4(x) = (Word32)(4 * log(value)/log(2.0))
|
||||||
|
|
||||||
\return ilog4 value
|
\return ilog4 value
|
||||||
|
|
||||||
*/
|
*/
|
||||||
Word16 iLog4(Word32 value)
|
Word16 iLog4(Word32 value)
|
||||||
{
|
{
|
||||||
@@ -225,7 +225,7 @@ Word16 iLog4(Word32 value)
|
|||||||
iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
|
iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
iLog4 = -128; /* -(INT_BITS*4); */
|
iLog4 = -128; /* -(INT_BITS*4); */
|
||||||
}
|
}
|
||||||
|
|
||||||
return iLog4;
|
return iLog4;
|
||||||
@@ -268,79 +268,79 @@ Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const Word32 pow2Table[POW2_TABLE_SIZE] = {
|
static const Word32 pow2Table[POW2_TABLE_SIZE] = {
|
||||||
0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
|
0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
|
||||||
0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
|
0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
|
||||||
0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
|
0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
|
||||||
0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
|
0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
|
||||||
0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
|
0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
|
||||||
0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
|
0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
|
||||||
0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
|
0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
|
||||||
0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
|
0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
|
||||||
0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
|
0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
|
||||||
0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
|
0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
|
||||||
0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
|
0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
|
||||||
0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
|
0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
|
||||||
0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
|
0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
|
||||||
0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
|
0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
|
||||||
0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
|
0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
|
||||||
0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
|
0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
|
||||||
0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
|
0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
|
||||||
0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
|
0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
|
||||||
0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
|
0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
|
||||||
0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
|
0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
|
||||||
0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
|
0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
|
||||||
0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
|
0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
|
||||||
0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
|
0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
|
||||||
0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
|
0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
|
||||||
0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
|
0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
|
||||||
0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
|
0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
|
||||||
0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
|
0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
|
||||||
0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
|
0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
|
||||||
0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
|
0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
|
||||||
0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
|
0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
|
||||||
0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
|
0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
|
||||||
0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
|
0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
|
||||||
0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
|
0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
|
||||||
0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
|
0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
|
||||||
0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
|
0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
|
||||||
0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
|
0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
|
||||||
0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
|
0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
|
||||||
0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
|
0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
|
||||||
0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
|
0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
|
||||||
0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
|
0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
|
||||||
0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
|
0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
|
||||||
0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
|
0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
|
||||||
0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
|
0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
|
||||||
0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
|
0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
|
||||||
0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
|
0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
|
||||||
0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
|
0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
|
||||||
0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
|
0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
|
||||||
0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
|
0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
|
||||||
0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
|
0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
|
||||||
0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
|
0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
|
||||||
0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
|
0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
|
||||||
0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
|
0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
|
||||||
0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
|
0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
|
||||||
0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
|
0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
|
||||||
0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
|
0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
|
||||||
0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
|
0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
|
||||||
0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
|
0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
|
||||||
0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
|
0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
|
||||||
0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
|
0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
|
||||||
0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
|
0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
|
||||||
0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
|
0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
|
||||||
0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
|
0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
|
||||||
0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
|
0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
|
||||||
0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9
|
0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
\brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y
|
\brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y
|
||||||
|
|
||||||
avoids integer division
|
avoids integer division
|
||||||
|
|
||||||
\return
|
\return
|
||||||
*/
|
*/
|
||||||
Word32 pow2_xy(Word32 x, Word32 y)
|
Word32 pow2_xy(Word32 x, Word32 y)
|
||||||
{
|
{
|
||||||
@@ -355,7 +355,7 @@ Word32 pow2_xy(Word32 x, Word32 y)
|
|||||||
fPart = tmp2 - iPart*y;
|
fPart = tmp2 - iPart*y;
|
||||||
iPart = min(iPart,INT_BITS-1);
|
iPart = min(iPart,INT_BITS-1);
|
||||||
|
|
||||||
res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
|
res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
|
||||||
|
|
||||||
return(res);
|
return(res);
|
||||||
}
|
}
|
||||||
@@ -51,21 +51,21 @@ __inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)
|
|||||||
swHigh1 = (Word16)(L_var2 >> 16);
|
swHigh1 = (Word16)(L_var2 >> 16);
|
||||||
|
|
||||||
l_var_out = (long)swLow1 * (long)var1 >> 15;
|
l_var_out = (long)swLow1 * (long)var1 >> 15;
|
||||||
|
|
||||||
l_var_out += swHigh1 * var1 << 1;
|
l_var_out += swHigh1 * var1 << 1;
|
||||||
|
|
||||||
return(l_var_out);
|
return(l_var_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
|
__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
|
||||||
{
|
{
|
||||||
#if ARMV5TE_L_MPY_LS
|
#if ARMV5TE_L_MPY_LS
|
||||||
Word32 result;
|
Word32 result;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"SMULWB %[result], %[L_var2], %[var1] \n"
|
"SMULWB %[result], %[L_var2], %[var1] \n"
|
||||||
:[result]"+r"(result)
|
:[result]"+r"(result)
|
||||||
:[L_var2]"r"(L_var2), [var1]"r"(var1)
|
:[L_var2]"r"(L_var2), [var1]"r"(var1)
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
unsigned short swLow1;
|
unsigned short swLow1;
|
||||||
@@ -75,9 +75,9 @@ __inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
|
|||||||
swLow1 = (unsigned short)(L_var2);
|
swLow1 = (unsigned short)(L_var2);
|
||||||
swHigh1 = (Word16)(L_var2 >> 16);
|
swHigh1 = (Word16)(L_var2 >> 16);
|
||||||
|
|
||||||
l_var_out = (long)swLow1 * (long)var1 >> 16;
|
l_var_out = (long)swLow1 * (long)var1 >> 16;
|
||||||
l_var_out += swHigh1 * var1;
|
l_var_out += swHigh1 * var1;
|
||||||
|
|
||||||
return(l_var_out);
|
return(l_var_out);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
/*
|
/*
|
||||||
* this is the original code from the ETSI file typedef.h
|
* this is the original code from the ETSI file typedef.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
|
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
|
||||||
typedef signed char Word8;
|
typedef signed char Word8;
|
||||||
typedef short Word16;
|
typedef short Word16;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
#define INT_BITS 32
|
#define INT_BITS 32
|
||||||
/*
|
/*
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* DEFINITION OF CONSTANTS
|
* DEFINITION OF CONSTANTS
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
@@ -120,12 +120,12 @@ typedef unsigned __int64 UWord64;
|
|||||||
#define ARMV5TE_L_MULT 1
|
#define ARMV5TE_L_MULT 1
|
||||||
#define ARMV5TE_L_MAC 1
|
#define ARMV5TE_L_MAC 1
|
||||||
#define ARMV5TE_L_MSU 1
|
#define ARMV5TE_L_MSU 1
|
||||||
|
|
||||||
|
|
||||||
#define ARMV5TE_DIV_S 1
|
#define ARMV5TE_DIV_S 1
|
||||||
#define ARMV5TE_ROUND 1
|
#define ARMV5TE_ROUND 1
|
||||||
#define ARMV5TE_MULT 1
|
#define ARMV5TE_MULT 1
|
||||||
|
|
||||||
#define ARMV5TE_NORM_S 1
|
#define ARMV5TE_NORM_S 1
|
||||||
#define ARMV5TE_NORM_L 1
|
#define ARMV5TE_NORM_L 1
|
||||||
#define ARMV5TE_L_MPY_LS 1
|
#define ARMV5TE_L_MPY_LS 1
|
||||||
@@ -149,7 +149,7 @@ typedef unsigned __int64 UWord64;
|
|||||||
#define ROUND_IS_INLINE 1 //define round as inline function
|
#define ROUND_IS_INLINE 1 //define round as inline function
|
||||||
#define L_MAC_IS_INLINE 1 //define L_mac as inline function
|
#define L_MAC_IS_INLINE 1 //define L_mac as inline function
|
||||||
#define L_ADD_IS_INLINE 1 //define L_add as inline function
|
#define L_ADD_IS_INLINE 1 //define L_add as inline function
|
||||||
#define EXTRACT_H_IS_INLINE 1 //define extract_h as inline function
|
#define EXTRACT_H_IS_INLINE 1 //define extract_h as inline function
|
||||||
#define EXTRACT_L_IS_INLINE 1 //define extract_l as inline function //???
|
#define EXTRACT_L_IS_INLINE 1 //define extract_l as inline function //???
|
||||||
#define MULT_R_IS_INLINE 1 //define mult_r as inline function
|
#define MULT_R_IS_INLINE 1 //define mult_r as inline function
|
||||||
#define SHR_R_IS_INLINE 1 //define shr_r as inline function
|
#define SHR_R_IS_INLINE 1 //define shr_r as inline function
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ VOMT:= lib
|
|||||||
|
|
||||||
|
|
||||||
# module macros
|
# module macros
|
||||||
# please append the additional macro definitions here for your module if necessary.
|
# please append the additional macro definitions here for your module if necessary.
|
||||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||||
VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM
|
VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -36,10 +36,10 @@ VOTARGET:=libvoAACEncv5
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the g1.mk
|
# please modify here to be sure to see the g1.mk
|
||||||
include ../../../../../Tools/eclair.mk
|
include ../../../../../Tools/eclair.mk
|
||||||
|
|
||||||
# dependent libraries.
|
# dependent libraries.
|
||||||
VODEPLIBS:=#-ldl -lstdc++
|
VODEPLIBS:=#-ldl -lstdc++
|
||||||
|
|
||||||
# module source
|
# module source
|
||||||
# please modify here to be sure to see the ms.mk which specifies all source info of your module
|
# please modify here to be sure to see the ms.mk which specifies all source info of your module
|
||||||
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../../Release
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the doit.mk
|
# please modify here to be sure to see the doit.mk
|
||||||
include ../../../../../Tools/doit.mk
|
include ../../../../../Tools/doit.mk
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ VOMT:= lib
|
|||||||
|
|
||||||
|
|
||||||
# module macros
|
# module macros
|
||||||
# please append the additional macro definitions here for your module if necessary.
|
# please append the additional macro definitions here for your module if necessary.
|
||||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||||
VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
|
VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -36,10 +36,10 @@ VOTARGET:=libvoAACEncv7
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the g1.mk
|
# please modify here to be sure to see the g1.mk
|
||||||
include ../../../../../Tools/eclair.mk
|
include ../../../../../Tools/eclair.mk
|
||||||
|
|
||||||
# dependent libraries.
|
# dependent libraries.
|
||||||
VODEPLIBS:=#-ldl -lstdc++
|
VODEPLIBS:=#-ldl -lstdc++
|
||||||
|
|
||||||
# module source
|
# module source
|
||||||
# please modify here to be sure to see the ms.mk which specifies all source info of your module
|
# please modify here to be sure to see the ms.mk which specifies all source info of your module
|
||||||
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../../Release
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the doit.mk
|
# please modify here to be sure to see the doit.mk
|
||||||
include ../../../../../Tools/doit.mk
|
include ../../../../../Tools/doit.mk
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
# Just acting as Father Makefile of Modules
|
# Just acting as Father Makefile of Modules
|
||||||
# please keep the name 'makefile' unchanged
|
# please keep the name 'makefile' unchanged
|
||||||
|
|
||||||
# Module Subdirs
|
# Module Subdirs
|
||||||
VOMSD:=$(dir $(shell find . -name 'Makefile'))
|
VOMSD:=$(dir $(shell find . -name 'Makefile'))
|
||||||
|
|
||||||
|
|||||||
@@ -21,22 +21,22 @@ OBJS:=basicop2.o oper_32b.o aac_rom.o aacenc.o aacenc_core.o adj_thr.o \
|
|||||||
dyn_bits.o grp_data.o interface.o line_pe.o memalign.o ms_stereo.o \
|
dyn_bits.o grp_data.o interface.o line_pe.o memalign.o ms_stereo.o \
|
||||||
pre_echo_control.o psy_configuration.o psy_main.o qc_main.o quantize.o sf_estim.o \
|
pre_echo_control.o psy_configuration.o psy_main.o qc_main.o quantize.o sf_estim.o \
|
||||||
spreading.o stat_bits.o tns.o transform.o
|
spreading.o stat_bits.o tns.o transform.o
|
||||||
|
|
||||||
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
||||||
VOSRCDIR:=../../../src \
|
VOSRCDIR:=../../../src \
|
||||||
../../../inc \
|
../../../inc \
|
||||||
../../../basic_op\
|
../../../basic_op\
|
||||||
../../../../../Include
|
../../../../../Include
|
||||||
|
|
||||||
ifeq ($(VOTT), v5)
|
ifeq ($(VOTT), v5)
|
||||||
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
|
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
|
||||||
PrePostMDCT_v5.o R4R8First_v5.o Radix4FFT_v5.o
|
PrePostMDCT_v5.o R4R8First_v5.o Radix4FFT_v5.o
|
||||||
VOSRCDIR+= ../../../src/asm/ARMV5E/
|
VOSRCDIR+= ../../../src/asm/ARMV5E/
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(VOTT), v7)
|
ifeq ($(VOTT), v7)
|
||||||
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
|
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
|
||||||
PrePostMDCT_v7.o R4R8First_v7.o Radix4FFT_v7.o
|
PrePostMDCT_v7.o R4R8First_v7.o Radix4FFT_v7.o
|
||||||
VOSRCDIR+= ../../../src/asm/ARMV5E/
|
VOSRCDIR+= ../../../src/asm/ARMV5E/
|
||||||
VOSRCDIR+= ../../../src/asm/ARMV7/
|
VOSRCDIR+= ../../../src/asm/ARMV7/
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
File: aac_rom.h
|
File: aac_rom.h
|
||||||
|
|
||||||
Content: constant tables
|
Content: constant tables
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
AACENC_CONFIG config; /* Word16 size: 8 */
|
AACENC_CONFIG config; /* Word16 size: 8 */
|
||||||
|
|
||||||
ELEMENT_INFO elInfo; /* Word16 size: 4 */
|
ELEMENT_INFO elInfo; /* Word16 size: 4 */
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
File: adj_thr.h
|
File: adj_thr.h
|
||||||
|
|
||||||
Content: Threshold compensation function
|
Content: Threshold compensation function
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
|||||||
PSY_OUT_ELEMENT *psyOutElement,
|
PSY_OUT_ELEMENT *psyOutElement,
|
||||||
Word16 *chBitDistribution,
|
Word16 *chBitDistribution,
|
||||||
Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
|
Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||||
Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
|
Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||||
QC_OUT_ELEMENT* qcOE,
|
QC_OUT_ELEMENT* qcOE,
|
||||||
ELEMENT_BITS* elBits,
|
ELEMENT_BITS* elBits,
|
||||||
const Word16 nChannels,
|
const Word16 nChannels,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
File: adj_thr_data.h
|
File: adj_thr_data.h
|
||||||
|
|
||||||
Content: Threshold compensation parameter
|
Content: Threshold compensation parameter
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
#include "qc_data.h"
|
#include "qc_data.h"
|
||||||
#include "tns.h"
|
#include "tns.h"
|
||||||
#include "channel_map.h"
|
#include "channel_map.h"
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
|
|
||||||
struct BITSTREAMENCODER_INIT
|
struct BITSTREAMENCODER_INIT
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,11 +55,11 @@ typedef struct {
|
|||||||
Word16 windowShape;
|
Word16 windowShape;
|
||||||
Word16 groupingMask;
|
Word16 groupingMask;
|
||||||
Word16 sfbOffsets[MAX_GROUPED_SFB+1];
|
Word16 sfbOffsets[MAX_GROUPED_SFB+1];
|
||||||
Word16 mdctScale;
|
Word16 mdctScale;
|
||||||
Word32 *sfbEnergy;
|
Word32 *sfbEnergy;
|
||||||
Word32 *sfbSpreadedEnergy;
|
Word32 *sfbSpreadedEnergy;
|
||||||
Word32 *sfbThreshold;
|
Word32 *sfbThreshold;
|
||||||
Word32 *mdctSpectrum;
|
Word32 *mdctSpectrum;
|
||||||
Word32 sfbEnSumLR;
|
Word32 sfbEnSumLR;
|
||||||
Word32 sfbEnSumMS;
|
Word32 sfbEnSumMS;
|
||||||
Word32 sfbDist[MAX_GROUPED_SFB];
|
Word32 sfbDist[MAX_GROUPED_SFB];
|
||||||
|
|||||||
@@ -24,8 +24,8 @@
|
|||||||
#define __LINE_PE_H
|
#define __LINE_PE_H
|
||||||
|
|
||||||
|
|
||||||
#include "psy_const.h"
|
#include "psy_const.h"
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -72,4 +72,4 @@ void calcSfbPe(PE_DATA *peData,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ enum
|
|||||||
|
|
||||||
#define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128)
|
#define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128)
|
||||||
#define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG
|
#define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG
|
||||||
|
|
||||||
#define TRANSFORM_OFFSET_LONG 0
|
#define TRANSFORM_OFFSET_LONG 0
|
||||||
#define TRANSFORM_OFFSET_SHORT 448
|
#define TRANSFORM_OFFSET_SHORT 448
|
||||||
|
|
||||||
|
|||||||
@@ -54,9 +54,9 @@ Word16 psyMainInit( PSY_KERNEL *hPsy,
|
|||||||
Word16 bandwidth);
|
Word16 bandwidth);
|
||||||
|
|
||||||
|
|
||||||
Word16 psyMain(Word16 nChannels, /*!< total number of channels */
|
Word16 psyMain(Word16 nChannels, /*!< total number of channels */
|
||||||
ELEMENT_INFO *elemInfo,
|
ELEMENT_INFO *elemInfo,
|
||||||
Word16 *timeSignal, /*!< interleaved time signal */
|
Word16 *timeSignal, /*!< interleaved time signal */
|
||||||
PSY_DATA psyData[MAX_CHANNELS],
|
PSY_DATA psyData[MAX_CHANNELS],
|
||||||
TNS_DATA tnsData[MAX_CHANNELS],
|
TNS_DATA tnsData[MAX_CHANNELS],
|
||||||
PSY_CONFIGURATION_LONG* psyConfLong,
|
PSY_CONFIGURATION_LONG* psyConfLong,
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ void QCOutDelete(QC_OUT *hQC, VO_MEM_OPERATOR *pMemOP);
|
|||||||
|
|
||||||
Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
|
Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
|
||||||
|
|
||||||
Word16 QCInit(QC_STATE *hQC,
|
Word16 QCInit(QC_STATE *hQC,
|
||||||
struct QC_INIT *init);
|
struct QC_INIT *init);
|
||||||
|
|
||||||
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
|
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
#define MAX_QUANT 8191
|
#define MAX_QUANT 8191
|
||||||
|
|
||||||
void QuantizeSpectrum(Word16 sfbCnt,
|
void QuantizeSpectrum(Word16 sfbCnt,
|
||||||
Word16 maxSfbPerGroup,
|
Word16 maxSfbPerGroup,
|
||||||
Word16 sfbPerGroup,
|
Word16 sfbPerGroup,
|
||||||
Word16 *sfbOffset, Word32 *mdctSpectrum,
|
Word16 *sfbOffset, Word32 *mdctSpectrum,
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef __SF_ESTIM_H__
|
#ifndef __SF_ESTIM_H__
|
||||||
#define __SF_ESTIM_H__
|
#define __SF_ESTIM_H__
|
||||||
/*
|
/*
|
||||||
Scale factor estimation
|
Scale factor estimation
|
||||||
*/
|
*/
|
||||||
#include "psy_const.h"
|
#include "psy_const.h"
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||||
PSY_OUT_ELEMENT *psyOutElement,
|
PSY_OUT_ELEMENT *psyOutElement,
|
||||||
Word16 nChannels,
|
Word16 nChannels,
|
||||||
Word16 adtsUsed);
|
Word16 adtsUsed);
|
||||||
|
|
||||||
#endif /* __STAT_BITS_H */
|
#endif /* __STAT_BITS_H */
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ typedef struct{
|
|||||||
}TNS_INFO_TAB;
|
}TNS_INFO_TAB;
|
||||||
|
|
||||||
|
|
||||||
void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
|
void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
|
||||||
Word32 bitRate, Word16 channels, Word16 blockType);
|
Word32 bitRate, Word16 channels, Word16 blockType);
|
||||||
|
|
||||||
void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb);
|
void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#define __TRANSFORM_H__
|
#define __TRANSFORM_H__
|
||||||
|
|
||||||
#include "typedef.h"
|
#include "typedef.h"
|
||||||
|
|
||||||
void Transform_Real(Word16 *mdctDelayBuffer,
|
void Transform_Real(Word16 *mdctDelayBuffer,
|
||||||
Word16 *timeSignal,
|
Word16 *timeSignal,
|
||||||
Word16 chIncrement, /*! channel increment */
|
Word16 chIncrement, /*! channel increment */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -48,7 +48,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD
|
|||||||
|
|
||||||
interMem = 0;
|
interMem = 0;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
/* init the memory operator */
|
/* init the memory operator */
|
||||||
if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
|
if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
|
||||||
{
|
{
|
||||||
@@ -113,7 +113,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD
|
|||||||
{
|
{
|
||||||
mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC);
|
mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC);
|
||||||
hAacEnc = NULL;
|
hAacEnc = NULL;
|
||||||
}
|
}
|
||||||
*phCodec = NULL;
|
*phCodec = NULL;
|
||||||
return VO_ERR_OUTOF_MEMORY;
|
return VO_ERR_OUTOF_MEMORY;
|
||||||
}
|
}
|
||||||
@@ -168,9 +168,9 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
|
|||||||
{
|
{
|
||||||
return VO_ERR_INVALID_ARG;
|
return VO_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
hAacEnc = (AAC_ENCODER *)hCodec;
|
hAacEnc = (AAC_ENCODER *)hCodec;
|
||||||
|
|
||||||
/* init input pcm buffer and length*/
|
/* init input pcm buffer and length*/
|
||||||
hAacEnc->inbuf = (short *)pInput->Buffer;
|
hAacEnc->inbuf = (short *)pInput->Buffer;
|
||||||
hAacEnc->inlen = pInput->Length / sizeof(short);
|
hAacEnc->inlen = pInput->Length / sizeof(short);
|
||||||
@@ -178,12 +178,12 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
|
|||||||
|
|
||||||
hAacEnc->encbuf = hAacEnc->inbuf;
|
hAacEnc->encbuf = hAacEnc->inbuf;
|
||||||
hAacEnc->enclen = hAacEnc->inlen;
|
hAacEnc->enclen = hAacEnc->inlen;
|
||||||
|
|
||||||
/* rebuild intra pcm buffer and length*/
|
/* rebuild intra pcm buffer and length*/
|
||||||
if(hAacEnc->intlen)
|
if(hAacEnc->intlen)
|
||||||
{
|
{
|
||||||
length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
|
length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
|
||||||
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen,
|
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen,
|
||||||
hAacEnc->inbuf, length*sizeof(short));
|
hAacEnc->inbuf, length*sizeof(short));
|
||||||
|
|
||||||
hAacEnc->encbuf = hAacEnc->intbuf;
|
hAacEnc->encbuf = hAacEnc->intbuf;
|
||||||
@@ -192,7 +192,7 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
|
|||||||
hAacEnc->inbuf += length;
|
hAacEnc->inbuf += length;
|
||||||
hAacEnc->inlen -= length;
|
hAacEnc->inlen -= length;
|
||||||
}
|
}
|
||||||
|
|
||||||
return VO_ERR_NONE;
|
return VO_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,11 +219,11 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
|
|||||||
/* check the input pcm buffer and length*/
|
/* check the input pcm buffer and length*/
|
||||||
if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
|
if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
|
||||||
{
|
{
|
||||||
length = hAacEnc->enclen;
|
length = hAacEnc->enclen;
|
||||||
if(hAacEnc->intlen == 0)
|
if(hAacEnc->intlen == 0)
|
||||||
{
|
{
|
||||||
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
|
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
|
||||||
hAacEnc->encbuf, length*sizeof(short));
|
hAacEnc->encbuf, length*sizeof(short));
|
||||||
hAacEnc->uselength += length*sizeof(short);
|
hAacEnc->uselength += length*sizeof(short);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -236,7 +236,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
|
|||||||
pOutput->Length = 0;
|
pOutput->Length = 0;
|
||||||
if(pOutInfo)
|
if(pOutInfo)
|
||||||
pOutInfo->InputUsed = hAacEnc->uselength;
|
pOutInfo->InputUsed = hAacEnc->uselength;
|
||||||
return VO_ERR_INPUT_BUFFER_SMALL;
|
return VO_ERR_INPUT_BUFFER_SMALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check the output aac buffer and length*/
|
/* check the output aac buffer and length*/
|
||||||
@@ -254,7 +254,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
|
|||||||
/* update the input pcm buffer and length*/
|
/* update the input pcm buffer and length*/
|
||||||
if(hAacEnc->intlen)
|
if(hAacEnc->intlen)
|
||||||
{
|
{
|
||||||
length = inbuflen - hAacEnc->intlen;
|
length = inbuflen - hAacEnc->intlen;
|
||||||
hAacEnc->encbuf = hAacEnc->inbuf;
|
hAacEnc->encbuf = hAacEnc->inbuf;
|
||||||
hAacEnc->enclen = hAacEnc->inlen;
|
hAacEnc->enclen = hAacEnc->inlen;
|
||||||
hAacEnc->uselength += length*sizeof(short);
|
hAacEnc->uselength += length*sizeof(short);
|
||||||
@@ -265,7 +265,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
|
|||||||
hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
|
hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
|
||||||
hAacEnc->enclen = hAacEnc->enclen - inbuflen;
|
hAacEnc->enclen = hAacEnc->enclen - inbuflen;
|
||||||
hAacEnc->uselength += inbuflen*sizeof(short);
|
hAacEnc->uselength += inbuflen*sizeof(short);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update the output aac information */
|
/* update the output aac information */
|
||||||
if(pOutInfo)
|
if(pOutInfo)
|
||||||
@@ -287,7 +287,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
|
|||||||
VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
|
VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
|
||||||
{
|
{
|
||||||
AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
|
AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
|
||||||
|
|
||||||
if(NULL != hAacEnc)
|
if(NULL != hAacEnc)
|
||||||
{
|
{
|
||||||
/* close the aac encoder */
|
/* close the aac encoder */
|
||||||
@@ -296,7 +296,7 @@ VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
|
|||||||
/* free the aac encoder handle*/
|
/* free the aac encoder handle*/
|
||||||
mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
|
mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
|
||||||
hAacEnc = NULL;
|
hAacEnc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return VO_ERR_NONE;
|
return VO_ERR_NONE;
|
||||||
}
|
}
|
||||||
@@ -319,7 +319,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
|
|||||||
|
|
||||||
if(NULL == hAacEnc)
|
if(NULL == hAacEnc)
|
||||||
return VO_ERR_INVALID_ARG;
|
return VO_ERR_INVALID_ARG;
|
||||||
|
|
||||||
switch(uParamID)
|
switch(uParamID)
|
||||||
{
|
{
|
||||||
case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/
|
case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/
|
||||||
@@ -354,11 +354,11 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
|
|||||||
SampleRateIdx = i;
|
SampleRateIdx = i;
|
||||||
|
|
||||||
tmp = 441;
|
tmp = 441;
|
||||||
if(config.sampleRate%8000 == 0)
|
if(config.sampleRate%8000 == 0)
|
||||||
tmp =480;
|
tmp =480;
|
||||||
/* check the bitrate */
|
/* check the bitrate */
|
||||||
if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||
|
if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||
|
||||||
(config.bitRate/config.nChannelsOut > 160000) ||
|
(config.bitRate/config.nChannelsOut > 160000) ||
|
||||||
(config.bitRate > config.sampleRate*6*config.nChannelsOut))
|
(config.bitRate > config.sampleRate*6*config.nChannelsOut))
|
||||||
{
|
{
|
||||||
config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
|
config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
|
||||||
@@ -385,7 +385,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
|
|||||||
|
|
||||||
/* init aac encoder core */
|
/* init aac encoder core */
|
||||||
ret = AacEncOpen(hAacEnc, config);
|
ret = AacEncOpen(hAacEnc, config);
|
||||||
if(ret)
|
if(ret)
|
||||||
return VO_ERR_AUDIO_UNSFEATURE;
|
return VO_ERR_AUDIO_UNSFEATURE;
|
||||||
break;
|
break;
|
||||||
case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/
|
case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/
|
||||||
@@ -426,7 +426,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
|
|||||||
|
|
||||||
/* update the bitrates */
|
/* update the bitrates */
|
||||||
tmp = 441;
|
tmp = 441;
|
||||||
if(config.sampleRate%8000 == 0)
|
if(config.sampleRate%8000 == 0)
|
||||||
tmp =480;
|
tmp =480;
|
||||||
|
|
||||||
config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
|
config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
|
||||||
@@ -449,10 +449,10 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
|
|||||||
}
|
}
|
||||||
|
|
||||||
config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
|
config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
|
||||||
|
|
||||||
/* init aac encoder core */
|
/* init aac encoder core */
|
||||||
ret = AacEncOpen(hAacEnc, config);
|
ret = AacEncOpen(hAacEnc, config);
|
||||||
if(ret)
|
if(ret)
|
||||||
return VO_ERR_AUDIO_UNSFEATURE;
|
return VO_ERR_AUDIO_UNSFEATURE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -483,7 +483,7 @@ VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
|
|||||||
{
|
{
|
||||||
if(pDecHandle == NULL)
|
if(pDecHandle == NULL)
|
||||||
return VO_ERR_INVALID_ARG;
|
return VO_ERR_INVALID_ARG;
|
||||||
|
|
||||||
pDecHandle->Init = voAACEncInit;
|
pDecHandle->Init = voAACEncInit;
|
||||||
pDecHandle->SetInputData = voAACEncSetInputData;
|
pDecHandle->SetInputData = voAACEncSetInputData;
|
||||||
pDecHandle->GetOutputData = voAACEncGetOutputData;
|
pDecHandle->GetOutputData = voAACEncGetOutputData;
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ void AacInitDefaultConfig(AACENC_CONFIG *config)
|
|||||||
config->adtsUsed = 1;
|
config->adtsUsed = 1;
|
||||||
config->nChannelsIn = 2;
|
config->nChannelsIn = 2;
|
||||||
config->nChannelsOut = 2;
|
config->nChannelsOut = 2;
|
||||||
config->bitRate = 128000;
|
config->bitRate = 128000;
|
||||||
config->bandWidth = 0;
|
config->bandWidth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
@@ -63,11 +63,11 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
|||||||
Word16 profile = 1;
|
Word16 profile = 1;
|
||||||
|
|
||||||
ELEMENT_INFO *elInfo = NULL;
|
ELEMENT_INFO *elInfo = NULL;
|
||||||
|
|
||||||
if (hAacEnc==0) {
|
if (hAacEnc==0) {
|
||||||
error=1;
|
error=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
hAacEnc->config = config;
|
hAacEnc->config = config;
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
|||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
/* use or not tns tool for long and short block */
|
/* use or not tns tool for long and short block */
|
||||||
Word16 tnsMask=3;
|
Word16 tnsMask=3;
|
||||||
|
|
||||||
/* init encoder psychoacoustic */
|
/* init encoder psychoacoustic */
|
||||||
error = psyMainInit(&hAacEnc->psyKernel,
|
error = psyMainInit(&hAacEnc->psyKernel,
|
||||||
@@ -107,10 +107,10 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
|||||||
qcInit.elInfo = &hAacEnc->elInfo;
|
qcInit.elInfo = &hAacEnc->elInfo;
|
||||||
|
|
||||||
qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl);
|
qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl);
|
||||||
qcInit.bitRes = qcInit.maxBits;
|
qcInit.bitRes = qcInit.maxBits;
|
||||||
qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate);
|
qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate);
|
||||||
|
|
||||||
qcInit.padding.paddingRest = config.sampleRate;
|
qcInit.padding.paddingRest = config.sampleRate;
|
||||||
|
|
||||||
qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) /
|
qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) /
|
||||||
(config.sampleRate>>1));
|
(config.sampleRate>>1));
|
||||||
@@ -118,17 +118,17 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
|||||||
qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/
|
qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/
|
||||||
(qcInit.averageBits?qcInit.averageBits:1));
|
(qcInit.averageBits?qcInit.averageBits:1));
|
||||||
|
|
||||||
qcInit.bitrate = config.bitRate;
|
qcInit.bitrate = config.bitRate;
|
||||||
|
|
||||||
error = QCInit(&hAacEnc->qcKernel, &qcInit);
|
error = QCInit(&hAacEnc->qcKernel, &qcInit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* init bitstream encoder */
|
/* init bitstream encoder */
|
||||||
if (!error) {
|
if (!error) {
|
||||||
hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
|
hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
|
||||||
hAacEnc->bseInit.bitrate = config.bitRate;
|
hAacEnc->bseInit.bitrate = config.bitRate;
|
||||||
hAacEnc->bseInit.sampleRate = config.sampleRate;
|
hAacEnc->bseInit.sampleRate = config.sampleRate;
|
||||||
hAacEnc->bseInit.profile = profile;
|
hAacEnc->bseInit.profile = profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@@ -152,14 +152,14 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
|||||||
ELEMENT_INFO *elInfo = &aacEnc->elInfo;
|
ELEMENT_INFO *elInfo = &aacEnc->elInfo;
|
||||||
Word16 globUsedBits;
|
Word16 globUsedBits;
|
||||||
Word16 ancDataBytes, ancDataBytesLeft;
|
Word16 ancDataBytes, ancDataBytesLeft;
|
||||||
|
|
||||||
ancDataBytes = ancDataBytesLeft = *numAncBytes;
|
ancDataBytes = ancDataBytesLeft = *numAncBytes;
|
||||||
|
|
||||||
/* init output aac data buffer and length */
|
/* init output aac data buffer and length */
|
||||||
aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes);
|
aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes);
|
||||||
|
|
||||||
/* psychoacoustic process */
|
/* psychoacoustic process */
|
||||||
psyMain(aacEnc->config.nChannelsOut,
|
psyMain(aacEnc->config.nChannelsOut,
|
||||||
elInfo,
|
elInfo,
|
||||||
timeSignal,
|
timeSignal,
|
||||||
&aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
|
&aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
|
||||||
@@ -175,9 +175,9 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
|||||||
AdjustBitrate(&aacEnc->qcKernel,
|
AdjustBitrate(&aacEnc->qcKernel,
|
||||||
aacEnc->config.bitRate,
|
aacEnc->config.bitRate,
|
||||||
aacEnc->config.sampleRate);
|
aacEnc->config.sampleRate);
|
||||||
|
|
||||||
/* quantization and coding process */
|
/* quantization and coding process */
|
||||||
QCMain(&aacEnc->qcKernel,
|
QCMain(&aacEnc->qcKernel,
|
||||||
&aacEnc->qcKernel.elementBits,
|
&aacEnc->qcKernel.elementBits,
|
||||||
&aacEnc->qcKernel.adjThr.adjThrStateElem,
|
&aacEnc->qcKernel.adjThr.adjThrStateElem,
|
||||||
&aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
|
&aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
|
||||||
@@ -193,11 +193,11 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
|||||||
&aacEnc->qcOut);
|
&aacEnc->qcOut);
|
||||||
|
|
||||||
/* write bitstream process */
|
/* write bitstream process */
|
||||||
WriteBitstream(aacEnc->hBitStream,
|
WriteBitstream(aacEnc->hBitStream,
|
||||||
*elInfo,
|
*elInfo,
|
||||||
&aacEnc->qcOut,
|
&aacEnc->qcOut,
|
||||||
&aacEnc->psyOut,
|
&aacEnc->psyOut,
|
||||||
&globUsedBits,
|
&globUsedBits,
|
||||||
ancBytes,
|
ancBytes,
|
||||||
aacEnc->psyKernel.sampleRateIdx);
|
aacEnc->psyKernel.sampleRateIdx);
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
|||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP)
|
void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP)
|
||||||
{
|
{
|
||||||
if (hAacEnc) {
|
if (hAacEnc) {
|
||||||
QCDelete(&hAacEnc->qcKernel, pMemOP);
|
QCDelete(&hAacEnc->qcKernel, pMemOP);
|
||||||
|
|
||||||
QCOutDelete(&hAacEnc->qcOut, pMemOP);
|
QCOutDelete(&hAacEnc->qcOut, pMemOP);
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
Word32 *pthrExp, *psfbThre;
|
Word32 *pthrExp, *psfbThre;
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)
|
for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)
|
||||||
pthrExp = &(thrExp[ch][sfbGrp]);
|
pthrExp = &(thrExp[ch][sfbGrp]);
|
||||||
psfbThre = psyOutChan->sfbThreshold + sfbGrp;
|
psfbThre = psyOutChan->sfbThreshold + sfbGrp;
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
@@ -96,21 +96,21 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
Word32 nSfb, avgEn;
|
Word32 nSfb, avgEn;
|
||||||
Word16 log_avgEn = 0;
|
Word16 log_avgEn = 0;
|
||||||
Word32 startRatio_x_avgEn = 0;
|
Word32 startRatio_x_avgEn = 0;
|
||||||
|
|
||||||
|
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch];
|
||||||
|
|
||||||
/* calc average energy per scalefactor band */
|
/* calc average energy per scalefactor band */
|
||||||
avgEn = 0;
|
avgEn = 0;
|
||||||
nSfb = 0;
|
nSfb = 0;
|
||||||
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
|
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]);
|
avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]);
|
||||||
nSfb = nSfb + 1;
|
nSfb = nSfb + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nSfb > 0) {
|
if (nSfb > 0) {
|
||||||
avgEn = avgEn / nSfb;
|
avgEn = avgEn / nSfb;
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn);
|
startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
|
/* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
|
||||||
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
|
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
@@ -126,22 +126,22 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
Word16 dbRatio, minSnrRed;
|
Word16 dbRatio, minSnrRed;
|
||||||
Word32 snrRed;
|
Word32 snrRed;
|
||||||
Word16 newMinSnr;
|
Word16 newMinSnr;
|
||||||
|
|
||||||
dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb];
|
dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb];
|
||||||
dbRatio = dbRatio + (dbRatio << 1);
|
dbRatio = dbRatio + (dbRatio << 1);
|
||||||
|
|
||||||
minSnrRed = 110 - ((dbRatio + (dbRatio << 1)) >> 2);
|
minSnrRed = 110 - ((dbRatio + (dbRatio << 1)) >> 2);
|
||||||
minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80,
|
minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80,
|
||||||
3: 0.00375(redRatioFac)*80
|
3: 0.00375(redRatioFac)*80
|
||||||
20: 0.25(maxRed) * 80 */
|
20: 0.25(maxRed) * 80 */
|
||||||
|
|
||||||
snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16));
|
snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16));
|
||||||
/*
|
/*
|
||||||
snrRedI si now scaled by 80 (minSnrRed) and 4 (ffr_iLog4)
|
snrRedI si now scaled by 80 (minSnrRed) and 4 (ffr_iLog4)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
newMinSnr = round16(pow2_xy(snrRed,80*4));
|
newMinSnr = round16(pow2_xy(snrRed,80*4));
|
||||||
|
|
||||||
psyOutChan->sfbMinSnr[sfbOffs+sfb] = min(newMinSnr, minSnrLimit);
|
psyOutChan->sfbMinSnr[sfbOffs+sfb] = min(newMinSnr, minSnrLimit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
|
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
|
|
||||||
if (psyOutChan->windowSequence != SHORT_WINDOW) {
|
if (psyOutChan->windowSequence != SHORT_WINDOW) {
|
||||||
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
||||||
psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
|
psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
|
||||||
@@ -194,7 +194,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
if (ahParam->modifyMinSnr) {
|
if (ahParam->modifyMinSnr) {
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
|
|
||||||
if (psyOutChan->windowSequence != SHORT_WINDOW)
|
if (psyOutChan->windowSequence != SHORT_WINDOW)
|
||||||
threshold = HOLE_THR_LONG;
|
threshold = HOLE_THR_LONG;
|
||||||
else
|
else
|
||||||
@@ -204,39 +204,39 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
|
Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn;
|
Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn;
|
||||||
|
|
||||||
if (sfb > 0)
|
if (sfb > 0)
|
||||||
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1];
|
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1];
|
||||||
else
|
else
|
||||||
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp];
|
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp];
|
||||||
|
|
||||||
if (sfb < (psyOutChan->maxSfbPerGroup-1))
|
if (sfb < (psyOutChan->maxSfbPerGroup-1))
|
||||||
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1];
|
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1];
|
||||||
else
|
else
|
||||||
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
||||||
avgEn = (sfbEnm1 + sfbEnp1) >> 1;
|
avgEn = (sfbEnm1 + sfbEnp1) >> 1;
|
||||||
sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
||||||
|
|
||||||
if (sfbEn > avgEn && avgEn > 0) {
|
if (sfbEn > avgEn && avgEn > 0) {
|
||||||
Word32 tmpMinSnr;
|
Word32 tmpMinSnr;
|
||||||
shift = norm_l(sfbEn);
|
shift = norm_l(sfbEn);
|
||||||
tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift );
|
tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift );
|
||||||
tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG);
|
tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG);
|
||||||
tmpMinSnr = max(tmpMinSnr, threshold);
|
tmpMinSnr = max(tmpMinSnr, threshold);
|
||||||
*psfbMinSnr = min(*psfbMinSnr, tmpMinSnr);
|
*psfbMinSnr = min(*psfbMinSnr, tmpMinSnr);
|
||||||
}
|
}
|
||||||
/* valley ? */
|
/* valley ? */
|
||||||
|
|
||||||
if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) {
|
if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) {
|
||||||
Word32 tmpMinSnr;
|
Word32 tmpMinSnr;
|
||||||
Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);
|
Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);
|
||||||
|
|
||||||
if(minSnrEn < sfbEn) {
|
if(minSnrEn < sfbEn) {
|
||||||
shift = norm_l(sfbEn);
|
shift = norm_l(sfbEn);
|
||||||
tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift);
|
tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tmpMinSnr = MAX_16;
|
tmpMinSnr = MAX_16;
|
||||||
}
|
}
|
||||||
tmpMinSnr = min(minSnrLimit, tmpMinSnr);
|
tmpMinSnr = min(minSnrLimit, tmpMinSnr);
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
|
|
||||||
/* stereo: adapt the minimum requirements sfbMinSnr of mid and
|
/* stereo: adapt the minimum requirements sfbMinSnr of mid and
|
||||||
side channels */
|
side channels */
|
||||||
|
|
||||||
if (nChannels == 2) {
|
if (nChannels == 2) {
|
||||||
PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0];
|
PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0];
|
||||||
PSY_OUT_CHANNEL *psyOutChanS = &psyOutChannel[1];
|
PSY_OUT_CHANNEL *psyOutChanS = &psyOutChannel[1];
|
||||||
@@ -260,30 +260,30 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
Word32 sfbEnM = psyOutChanM->sfbEnergy[sfb];
|
Word32 sfbEnM = psyOutChanM->sfbEnergy[sfb];
|
||||||
Word32 sfbEnS = psyOutChanS->sfbEnergy[sfb];
|
Word32 sfbEnS = psyOutChanS->sfbEnergy[sfb];
|
||||||
Word32 maxSfbEn = max(sfbEnM, sfbEnS);
|
Word32 maxSfbEn = max(sfbEnM, sfbEnS);
|
||||||
Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1;
|
Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1;
|
||||||
|
|
||||||
if(maxThr >= sfbEnM) {
|
if(maxThr >= sfbEnM) {
|
||||||
psyOutChanM->sfbMinSnr[sfb] = MAX_16;
|
psyOutChanM->sfbMinSnr[sfb] = MAX_16;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
shift = norm_l(sfbEnM);
|
shift = norm_l(sfbEnM);
|
||||||
psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
|
psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
|
||||||
round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit);
|
round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(maxThr >= sfbEnS) {
|
if(maxThr >= sfbEnS) {
|
||||||
psyOutChanS->sfbMinSnr[sfb] = MAX_16;
|
psyOutChanS->sfbMinSnr[sfb] = MAX_16;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
shift = norm_l(sfbEnS);
|
shift = norm_l(sfbEnS);
|
||||||
psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb],
|
psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb],
|
||||||
round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit);
|
round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb])
|
if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb])
|
||||||
psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF);
|
psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF);
|
||||||
|
|
||||||
if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb])
|
if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb])
|
||||||
psyOutChanM->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnM, MS_THRSPREAD_COEF);
|
psyOutChanM->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnM, MS_THRSPREAD_COEF);
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
||||||
Word16 *pahFlag = ahFlag[ch] + sfbGrp;
|
Word16 *pahFlag = ahFlag[ch] + sfbGrp;
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
|
|
||||||
if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) ||
|
if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) ||
|
||||||
(psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) ||
|
(psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) ||
|
||||||
(psyOutChan->sfbMinSnr[sfbGrp+sfb] == MAX_16)) {
|
(psyOutChan->sfbMinSnr[sfbGrp+sfb] == MAX_16)) {
|
||||||
@@ -308,7 +308,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) {
|
for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) {
|
||||||
*pahFlag++ = NO_AH;
|
*pahFlag++ = NO_AH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -331,15 +331,15 @@ static void calcPeNoAH(Word16 *pe,
|
|||||||
Word16 ch, sfb, sfbGrp;
|
Word16 ch, sfb, sfbGrp;
|
||||||
int ipe, iconstPart, inActiveLines;
|
int ipe, iconstPart, inActiveLines;
|
||||||
|
|
||||||
ipe = 0;
|
ipe = 0;
|
||||||
iconstPart = 0;
|
iconstPart = 0;
|
||||||
inActiveLines = 0;
|
inActiveLines = 0;
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
|
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
|
||||||
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
|
|
||||||
if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
|
if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
|
||||||
ipe = ipe + peChanData->sfbPe[sfbGrp+sfb];
|
ipe = ipe + peChanData->sfbPe[sfbGrp+sfb];
|
||||||
iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb];
|
iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb];
|
||||||
@@ -349,9 +349,9 @@ static void calcPeNoAH(Word16 *pe,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*pe = saturate(ipe);
|
*pe = saturate(ipe);
|
||||||
*constPart = saturate(iconstPart);
|
*constPart = saturate(iconstPart);
|
||||||
*nActiveLines = saturate(inActiveLines);
|
*nActiveLines = saturate(inActiveLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
@@ -367,16 +367,16 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
const Word32 redVal)
|
const Word32 redVal)
|
||||||
{
|
{
|
||||||
Word32 sfbThrReduced;
|
Word32 sfbThrReduced;
|
||||||
Word32 *psfbEn, *psfbThr;
|
Word32 *psfbEn, *psfbThr;
|
||||||
Word16 ch, sfb, sfbGrp;
|
Word16 ch, sfb, sfbGrp;
|
||||||
|
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
|
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
|
||||||
psfbEn = psyOutChan->sfbEnergy + sfbGrp;
|
psfbEn = psyOutChan->sfbEnergy + sfbGrp;
|
||||||
psfbThr = psyOutChan->sfbThreshold + sfbGrp;
|
psfbThr = psyOutChan->sfbThreshold + sfbGrp;
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
|
|
||||||
if (*psfbEn > *psfbThr) {
|
if (*psfbEn > *psfbThr) {
|
||||||
/* threshold reduction formula */
|
/* threshold reduction formula */
|
||||||
Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal;
|
Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal;
|
||||||
@@ -384,11 +384,11 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
sfbThrReduced = fixmul(tmp, tmp);
|
sfbThrReduced = fixmul(tmp, tmp);
|
||||||
/* avoid holes */
|
/* avoid holes */
|
||||||
tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
|
tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
|
||||||
|
|
||||||
if ((sfbThrReduced > tmp) &&
|
if ((sfbThrReduced > tmp) &&
|
||||||
(ahFlag[ch][sfbGrp+sfb] != NO_AH)){
|
(ahFlag[ch][sfbGrp+sfb] != NO_AH)){
|
||||||
sfbThrReduced = max(tmp, *psfbThr);
|
sfbThrReduced = max(tmp, *psfbThr);
|
||||||
ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
|
ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
|
||||||
}
|
}
|
||||||
*psfbThr = sfbThrReduced;
|
*psfbThr = sfbThrReduced;
|
||||||
}
|
}
|
||||||
@@ -426,7 +426,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
Word32 sfbThrReduced;
|
Word32 sfbThrReduced;
|
||||||
|
|
||||||
/* for each sfb calc relative factors for pe changes */
|
/* for each sfb calc relative factors for pe changes */
|
||||||
normFactor = 1;
|
normFactor = 1;
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
psyOutChan = &psyOutChannel[ch];
|
psyOutChan = &psyOutChannel[ch];
|
||||||
peChanData = &peData->peChannelData[ch];
|
peChanData = &peData->peChannelData[ch];
|
||||||
@@ -436,22 +436,22 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
pahFlag = ahFlag[ch] + sfbGrp;
|
pahFlag = ahFlag[ch] + sfbGrp;
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal;
|
Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal;
|
||||||
|
|
||||||
if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) {
|
if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) {
|
||||||
|
|
||||||
*psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp);
|
*psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp);
|
||||||
normFactor = L_add(normFactor, *psfbPeFactors);
|
normFactor = L_add(normFactor, *psfbPeFactors);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*psfbPeFactors = 0;
|
*psfbPeFactors = 0;
|
||||||
}
|
}
|
||||||
psfbPeFactors++;
|
psfbPeFactors++;
|
||||||
pahFlag++; psfbNActiveLines++;
|
pahFlag++; psfbNActiveLines++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* calculate new thresholds */
|
/* calculate new thresholds */
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
psyOutChan = &psyOutChannel[ch];
|
psyOutChan = &psyOutChannel[ch];
|
||||||
@@ -464,7 +464,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
/* pe difference for this sfb */
|
/* pe difference for this sfb */
|
||||||
deltaSfbPe = *psfbPeFactors * deltaPe;
|
deltaSfbPe = *psfbPeFactors * deltaPe;
|
||||||
|
|
||||||
/* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
|
/* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
|
||||||
if (*psfbNActiveLines > 0) {
|
if (*psfbNActiveLines > 0) {
|
||||||
/* new threshold */
|
/* new threshold */
|
||||||
Word32 thrFactor;
|
Word32 thrFactor;
|
||||||
@@ -476,7 +476,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
reduce threshold
|
reduce threshold
|
||||||
*/
|
*/
|
||||||
thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines)));
|
thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines)));
|
||||||
|
|
||||||
sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor));
|
sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -484,28 +484,28 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
increase threshold
|
increase threshold
|
||||||
*/
|
*/
|
||||||
thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines)));
|
thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines)));
|
||||||
|
|
||||||
|
|
||||||
if(thrFactor > sfbThr) {
|
if(thrFactor > sfbThr) {
|
||||||
shift = norm_l(thrFactor);
|
shift = norm_l(thrFactor);
|
||||||
sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift );
|
sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sfbThrReduced = MAX_32;
|
sfbThrReduced = MAX_32;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* avoid hole */
|
/* avoid hole */
|
||||||
sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
|
sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
|
||||||
|
|
||||||
if ((sfbThrReduced > sfbEn) &&
|
if ((sfbThrReduced > sfbEn) &&
|
||||||
(*pahFlag == AH_INACTIVE)) {
|
(*pahFlag == AH_INACTIVE)) {
|
||||||
sfbThrReduced = max(sfbEn, sfbThr);
|
sfbThrReduced = max(sfbEn, sfbThr);
|
||||||
*pahFlag = AH_ACTIVE;
|
*pahFlag = AH_ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
|
psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
|
||||||
}
|
}
|
||||||
|
|
||||||
pahFlag++; psfbNActiveLines++; psfbPeFactors++;
|
pahFlag++; psfbNActiveLines++; psfbPeFactors++;
|
||||||
@@ -521,8 +521,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
* description: if the desired pe can not be reached, reduce pe by reducing minSnr
|
* description: if the desired pe can not be reached, reduce pe by reducing minSnr
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||||
PE_DATA *peData,
|
PE_DATA *peData,
|
||||||
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||||
const Word16 nChannels,
|
const Word16 nChannels,
|
||||||
const Word16 desiredPe)
|
const Word16 desiredPe)
|
||||||
@@ -531,9 +531,9 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
Word16 deltaPe;
|
Word16 deltaPe;
|
||||||
|
|
||||||
/* start at highest freq down to 0 */
|
/* start at highest freq down to 0 */
|
||||||
sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
|
sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
|
||||||
while (peData->pe > desiredPe && sfbSubWin > 0) {
|
while (peData->pe > desiredPe && sfbSubWin > 0) {
|
||||||
|
|
||||||
sfbSubWin = sfbSubWin - 1;
|
sfbSubWin = sfbSubWin - 1;
|
||||||
/* loop over all subwindows */
|
/* loop over all subwindows */
|
||||||
for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
|
for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
|
||||||
@@ -541,10 +541,10 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
/* loop over all channels */
|
/* loop over all channels */
|
||||||
PE_CHANNEL_DATA* peChan = peData->peChannelData;
|
PE_CHANNEL_DATA* peChan = peData->peChannelData;
|
||||||
PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
|
PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
if (ahFlag[ch][sfb] != NO_AH &&
|
if (ahFlag[ch][sfb] != NO_AH &&
|
||||||
psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
|
psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
|
||||||
psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
|
psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
|
||||||
psyOutCh->sfbThreshold[sfb] =
|
psyOutCh->sfbThreshold[sfb] =
|
||||||
L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]);
|
L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]);
|
||||||
|
|
||||||
@@ -552,12 +552,12 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) -
|
deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) -
|
||||||
peChan->sfbPe[sfb];
|
peChan->sfbPe[sfb];
|
||||||
peData->pe = peData->pe + deltaPe;
|
peData->pe = peData->pe + deltaPe;
|
||||||
peChan->pe = peChan->pe + deltaPe;
|
peChan->pe = peChan->pe + deltaPe;
|
||||||
}
|
}
|
||||||
peChan += 1; psyOutCh += 1;
|
peChan += 1; psyOutCh += 1;
|
||||||
}
|
}
|
||||||
/* stop if enough has been saved */
|
/* stop if enough has been saved */
|
||||||
|
|
||||||
if (peData->pe <= desiredPe)
|
if (peData->pe <= desiredPe)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -567,13 +567,13 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
*
|
*
|
||||||
* function name:allowMoreHoles
|
* function name:allowMoreHoles
|
||||||
* description: if the desired pe can not be reached, some more scalefactor bands
|
* description: if the desired pe can not be reached, some more scalefactor bands
|
||||||
* have to be quantized to zero
|
* have to be quantized to zero
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||||
PSY_OUT_ELEMENT *psyOutElement,
|
PSY_OUT_ELEMENT *psyOutElement,
|
||||||
PE_DATA *peData,
|
PE_DATA *peData,
|
||||||
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||||
const AH_PARAM *ahParam,
|
const AH_PARAM *ahParam,
|
||||||
const Word16 nChannels,
|
const Word16 nChannels,
|
||||||
@@ -582,46 +582,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
Word16 ch, sfb;
|
Word16 ch, sfb;
|
||||||
Word16 actPe, shift;
|
Word16 actPe, shift;
|
||||||
|
|
||||||
actPe = peData->pe;
|
actPe = peData->pe;
|
||||||
|
|
||||||
/* for MS allow hole in the channel with less energy */
|
/* for MS allow hole in the channel with less energy */
|
||||||
|
|
||||||
if (nChannels==2 &&
|
if (nChannels==2 &&
|
||||||
psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) {
|
psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) {
|
||||||
PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0];
|
PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0];
|
||||||
PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1];
|
PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1];
|
||||||
for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) {
|
for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) {
|
||||||
Word32 minEn;
|
Word32 minEn;
|
||||||
|
|
||||||
if (psyOutElement->toolsInfo.msMask[sfb]) {
|
if (psyOutElement->toolsInfo.msMask[sfb]) {
|
||||||
/* allow hole in side channel ? */
|
/* allow hole in side channel ? */
|
||||||
minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16);
|
minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16);
|
||||||
|
|
||||||
if (ahFlag[1][sfb] != NO_AH &&
|
if (ahFlag[1][sfb] != NO_AH &&
|
||||||
minEn > psyOutChanR->sfbEnergy[sfb]) {
|
minEn > psyOutChanR->sfbEnergy[sfb]) {
|
||||||
ahFlag[1][sfb] = NO_AH;
|
ahFlag[1][sfb] = NO_AH;
|
||||||
psyOutChanR->sfbThreshold[sfb] = L_add(psyOutChanR->sfbEnergy[sfb], psyOutChanR->sfbEnergy[sfb]);
|
psyOutChanR->sfbThreshold[sfb] = L_add(psyOutChanR->sfbEnergy[sfb], psyOutChanR->sfbEnergy[sfb]);
|
||||||
actPe = actPe - peData->peChannelData[1].sfbPe[sfb];
|
actPe = actPe - peData->peChannelData[1].sfbPe[sfb];
|
||||||
}
|
}
|
||||||
/* allow hole in mid channel ? */
|
/* allow hole in mid channel ? */
|
||||||
else {
|
else {
|
||||||
minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16);
|
minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16);
|
||||||
|
|
||||||
if (ahFlag[0][sfb]!= NO_AH &&
|
if (ahFlag[0][sfb]!= NO_AH &&
|
||||||
minEn > psyOutChanL->sfbEnergy[sfb]) {
|
minEn > psyOutChanL->sfbEnergy[sfb]) {
|
||||||
ahFlag[0][sfb] = NO_AH;
|
ahFlag[0][sfb] = NO_AH;
|
||||||
psyOutChanL->sfbThreshold[sfb] = L_add(psyOutChanL->sfbEnergy[sfb], psyOutChanL->sfbEnergy[sfb]);
|
psyOutChanL->sfbThreshold[sfb] = L_add(psyOutChanL->sfbEnergy[sfb], psyOutChanL->sfbEnergy[sfb]);
|
||||||
actPe = actPe - peData->peChannelData[0].sfbPe[sfb];
|
actPe = actPe - peData->peChannelData[0].sfbPe[sfb];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actPe < desiredPe)
|
if (actPe < desiredPe)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* subsequently erase bands */
|
/* subsequently erase bands */
|
||||||
if (actPe > desiredPe) {
|
if (actPe > desiredPe) {
|
||||||
Word16 startSfb[2];
|
Word16 startSfb[2];
|
||||||
Word32 avgEn, minEn;
|
Word32 avgEn, minEn;
|
||||||
@@ -634,20 +634,20 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
|
|
||||||
/* do not go below startSfb */
|
/* do not go below startSfb */
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
|
|
||||||
if (psyOutChannel[ch].windowSequence != SHORT_WINDOW)
|
if (psyOutChannel[ch].windowSequence != SHORT_WINDOW)
|
||||||
startSfb[ch] = ahParam->startSfbL;
|
startSfb[ch] = ahParam->startSfbL;
|
||||||
else
|
else
|
||||||
startSfb[ch] = ahParam->startSfbS;
|
startSfb[ch] = ahParam->startSfbS;
|
||||||
}
|
}
|
||||||
|
|
||||||
avgEn = 0;
|
avgEn = 0;
|
||||||
minEn = MAX_32;
|
minEn = MAX_32;
|
||||||
ahCnt = 0;
|
ahCnt = 0;
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) {
|
for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) {
|
||||||
|
|
||||||
if ((ahFlag[ch][sfb] != NO_AH) &&
|
if ((ahFlag[ch][sfb] != NO_AH) &&
|
||||||
(psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) {
|
(psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) {
|
||||||
minEn = min(minEn, psyOutChan->sfbEnergy[sfb]);
|
minEn = min(minEn, psyOutChan->sfbEnergy[sfb]);
|
||||||
@@ -656,7 +656,7 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ahCnt) {
|
if(ahCnt) {
|
||||||
Word32 iahCnt;
|
Word32 iahCnt;
|
||||||
shift = norm_l(ahCnt);
|
shift = norm_l(ahCnt);
|
||||||
@@ -674,46 +674,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
|
|
||||||
/* start with lowest energy border at highest sfb */
|
/* start with lowest energy border at highest sfb */
|
||||||
maxSfb = psyOutChannel[0].sfbCnt - 1;
|
maxSfb = psyOutChannel[0].sfbCnt - 1;
|
||||||
minSfb = startSfb[0];
|
minSfb = startSfb[0];
|
||||||
|
|
||||||
if (nChannels == 2) {
|
if (nChannels == 2) {
|
||||||
maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1));
|
maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1));
|
||||||
minSfb = min(minSfb, startSfb[1]);
|
minSfb = min(minSfb, startSfb[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
sfb = maxSfb;
|
sfb = maxSfb;
|
||||||
enIdx = 0;
|
enIdx = 0;
|
||||||
done = 0;
|
done = 0;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
|
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
|
|
||||||
if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) {
|
if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) {
|
||||||
/* sfb energy below border ? */
|
/* sfb energy below border ? */
|
||||||
|
|
||||||
if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){
|
if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){
|
||||||
/* allow hole */
|
/* allow hole */
|
||||||
ahFlag[ch][sfb] = NO_AH;
|
ahFlag[ch][sfb] = NO_AH;
|
||||||
psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]);
|
psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]);
|
||||||
actPe = actPe - peData->peChannelData[ch].sfbPe[sfb];
|
actPe = actPe - peData->peChannelData[ch].sfbPe[sfb];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actPe < desiredPe) {
|
if (actPe < desiredPe) {
|
||||||
done = 1;
|
done = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sfb = sfb - 1;
|
sfb = sfb - 1;
|
||||||
|
|
||||||
if (sfb < minSfb) {
|
if (sfb < minSfb) {
|
||||||
/* restart with next energy border */
|
/* restart with next energy border */
|
||||||
sfb = maxSfb;
|
sfb = maxSfb;
|
||||||
enIdx = enIdx + 1;
|
enIdx = enIdx + 1;
|
||||||
|
|
||||||
if (enIdx - 4 >= 0)
|
if (enIdx - 4 >= 0)
|
||||||
done = 1;
|
done = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -748,13 +748,13 @@ static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
|
|
||||||
initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam);
|
initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam);
|
||||||
|
|
||||||
noRedPe = peData->pe;
|
noRedPe = peData->pe;
|
||||||
constPart = peData->constPart;
|
constPart = peData->constPart;
|
||||||
nActiveLines = peData->nActiveLines;
|
nActiveLines = peData->nActiveLines;
|
||||||
|
|
||||||
/* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */
|
/* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */
|
||||||
avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2));
|
avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2));
|
||||||
|
|
||||||
/* r1 = 2^((a-per)/4*b) - t^0.25 */
|
/* r1 = 2^((a-per)/4*b) - t^0.25 */
|
||||||
redVal = pow2_xy((constPart - desiredPe), (nActiveLines << 2)) - avgThrExp;
|
redVal = pow2_xy((constPart - desiredPe), (nActiveLines << 2)) - avgThrExp;
|
||||||
|
|
||||||
@@ -763,40 +763,40 @@ static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
|
|
||||||
/* pe after first guess */
|
/* pe after first guess */
|
||||||
calcSfbPe(peData, psyOutChannel, nChannels);
|
calcSfbPe(peData, psyOutChannel, nChannels);
|
||||||
redPe = peData->pe;
|
redPe = peData->pe;
|
||||||
|
|
||||||
iter = 0;
|
iter = 0;
|
||||||
do {
|
do {
|
||||||
/* pe for bands where avoid hole is inactive */
|
/* pe for bands where avoid hole is inactive */
|
||||||
calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
|
calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
|
||||||
peData, peData->ahFlag, psyOutChannel, nChannels);
|
peData, peData->ahFlag, psyOutChannel, nChannels);
|
||||||
|
|
||||||
desiredPeNoAH = desiredPe -(redPe - redPeNoAH);
|
desiredPeNoAH = desiredPe -(redPe - redPeNoAH);
|
||||||
|
|
||||||
if (desiredPeNoAH < 0) {
|
if (desiredPeNoAH < 0) {
|
||||||
desiredPeNoAH = 0;
|
desiredPeNoAH = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* second guess */
|
/* second guess */
|
||||||
|
|
||||||
if (nActiveLinesNoAH > 0) {
|
if (nActiveLinesNoAH > 0) {
|
||||||
|
|
||||||
avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2));
|
avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2));
|
||||||
|
|
||||||
redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp;
|
redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp;
|
||||||
|
|
||||||
/* reduce thresholds */
|
/* reduce thresholds */
|
||||||
reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
|
reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
calcSfbPe(peData, psyOutChannel, nChannels);
|
calcSfbPe(peData, psyOutChannel, nChannels);
|
||||||
redPe = peData->pe;
|
redPe = peData->pe;
|
||||||
|
|
||||||
iter = iter+1;
|
iter = iter+1;
|
||||||
|
|
||||||
} while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2));
|
} while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2));
|
||||||
|
|
||||||
|
|
||||||
if ((100 * redPe < 115 * desiredPe)) {
|
if ((100 * redPe < 115 * desiredPe)) {
|
||||||
correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal,
|
correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal,
|
||||||
nChannels, desiredPe - redPe);
|
nChannels, desiredPe - redPe);
|
||||||
@@ -863,7 +863,7 @@ static Word16 calcBitSpend(Word16 fillLevel,
|
|||||||
if(clipHigh-clipLow)
|
if(clipHigh-clipLow)
|
||||||
bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
|
bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
|
||||||
(clipHigh-clipLow)));
|
(clipHigh-clipLow)));
|
||||||
|
|
||||||
return (bitspend);
|
return (bitspend);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -884,19 +884,19 @@ static void adjustPeMinMax(const Word16 currPe,
|
|||||||
Word16 minFacHi, maxFacHi, minFacLo, maxFacLo;
|
Word16 minFacHi, maxFacHi, minFacLo, maxFacLo;
|
||||||
Word16 diff;
|
Word16 diff;
|
||||||
Word16 minDiff = extract_l(currPe / 6);
|
Word16 minDiff = extract_l(currPe / 6);
|
||||||
minFacHi = 30;
|
minFacHi = 30;
|
||||||
maxFacHi = 100;
|
maxFacHi = 100;
|
||||||
minFacLo = 14;
|
minFacLo = 14;
|
||||||
maxFacLo = 7;
|
maxFacLo = 7;
|
||||||
|
|
||||||
diff = currPe - *peMax ;
|
diff = currPe - *peMax ;
|
||||||
|
|
||||||
if (diff > 0) {
|
if (diff > 0) {
|
||||||
*peMin = *peMin + ((diff * minFacHi) / 100);
|
*peMin = *peMin + ((diff * minFacHi) / 100);
|
||||||
*peMax = *peMax + ((diff * maxFacHi) / 100);
|
*peMax = *peMax + ((diff * maxFacHi) / 100);
|
||||||
} else {
|
} else {
|
||||||
diff = *peMin - currPe;
|
diff = *peMin - currPe;
|
||||||
|
|
||||||
if (diff > 0) {
|
if (diff > 0) {
|
||||||
*peMin = *peMin - ((diff * minFacLo) / 100);
|
*peMin = *peMin - ((diff * minFacLo) / 100);
|
||||||
*peMax = *peMax - ((diff * maxFacLo) / 100);
|
*peMax = *peMax - ((diff * maxFacLo) / 100);
|
||||||
@@ -906,7 +906,7 @@ static void adjustPeMinMax(const Word16 currPe,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((*peMax - *peMin) < minDiff) {
|
if ((*peMax - *peMin) < minDiff) {
|
||||||
Word16 partLo, partHi;
|
Word16 partLo, partHi;
|
||||||
|
|
||||||
@@ -969,7 +969,7 @@ static Word16 bitresCalcBitFac( const Word16 bitresBits,
|
|||||||
(adjThrChan->peMax - adjThrChan->peMin));
|
(adjThrChan->peMax - adjThrChan->peMin));
|
||||||
else
|
else
|
||||||
bitresFac = 0x7fff;
|
bitresFac = 0x7fff;
|
||||||
|
|
||||||
bitresFac = min(bitresFac,
|
bitresFac = min(bitresFac,
|
||||||
(100-30 + extract_l((100 * bitresBits) / avgBits)));
|
(100-30 + extract_l((100 * bitresBits) / avgBits)));
|
||||||
|
|
||||||
@@ -995,23 +995,23 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
|||||||
|
|
||||||
/* common for all elements: */
|
/* common for all elements: */
|
||||||
/* parameters for bitres control */
|
/* parameters for bitres control */
|
||||||
hAdjThr->bresParamLong.clipSaveLow = 20;
|
hAdjThr->bresParamLong.clipSaveLow = 20;
|
||||||
hAdjThr->bresParamLong.clipSaveHigh = 95;
|
hAdjThr->bresParamLong.clipSaveHigh = 95;
|
||||||
hAdjThr->bresParamLong.minBitSave = -5;
|
hAdjThr->bresParamLong.minBitSave = -5;
|
||||||
hAdjThr->bresParamLong.maxBitSave = 30;
|
hAdjThr->bresParamLong.maxBitSave = 30;
|
||||||
hAdjThr->bresParamLong.clipSpendLow = 20;
|
hAdjThr->bresParamLong.clipSpendLow = 20;
|
||||||
hAdjThr->bresParamLong.clipSpendHigh = 95;
|
hAdjThr->bresParamLong.clipSpendHigh = 95;
|
||||||
hAdjThr->bresParamLong.minBitSpend = -10;
|
hAdjThr->bresParamLong.minBitSpend = -10;
|
||||||
hAdjThr->bresParamLong.maxBitSpend = 40;
|
hAdjThr->bresParamLong.maxBitSpend = 40;
|
||||||
|
|
||||||
hAdjThr->bresParamShort.clipSaveLow = 20;
|
hAdjThr->bresParamShort.clipSaveLow = 20;
|
||||||
hAdjThr->bresParamShort.clipSaveHigh = 75;
|
hAdjThr->bresParamShort.clipSaveHigh = 75;
|
||||||
hAdjThr->bresParamShort.minBitSave = 0;
|
hAdjThr->bresParamShort.minBitSave = 0;
|
||||||
hAdjThr->bresParamShort.maxBitSave = 20;
|
hAdjThr->bresParamShort.maxBitSave = 20;
|
||||||
hAdjThr->bresParamShort.clipSpendLow = 20;
|
hAdjThr->bresParamShort.clipSpendLow = 20;
|
||||||
hAdjThr->bresParamShort.clipSpendHigh = 75;
|
hAdjThr->bresParamShort.clipSpendHigh = 75;
|
||||||
hAdjThr->bresParamShort.minBitSpend = -5;
|
hAdjThr->bresParamShort.minBitSpend = -5;
|
||||||
hAdjThr->bresParamShort.maxBitSpend = 50;
|
hAdjThr->bresParamShort.maxBitSpend = 50;
|
||||||
|
|
||||||
/* specific for each element: */
|
/* specific for each element: */
|
||||||
|
|
||||||
@@ -1020,7 +1020,7 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
|||||||
atsElem->peMax = extract_l(((120*meanPe) / 100));
|
atsElem->peMax = extract_l(((120*meanPe) / 100));
|
||||||
|
|
||||||
/* additional pe offset to correct pe2bits for low bitrates */
|
/* additional pe offset to correct pe2bits for low bitrates */
|
||||||
atsElem->peOffset = 0;
|
atsElem->peOffset = 0;
|
||||||
if (chBitrate < 32000) {
|
if (chBitrate < 32000) {
|
||||||
atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000)));
|
atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000)));
|
||||||
}
|
}
|
||||||
@@ -1039,24 +1039,24 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
|||||||
|
|
||||||
/* minSnr adaptation */
|
/* minSnr adaptation */
|
||||||
/* maximum reduction of minSnr goes down to minSnr^maxRed */
|
/* maximum reduction of minSnr goes down to minSnr^maxRed */
|
||||||
msaParam->maxRed = 0x20000000; /* *0.25f /
|
msaParam->maxRed = 0x20000000; /* *0.25f /
|
||||||
/* start adaptation of minSnr for avgEn/sfbEn > startRatio */
|
/* start adaptation of minSnr for avgEn/sfbEn > startRatio */
|
||||||
msaParam->startRatio = 0x0ccccccd; /* 10 */
|
msaParam->startRatio = 0x0ccccccd; /* 10 */
|
||||||
/* maximum minSnr reduction to minSnr^maxRed is reached for
|
/* maximum minSnr reduction to minSnr^maxRed is reached for
|
||||||
avgEn/sfbEn >= maxRatio */
|
avgEn/sfbEn >= maxRatio */
|
||||||
msaParam->maxRatio = 0x0020c49c; /* 1000 */
|
msaParam->maxRatio = 0x0020c49c; /* 1000 */
|
||||||
/* helper variables to interpolate minSnr reduction for
|
/* helper variables to interpolate minSnr reduction for
|
||||||
avgEn/sfbEn between startRatio and maxRatio */
|
avgEn/sfbEn between startRatio and maxRatio */
|
||||||
|
|
||||||
msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */
|
msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */
|
||||||
|
|
||||||
|
msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */
|
||||||
|
|
||||||
msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */
|
|
||||||
|
|
||||||
|
|
||||||
/* pe correction */
|
/* pe correction */
|
||||||
atsElem->peLast = 0;
|
atsElem->peLast = 0;
|
||||||
atsElem->dynBitsLast = 0;
|
atsElem->dynBitsLast = 0;
|
||||||
atsElem->peCorrectionFactor = 100; /* 1.0 */
|
atsElem->peCorrectionFactor = 100; /* 1.0 */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,20 +1069,20 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void calcPeCorrection(Word16 *correctionFac,
|
static void calcPeCorrection(Word16 *correctionFac,
|
||||||
const Word16 peAct,
|
const Word16 peAct,
|
||||||
const Word16 peLast,
|
const Word16 peLast,
|
||||||
const Word16 bitsLast)
|
const Word16 bitsLast)
|
||||||
{
|
{
|
||||||
Word32 peAct100 = 100 * peAct;
|
Word32 peAct100 = 100 * peAct;
|
||||||
Word32 peLast100 = 100 * peLast;
|
Word32 peLast100 = 100 * peLast;
|
||||||
Word16 peBitsLast = bits2pe(bitsLast);
|
Word16 peBitsLast = bits2pe(bitsLast);
|
||||||
|
|
||||||
if ((bitsLast > 0) &&
|
if ((bitsLast > 0) &&
|
||||||
(peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) &&
|
(peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) &&
|
||||||
((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100))
|
((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100))
|
||||||
{
|
{
|
||||||
Word16 newFac = (100 * peLast) / peBitsLast;
|
Word16 newFac = (100 * peLast) / peBitsLast;
|
||||||
/* dead zone */
|
/* dead zone */
|
||||||
|
|
||||||
if (newFac < 100) {
|
if (newFac < 100) {
|
||||||
newFac = min(((110 * newFac) / 100), 100);
|
newFac = min(((110 * newFac) / 100), 100);
|
||||||
newFac = max(newFac, 85);
|
newFac = max(newFac, 85);
|
||||||
@@ -1091,13 +1091,13 @@ static void calcPeCorrection(Word16 *correctionFac,
|
|||||||
newFac = max(((90 * newFac) / 100), 100);
|
newFac = max(((90 * newFac) / 100), 100);
|
||||||
newFac = min(newFac, 115);
|
newFac = min(newFac, 115);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((newFac > 100 && *correctionFac < 100) ||
|
if ((newFac > 100 && *correctionFac < 100) ||
|
||||||
(newFac < 100 && *correctionFac > 100)) {
|
(newFac < 100 && *correctionFac > 100)) {
|
||||||
*correctionFac = 100;
|
*correctionFac = 100;
|
||||||
}
|
}
|
||||||
/* faster adaptation towards 1.0, slower in the other direction */
|
/* faster adaptation towards 1.0, slower in the other direction */
|
||||||
|
|
||||||
if ((*correctionFac < 100 && newFac < *correctionFac) ||
|
if ((*correctionFac < 100 && newFac < *correctionFac) ||
|
||||||
(*correctionFac > 100 && newFac > *correctionFac))
|
(*correctionFac > 100 && newFac > *correctionFac))
|
||||||
*correctionFac = (85 * *correctionFac + 15 * newFac) / 100;
|
*correctionFac = (85 * *correctionFac + 15 * newFac) / 100;
|
||||||
@@ -1107,7 +1107,7 @@ static void calcPeCorrection(Word16 *correctionFac,
|
|||||||
*correctionFac = max(*correctionFac, 85);
|
*correctionFac = max(*correctionFac, 85);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*correctionFac = 100;
|
*correctionFac = 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1123,40 +1123,40 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
|||||||
PSY_OUT_ELEMENT *psyOutElement,
|
PSY_OUT_ELEMENT *psyOutElement,
|
||||||
Word16 *chBitDistribution,
|
Word16 *chBitDistribution,
|
||||||
Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
|
Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||||
Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
|
Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||||
QC_OUT_ELEMENT *qcOE,
|
QC_OUT_ELEMENT *qcOE,
|
||||||
ELEMENT_BITS *elBits,
|
ELEMENT_BITS *elBits,
|
||||||
const Word16 nChannels,
|
const Word16 nChannels,
|
||||||
const Word16 maxBitFac)
|
const Word16 maxBitFac)
|
||||||
{
|
{
|
||||||
PE_DATA peData;
|
PE_DATA peData;
|
||||||
Word16 noRedPe, grantedPe, grantedPeCorr;
|
Word16 noRedPe, grantedPe, grantedPeCorr;
|
||||||
Word16 curWindowSequence;
|
Word16 curWindowSequence;
|
||||||
Word16 bitFactor;
|
Word16 bitFactor;
|
||||||
Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed));
|
Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed));
|
||||||
Word16 bitresBits = elBits->bitResLevel;
|
Word16 bitresBits = elBits->bitResLevel;
|
||||||
Word16 maxBitresBits = elBits->maxBits;
|
Word16 maxBitresBits = elBits->maxBits;
|
||||||
Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed);
|
Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed);
|
||||||
Word16 ch;
|
Word16 ch;
|
||||||
|
|
||||||
prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset);
|
prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset);
|
||||||
|
|
||||||
/* pe without reduction */
|
/* pe without reduction */
|
||||||
calcSfbPe(&peData, psyOutChannel, nChannels);
|
calcSfbPe(&peData, psyOutChannel, nChannels);
|
||||||
noRedPe = peData.pe;
|
noRedPe = peData.pe;
|
||||||
|
|
||||||
|
|
||||||
curWindowSequence = LONG_WINDOW;
|
curWindowSequence = LONG_WINDOW;
|
||||||
|
|
||||||
if (nChannels == 2) {
|
if (nChannels == 2) {
|
||||||
|
|
||||||
if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) ||
|
if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) ||
|
||||||
(psyOutChannel[1].windowSequence == SHORT_WINDOW)) {
|
(psyOutChannel[1].windowSequence == SHORT_WINDOW)) {
|
||||||
curWindowSequence = SHORT_WINDOW;
|
curWindowSequence = SHORT_WINDOW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
curWindowSequence = psyOutChannel[0].windowSequence;
|
curWindowSequence = psyOutChannel[0].windowSequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1170,13 +1170,13 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
|||||||
grantedPe = ((bitFactor * bits2pe(avgBits)) / 100);
|
grantedPe = ((bitFactor * bits2pe(avgBits)) / 100);
|
||||||
|
|
||||||
/* correction of pe value */
|
/* correction of pe value */
|
||||||
calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
|
calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
|
||||||
min(grantedPe, noRedPe),
|
min(grantedPe, noRedPe),
|
||||||
AdjThrStateElement->peLast,
|
AdjThrStateElement->peLast,
|
||||||
AdjThrStateElement->dynBitsLast);
|
AdjThrStateElement->dynBitsLast);
|
||||||
grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100;
|
grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100;
|
||||||
|
|
||||||
|
|
||||||
if (grantedPeCorr < noRedPe && noRedPe > peData.offset) {
|
if (grantedPeCorr < noRedPe && noRedPe > peData.offset) {
|
||||||
/* calc threshold necessary for desired pe */
|
/* calc threshold necessary for desired pe */
|
||||||
adaptThresholdsToPe(psyOutChannel,
|
adaptThresholdsToPe(psyOutChannel,
|
||||||
@@ -1192,8 +1192,8 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
|||||||
/* calculate relative distribution */
|
/* calculate relative distribution */
|
||||||
for (ch=0; ch<nChannels; ch++) {
|
for (ch=0; ch<nChannels; ch++) {
|
||||||
Word16 peOffsDiff = peData.pe - peData.offset;
|
Word16 peOffsDiff = peData.pe - peData.offset;
|
||||||
chBitDistribution[ch] = 200;
|
chBitDistribution[ch] = 200;
|
||||||
|
|
||||||
if (peOffsDiff > 0) {
|
if (peOffsDiff > 0) {
|
||||||
Word32 temp = 1000 - (nChannels * 200);
|
Word32 temp = 1000 - (nChannels * 200);
|
||||||
chBitDistribution[ch] = chBitDistribution[ch] +
|
chBitDistribution[ch] = chBitDistribution[ch] +
|
||||||
@@ -1202,10 +1202,10 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* store pe */
|
/* store pe */
|
||||||
qcOE->pe = noRedPe;
|
qcOE->pe = noRedPe;
|
||||||
|
|
||||||
/* update last pe */
|
/* update last pe */
|
||||||
AdjThrStateElement->peLast = grantedPe;
|
AdjThrStateElement->peLast = grantedPe;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
@@ -1217,7 +1217,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
|||||||
void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
|
void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
|
||||||
const Word16 dynBitsUsed)
|
const Word16 dynBitsUsed)
|
||||||
{
|
{
|
||||||
AdjThrStateElement->dynBitsLast = dynBitsUsed;
|
AdjThrStateElement->dynBitsLast = dynBitsUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,34 +22,34 @@
|
|||||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global AutoCorrelation
|
.global AutoCorrelation
|
||||||
|
|
||||||
AutoCorrelation:
|
AutoCorrelation:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
sub r13, r13, #20
|
sub r13, r13, #20
|
||||||
|
|
||||||
mov r5, r0
|
mov r5, r0
|
||||||
mov r7, r1
|
mov r7, r1
|
||||||
mov r9, r3
|
mov r9, r3
|
||||||
mov r2, r2, lsl #16
|
mov r2, r2, lsl #16
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mov r4, r2, asr #16
|
mov r4, r2, asr #16
|
||||||
mov r8, #0
|
mov r8, #0
|
||||||
cmp r4, #0
|
cmp r4, #0
|
||||||
ble L136
|
ble L136
|
||||||
|
|
||||||
cmp r4, #8
|
|
||||||
mov r2, #0
|
|
||||||
blt L133
|
|
||||||
|
|
||||||
sub r12, r4, #8
|
cmp r4, #8
|
||||||
L132:
|
mov r2, #0
|
||||||
ldr r6, [r5, r2]
|
blt L133
|
||||||
|
|
||||||
|
sub r12, r4, #8
|
||||||
|
L132:
|
||||||
|
ldr r6, [r5, r2]
|
||||||
add r2, r2, #4
|
add r2, r2, #4
|
||||||
smulbb r3, r6, r6
|
smulbb r3, r6, r6
|
||||||
ldr r1, [r5, r2]
|
ldr r1, [r5, r2]
|
||||||
smultt r10, r6, r6
|
smultt r10, r6, r6
|
||||||
mov r3, r3, asr #9
|
mov r3, r3, asr #9
|
||||||
smulbb r6, r1, r1
|
smulbb r6, r1, r1
|
||||||
@@ -72,95 +72,95 @@ L132:
|
|||||||
add r8, r8, #6
|
add r8, r8, #6
|
||||||
|
|
||||||
qadd r0, r0, r6
|
qadd r0, r0, r6
|
||||||
cmp r8, r12
|
cmp r8, r12
|
||||||
blt L132
|
blt L132
|
||||||
L133:
|
L133:
|
||||||
ldrsh r6, [r5, r2]
|
ldrsh r6, [r5, r2]
|
||||||
mul r10, r6, r6
|
mul r10, r6, r6
|
||||||
add r2, r2, #2
|
add r2, r2, #2
|
||||||
mov r1, r10, asr #9
|
mov r1, r10, asr #9
|
||||||
qadd r0, r0, r1
|
qadd r0, r0, r1
|
||||||
L134:
|
L134:
|
||||||
add r8, r8, #1
|
add r8, r8, #1
|
||||||
cmp r8, r4
|
cmp r8, r4
|
||||||
blt L133
|
blt L133
|
||||||
L135:
|
L135:
|
||||||
L136:
|
L136:
|
||||||
str r0, [r7, #0]
|
str r0, [r7, #0]
|
||||||
cmp r0, #0
|
cmp r0, #0
|
||||||
beq L1320
|
beq L1320
|
||||||
L137:
|
L137:
|
||||||
mov r2, r9, lsl #16
|
mov r2, r9, lsl #16
|
||||||
mov r8, #1
|
mov r8, #1
|
||||||
mov r2, r2, asr #16
|
mov r2, r2, asr #16
|
||||||
cmp r2, #1
|
cmp r2, #1
|
||||||
ble L1319
|
ble L1319
|
||||||
L138:
|
L138:
|
||||||
L139:
|
L139:
|
||||||
sub r4, r4, #1
|
sub r4, r4, #1
|
||||||
mov r14, #0
|
mov r14, #0
|
||||||
mov r3, #0
|
mov r3, #0
|
||||||
cmp r4, #0
|
cmp r4, #0
|
||||||
ble L1317
|
ble L1317
|
||||||
L1310:
|
L1310:
|
||||||
cmp r4, #6
|
cmp r4, #6
|
||||||
addlt r6, r5, r8, lsl #1
|
addlt r6, r5, r8, lsl #1
|
||||||
blt L1314
|
blt L1314
|
||||||
L1311:
|
L1311:
|
||||||
add r6, r5, r8, lsl #1
|
add r6, r5, r8, lsl #1
|
||||||
sub r12, r4, #6
|
sub r12, r4, #6
|
||||||
str r8, [r13, #8]
|
str r8, [r13, #8]
|
||||||
str r7, [r13, #4]
|
str r7, [r13, #4]
|
||||||
L1312:
|
L1312:
|
||||||
mov r1, r3, lsl #1
|
mov r1, r3, lsl #1
|
||||||
ldrsh r7, [r6, r1]
|
ldrsh r7, [r6, r1]
|
||||||
ldrsh r10, [r5, r1]
|
ldrsh r10, [r5, r1]
|
||||||
add r8, r1, r6
|
add r8, r1, r6
|
||||||
add r9, r5, r1
|
add r9, r5, r1
|
||||||
mul r7, r10, r7
|
mul r7, r10, r7
|
||||||
ldrsh r1, [r8, #2]
|
ldrsh r1, [r8, #2]
|
||||||
ldrsh r10, [r8, #4]
|
ldrsh r10, [r8, #4]
|
||||||
add r7, r14, r7, asr #9
|
add r7, r14, r7, asr #9
|
||||||
ldrsh r0, [r9, #2]
|
ldrsh r0, [r9, #2]
|
||||||
ldrsh r11, [r9, #4]
|
ldrsh r11, [r9, #4]
|
||||||
mul r1, r0, r1
|
mul r1, r0, r1
|
||||||
ldrsh r14, [r8, #6]
|
ldrsh r14, [r8, #6]
|
||||||
mul r10, r11, r10
|
mul r10, r11, r10
|
||||||
add r7, r7, r1, asr #9
|
add r7, r7, r1, asr #9
|
||||||
ldrsh r8, [r8, #8]
|
ldrsh r8, [r8, #8]
|
||||||
add r3, r3, #5
|
add r3, r3, #5
|
||||||
ldrsh r11, [r9, #6]
|
ldrsh r11, [r9, #6]
|
||||||
ldrsh r1, [r9, #8]
|
ldrsh r1, [r9, #8]
|
||||||
mul r14, r11, r14
|
mul r14, r11, r14
|
||||||
add r7, r7, r10, asr #9
|
add r7, r7, r10, asr #9
|
||||||
mul r1, r1, r8
|
mul r1, r1, r8
|
||||||
add r14, r7, r14, asr #9
|
add r14, r7, r14, asr #9
|
||||||
cmp r3, r12
|
cmp r3, r12
|
||||||
add r14, r14, r1, asr #9
|
add r14, r14, r1, asr #9
|
||||||
ble L1312
|
ble L1312
|
||||||
L1313:
|
L1313:
|
||||||
ldr r8, [r13, #8]
|
ldr r8, [r13, #8]
|
||||||
ldr r7, [r13, #4]
|
ldr r7, [r13, #4]
|
||||||
L1314:
|
L1314:
|
||||||
L1315:
|
L1315:
|
||||||
mov r12, r3, lsl #1
|
mov r12, r3, lsl #1
|
||||||
ldrsh r9, [r6, r12]
|
ldrsh r9, [r6, r12]
|
||||||
ldrsh r12, [r5, r12]
|
ldrsh r12, [r5, r12]
|
||||||
add r3, r3, #1
|
add r3, r3, #1
|
||||||
cmp r3, r4
|
cmp r3, r4
|
||||||
mul r12, r12, r9
|
mul r12, r12, r9
|
||||||
add r14, r14, r12, asr #9
|
add r14, r14, r12, asr #9
|
||||||
blt L1315
|
blt L1315
|
||||||
L1316:
|
L1316:
|
||||||
L1317:
|
L1317:
|
||||||
str r14, [r7, +r8, lsl #2]
|
str r14, [r7, +r8, lsl #2]
|
||||||
add r8, r8, #1
|
add r8, r8, #1
|
||||||
cmp r8, r2
|
cmp r8, r2
|
||||||
blt L139
|
blt L139
|
||||||
|
|
||||||
L1319:
|
L1319:
|
||||||
L1320:
|
L1320:
|
||||||
add r13, r13, #20
|
add r13, r13, #20
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
@ENDP @ |AutoCorrelation|
|
@ENDP @ |AutoCorrelation|
|
||||||
|
|||||||
@@ -22,91 +22,91 @@
|
|||||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
|
|
||||||
.global CalcWindowEnergy
|
.global CalcWindowEnergy
|
||||||
|
|
||||||
CalcWindowEnergy:
|
CalcWindowEnergy:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
sub r13, r13, #20
|
sub r13, r13, #20
|
||||||
|
|
||||||
mov r3, r3, lsl #16
|
mov r3, r3, lsl #16
|
||||||
ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0];
|
ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0];
|
||||||
mov r3, r3, asr #16
|
mov r3, r3, asr #16
|
||||||
ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1];
|
ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1];
|
||||||
|
|
||||||
mov r2, r2, lsl #16
|
mov r2, r2, lsl #16
|
||||||
ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
|
ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
|
||||||
mov r2, r2, asr #16
|
mov r2, r2, asr #16
|
||||||
ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1];
|
ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1];
|
||||||
|
|
||||||
mov r8, #0 @ w=0
|
mov r8, #0 @ w=0
|
||||||
mov r5, #0 @ wOffset = 0;
|
mov r5, #0 @ wOffset = 0;
|
||||||
|
|
||||||
BLOCK_BEGIN:
|
BLOCK_BEGIN:
|
||||||
mov r6, #0 @ accuUE = 0;
|
mov r6, #0 @ accuUE = 0;
|
||||||
mov r7, #0 @ accuFE = 0;
|
mov r7, #0 @ accuFE = 0;
|
||||||
mov r4, #0 @ i=0
|
mov r4, #0 @ i=0
|
||||||
|
|
||||||
str r8, [r13, #4]
|
str r8, [r13, #4]
|
||||||
str r0, [r13, #8]
|
str r0, [r13, #8]
|
||||||
str r3, [r13, #12]
|
str r3, [r13, #12]
|
||||||
|
|
||||||
ENERGY_BEG:
|
ENERGY_BEG:
|
||||||
mov r9, r5, lsl #1
|
mov r9, r5, lsl #1
|
||||||
ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx];
|
ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx];
|
||||||
|
|
||||||
add r5, r5, r2 @ tidx = tidx + chIncrement;
|
add r5, r5, r2 @ tidx = tidx + chIncrement;
|
||||||
|
|
||||||
smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
|
smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
|
||||||
smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 );
|
smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 );
|
||||||
|
|
||||||
mov r3, r3, lsl #1
|
mov r3, r3, lsl #1
|
||||||
mov r8, r8, lsl #1
|
mov r8, r8, lsl #1
|
||||||
|
|
||||||
sub r0, r3, r10 @ accu3 = accu1 - states0;
|
sub r0, r3, r10 @ accu3 = accu1 - states0;
|
||||||
sub r8, r0, r8 @ out = accu3 - accu2;
|
sub r8, r0, r8 @ out = accu3 - accu2;
|
||||||
|
|
||||||
mov r10, r3 @ states0 = accu1;
|
mov r10, r3 @ states0 = accu1;
|
||||||
mov r11, r8 @ states1 = out;
|
mov r11, r8 @ states1 = out;
|
||||||
|
|
||||||
mul r3, r9, r9
|
mul r3, r9, r9
|
||||||
mov r8, r8, asr #16
|
mov r8, r8, asr #16
|
||||||
|
|
||||||
add r4, r4, #1
|
add r4, r4, #1
|
||||||
add r6, r6, r3, asr #7
|
add r6, r6, r3, asr #7
|
||||||
|
|
||||||
mul r9, r8, r8
|
mul r9, r8, r8
|
||||||
ldr r3, [r13, #12]
|
ldr r3, [r13, #12]
|
||||||
|
|
||||||
add r7, r7, r9, asr #7
|
add r7, r7, r9, asr #7
|
||||||
|
|
||||||
cmp r4, r3
|
cmp r4, r3
|
||||||
blt ENERGY_BEG
|
blt ENERGY_BEG
|
||||||
|
|
||||||
ldr r0, [r13, #8]
|
ldr r0, [r13, #8]
|
||||||
ldr r8, [r13, #4]
|
ldr r8, [r13, #4]
|
||||||
|
|
||||||
ENERGY_END:
|
ENERGY_END:
|
||||||
add r4, r0, r8, lsl #2
|
add r4, r0, r8, lsl #2
|
||||||
|
|
||||||
str r6, [r4, #72]
|
str r6, [r4, #72]
|
||||||
add r8, r8, #1
|
add r8, r8, #1
|
||||||
str r7, [r4, #136]
|
str r7, [r4, #136]
|
||||||
|
|
||||||
cmp r8, #8
|
cmp r8, #8
|
||||||
blt BLOCK_BEGIN
|
blt BLOCK_BEGIN
|
||||||
|
|
||||||
BLOCK_END:
|
BLOCK_END:
|
||||||
str r10, [r0, #168]
|
str r10, [r0, #168]
|
||||||
str r11, [r0, #172]
|
str r11, [r0, #172]
|
||||||
mov r0, #1
|
mov r0, #1
|
||||||
|
|
||||||
add r13, r13, #20
|
add r13, r13, #20
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
hiPassCoeff:
|
hiPassCoeff:
|
||||||
.word 0xbec8b439
|
.word 0xbec8b439
|
||||||
.word 0x609d4952
|
.word 0x609d4952
|
||||||
|
|
||||||
@ENDP
|
@ENDP
|
||||||
.end
|
.end
|
||||||
|
|||||||
@@ -26,46 +26,46 @@
|
|||||||
|
|
||||||
PreMDCT:
|
PreMDCT:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
add r9, r0, r1, lsl #2
|
add r9, r0, r1, lsl #2
|
||||||
sub r3, r9, #8
|
sub r3, r9, #8
|
||||||
|
|
||||||
movs r1, r1, asr #2
|
movs r1, r1, asr #2
|
||||||
beq PreMDCT_END
|
beq PreMDCT_END
|
||||||
|
|
||||||
PreMDCT_LOOP:
|
PreMDCT_LOOP:
|
||||||
ldr r8, [r2], #4
|
ldr r8, [r2], #4
|
||||||
ldr r9, [r2], #4
|
ldr r9, [r2], #4
|
||||||
|
|
||||||
ldrd r4, [r0]
|
ldrd r4, [r0]
|
||||||
ldrd r6, [r3]
|
ldrd r6, [r3]
|
||||||
|
|
||||||
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
|
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
|
||||||
smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa)
|
smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa)
|
||||||
|
|
||||||
smull r14, r8, r7, r9 @ MULHIGH(ti1, sina)
|
smull r14, r8, r7, r9 @ MULHIGH(ti1, sina)
|
||||||
smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
|
smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
|
||||||
|
|
||||||
add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||||
sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
|
sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
|
||||||
|
|
||||||
ldr r8, [r2], #4
|
ldr r8, [r2], #4
|
||||||
ldr r9, [r2], #4
|
ldr r9, [r2], #4
|
||||||
|
|
||||||
smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa)
|
smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa)
|
||||||
smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa)
|
smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa)
|
||||||
|
|
||||||
smull r14, r8, r5, r9 @ MULHIGH(ti2, sina)
|
smull r14, r8, r5, r9 @ MULHIGH(ti2, sina)
|
||||||
smull r5, r10, r6, r9 @ MULHIGH(tr2, sina)
|
smull r5, r10, r6, r9 @ MULHIGH(tr2, sina)
|
||||||
|
|
||||||
add r8, r8, r4
|
add r8, r8, r4
|
||||||
sub r9, r12, r10
|
sub r9, r12, r10
|
||||||
|
|
||||||
mov r6, r11
|
|
||||||
|
|
||||||
strd r6, [r0]
|
mov r6, r11
|
||||||
|
|
||||||
|
strd r6, [r0]
|
||||||
strd r8, [r3]
|
strd r8, [r3]
|
||||||
|
|
||||||
subs r1, r1, #1
|
subs r1, r1, #1
|
||||||
sub r3, r3, #8
|
sub r3, r3, #8
|
||||||
add r0, r0, #8
|
add r0, r0, #8
|
||||||
@@ -74,52 +74,52 @@ PreMDCT_LOOP:
|
|||||||
PreMDCT_END:
|
PreMDCT_END:
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
@ENDP @ |PreMDCT|
|
@ENDP @ |PreMDCT|
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global PostMDCT
|
.global PostMDCT
|
||||||
|
|
||||||
PostMDCT:
|
PostMDCT:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
add r9, r0, r1, lsl #2
|
add r9, r0, r1, lsl #2
|
||||||
sub r3, r9, #8
|
sub r3, r9, #8
|
||||||
|
|
||||||
movs r1, r1, asr #2
|
movs r1, r1, asr #2
|
||||||
beq PostMDCT_END
|
beq PostMDCT_END
|
||||||
|
|
||||||
PostMDCT_LOOP:
|
PostMDCT_LOOP:
|
||||||
ldr r8, [r2], #4
|
ldr r8, [r2], #4
|
||||||
ldr r9, [r2], #4
|
ldr r9, [r2], #4
|
||||||
|
|
||||||
ldrd r4, [r0]
|
ldrd r4, [r0]
|
||||||
ldrd r6, [r3]
|
ldrd r6, [r3]
|
||||||
|
|
||||||
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
|
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
|
||||||
smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa)
|
smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa)
|
||||||
|
|
||||||
smull r14, r8, r5, r9 @ MULHIGH(ti1, sina)
|
smull r14, r8, r5, r9 @ MULHIGH(ti1, sina)
|
||||||
smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
|
smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
|
||||||
|
|
||||||
add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||||
sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
|
sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
|
||||||
|
|
||||||
ldr r8, [r2], #4 @
|
ldr r8, [r2], #4 @
|
||||||
ldr r9, [r2], #4
|
ldr r9, [r2], #4
|
||||||
|
|
||||||
smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa)
|
smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa)
|
||||||
smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa)
|
smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa)
|
||||||
|
|
||||||
smull r14, r8, r7, r9 @ MULHIGH(ti2, sina)
|
smull r14, r8, r7, r9 @ MULHIGH(ti2, sina)
|
||||||
smull r7, r10, r6, r9 @ MULHIGH(tr2, sina)
|
smull r7, r10, r6, r9 @ MULHIGH(tr2, sina)
|
||||||
|
|
||||||
add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
|
add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
|
||||||
sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
|
sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
|
||||||
|
|
||||||
mov r7, r11
|
mov r7, r11
|
||||||
|
|
||||||
strd r4, [r0]
|
strd r4, [r0]
|
||||||
strd r6, [r3]
|
strd r6, [r3]
|
||||||
|
|
||||||
subs r1, r1, #1
|
subs r1, r1, #1
|
||||||
sub r3, r3, #8
|
sub r3, r3, #8
|
||||||
add r0, r0, #8
|
add r0, r0, #8
|
||||||
|
|||||||
@@ -26,46 +26,46 @@
|
|||||||
|
|
||||||
Radix4First:
|
Radix4First:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
movs r10, r1
|
movs r10, r1
|
||||||
mov r11, r0
|
mov r11, r0
|
||||||
beq Radix4First_END
|
beq Radix4First_END
|
||||||
|
|
||||||
Radix4First_LOOP:
|
Radix4First_LOOP:
|
||||||
ldrd r0, [r11]
|
ldrd r0, [r11]
|
||||||
ldrd r2, [r11, #8]
|
ldrd r2, [r11, #8]
|
||||||
ldrd r4, [r11, #16]
|
ldrd r4, [r11, #16]
|
||||||
ldrd r6, [r11, #24]
|
ldrd r6, [r11, #24]
|
||||||
|
|
||||||
add r8, r0, r2
|
add r8, r0, r2
|
||||||
add r9, r1, r3
|
add r9, r1, r3
|
||||||
|
|
||||||
sub r0, r0, r2
|
sub r0, r0, r2
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
|
|
||||||
add r2, r4, r6
|
add r2, r4, r6
|
||||||
add r3, r5, r7
|
add r3, r5, r7
|
||||||
|
|
||||||
sub r4, r4, r6
|
sub r4, r4, r6
|
||||||
sub r5, r5, r7
|
sub r5, r5, r7
|
||||||
|
|
||||||
add r6, r8, r2
|
add r6, r8, r2
|
||||||
add r7, r9, r3
|
add r7, r9, r3
|
||||||
|
|
||||||
sub r8, r8, r2
|
sub r8, r8, r2
|
||||||
sub r9, r9, r3
|
sub r9, r9, r3
|
||||||
|
|
||||||
add r2, r0, r5
|
add r2, r0, r5
|
||||||
sub r3, r1, r4
|
sub r3, r1, r4
|
||||||
|
|
||||||
sub r0, r0, r5
|
sub r0, r0, r5
|
||||||
add r1, r1, r4
|
add r1, r1, r4
|
||||||
|
|
||||||
strd r6, [r11]
|
strd r6, [r11]
|
||||||
strd r2, [r11, #8]
|
strd r2, [r11, #8]
|
||||||
strd r8, [r11, #16]
|
strd r8, [r11, #16]
|
||||||
strd r0, [r11, #24]
|
strd r0, [r11, #24]
|
||||||
|
|
||||||
subs r10, r10, #1
|
subs r10, r10, #1
|
||||||
add r11, r11, #32
|
add r11, r11, #32
|
||||||
bne Radix4First_LOOP
|
bne Radix4First_LOOP
|
||||||
@@ -73,180 +73,180 @@ Radix4First_LOOP:
|
|||||||
Radix4First_END:
|
Radix4First_END:
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
@ENDP @ |Radix4First|
|
@ENDP @ |Radix4First|
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Radix8First
|
.global Radix8First
|
||||||
|
|
||||||
Radix8First:
|
Radix8First:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
sub sp, sp, #0x24
|
sub sp, sp, #0x24
|
||||||
|
|
||||||
mov r12, r1
|
mov r12, r1
|
||||||
mov r14, r0
|
mov r14, r0
|
||||||
cmp r12, #0
|
cmp r12, #0
|
||||||
beq Radix8First_END
|
beq Radix8First_END
|
||||||
|
|
||||||
Radix8First_LOOP:
|
Radix8First_LOOP:
|
||||||
ldrd r0, [r14]
|
ldrd r0, [r14]
|
||||||
ldrd r2, [r14, #8]
|
ldrd r2, [r14, #8]
|
||||||
ldrd r4, [r14, #16]
|
ldrd r4, [r14, #16]
|
||||||
ldrd r6, [r14, #24]
|
ldrd r6, [r14, #24]
|
||||||
|
|
||||||
add r8, r0, r2 @ r0 = buf[0] + buf[2]@
|
add r8, r0, r2 @ r0 = buf[0] + buf[2]@
|
||||||
add r9, r1, r3 @ i0 = buf[1] + buf[3]@
|
add r9, r1, r3 @ i0 = buf[1] + buf[3]@
|
||||||
|
|
||||||
sub r0, r0, r2 @ r1 = buf[0] - buf[2]@
|
sub r0, r0, r2 @ r1 = buf[0] - buf[2]@
|
||||||
sub r1, r1, r3 @ i1 = buf[1] - buf[3]@
|
sub r1, r1, r3 @ i1 = buf[1] - buf[3]@
|
||||||
|
|
||||||
add r2, r4, r6 @ r2 = buf[4] + buf[6]@
|
add r2, r4, r6 @ r2 = buf[4] + buf[6]@
|
||||||
add r3, r5, r7 @ i2 = buf[5] + buf[7]@
|
add r3, r5, r7 @ i2 = buf[5] + buf[7]@
|
||||||
|
|
||||||
sub r4, r4, r6 @ r3 = buf[4] - buf[6]@
|
sub r4, r4, r6 @ r3 = buf[4] - buf[6]@
|
||||||
sub r5, r5, r7 @ i3 = buf[5] - buf[7]@
|
sub r5, r5, r7 @ i3 = buf[5] - buf[7]@
|
||||||
|
|
||||||
add r6, r8, r2 @ r4 = (r0 + r2) >> 1@
|
add r6, r8, r2 @ r4 = (r0 + r2) >> 1@
|
||||||
add r7, r9, r3 @ i4 = (i0 + i2) >> 1@
|
add r7, r9, r3 @ i4 = (i0 + i2) >> 1@
|
||||||
|
|
||||||
sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@
|
sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@
|
||||||
sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@
|
sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@
|
||||||
|
|
||||||
sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@
|
sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@
|
||||||
add r3, r1, r4 @ i6 = (i1 + r3) >> 1@
|
add r3, r1, r4 @ i6 = (i1 + r3) >> 1@
|
||||||
|
|
||||||
add r0, r0, r5 @ r7 = (r1 + i3) >> 1@
|
add r0, r0, r5 @ r7 = (r1 + i3) >> 1@
|
||||||
sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@
|
sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@
|
||||||
|
|
||||||
mov r6, r6, asr #1 @
|
mov r6, r6, asr #1 @
|
||||||
mov r7, r7, asr #1 @
|
mov r7, r7, asr #1 @
|
||||||
|
|
||||||
mov r8, r8, asr #1
|
mov r8, r8, asr #1
|
||||||
mov r9, r9, asr #1
|
mov r9, r9, asr #1
|
||||||
|
|
||||||
mov r2, r2, asr #1
|
mov r2, r2, asr #1
|
||||||
mov r3, r3, asr #1
|
mov r3, r3, asr #1
|
||||||
|
|
||||||
mov r0, r0, asr #1
|
mov r0, r0, asr #1
|
||||||
mov r1, r1, asr #1
|
mov r1, r1, asr #1
|
||||||
|
|
||||||
str r6, [sp]
|
str r6, [sp]
|
||||||
str r7, [sp, #4]
|
str r7, [sp, #4]
|
||||||
|
|
||||||
str r8, [sp, #8]
|
str r8, [sp, #8]
|
||||||
str r9, [sp, #12]
|
str r9, [sp, #12]
|
||||||
|
|
||||||
str r2, [sp, #16]
|
str r2, [sp, #16]
|
||||||
str r3, [sp, #20]
|
str r3, [sp, #20]
|
||||||
|
|
||||||
str r0, [sp, #24]
|
str r0, [sp, #24]
|
||||||
str r1, [sp, #28]
|
str r1, [sp, #28]
|
||||||
|
|
||||||
ldrd r2, [r14, #32]
|
ldrd r2, [r14, #32]
|
||||||
ldrd r4, [r14, #40]
|
ldrd r4, [r14, #40]
|
||||||
ldrd r6, [r14, #48]
|
ldrd r6, [r14, #48]
|
||||||
ldrd r8, [r14, #56]
|
ldrd r8, [r14, #56]
|
||||||
|
|
||||||
add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@
|
add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@
|
||||||
add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@
|
add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@
|
||||||
|
|
||||||
sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@
|
sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@
|
||||||
sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@
|
sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@
|
||||||
|
|
||||||
add r4, r6, r8 @ r2 = buf[12] + buf[14]@
|
add r4, r6, r8 @ r2 = buf[12] + buf[14]@
|
||||||
add r5, r7, r9 @ i2 = buf[13] + buf[15]@
|
add r5, r7, r9 @ i2 = buf[13] + buf[15]@
|
||||||
|
|
||||||
sub r6, r6, r8 @ r3 = buf[12] - buf[14]@
|
sub r6, r6, r8 @ r3 = buf[12] - buf[14]@
|
||||||
sub r7, r7, r9 @ i3 = buf[13] - buf[15]@
|
sub r7, r7, r9 @ i3 = buf[13] - buf[15]@
|
||||||
|
|
||||||
add r8, r0, r4 @ t0 = (r0 + r2)
|
add r8, r0, r4 @ t0 = (r0 + r2)
|
||||||
add r9, r1, r5 @ t1 = (i0 + i2)
|
add r9, r1, r5 @ t1 = (i0 + i2)
|
||||||
|
|
||||||
sub r0, r0, r4 @ t2 = (r0 - r2)
|
sub r0, r0, r4 @ t2 = (r0 - r2)
|
||||||
sub r1, r1, r5 @ t3 = (i0 - i2)
|
sub r1, r1, r5 @ t3 = (i0 - i2)
|
||||||
|
|
||||||
mov r8, r8, asr #1
|
mov r8, r8, asr #1
|
||||||
ldr r4, [sp]
|
ldr r4, [sp]
|
||||||
|
|
||||||
mov r9, r9, asr #1
|
mov r9, r9, asr #1
|
||||||
ldr r5, [sp, #4]
|
ldr r5, [sp, #4]
|
||||||
|
|
||||||
mov r0, r0, asr #1
|
mov r0, r0, asr #1
|
||||||
mov r1, r1, asr #1
|
mov r1, r1, asr #1
|
||||||
|
|
||||||
add r10, r4, r8 @ buf[ 0] = r4 + t0@
|
add r10, r4, r8 @ buf[ 0] = r4 + t0@
|
||||||
add r11, r5, r9 @ buf[ 1] = i4 + t1@
|
add r11, r5, r9 @ buf[ 1] = i4 + t1@
|
||||||
|
|
||||||
sub r4, r4, r8 @ buf[ 8] = r4 - t0@
|
sub r4, r4, r8 @ buf[ 8] = r4 - t0@
|
||||||
sub r5, r5, r9 @ buf[ 9] = i4 - t1@
|
sub r5, r5, r9 @ buf[ 9] = i4 - t1@
|
||||||
|
|
||||||
strd r10, [r14]
|
strd r10, [r14]
|
||||||
strd r4, [r14, #32]
|
strd r4, [r14, #32]
|
||||||
|
|
||||||
ldr r10, [sp, #8]
|
ldr r10, [sp, #8]
|
||||||
ldr r11, [sp, #12]
|
ldr r11, [sp, #12]
|
||||||
|
|
||||||
add r4, r10, r1 @ buf[ 4] = r5 + t3@
|
add r4, r10, r1 @ buf[ 4] = r5 + t3@
|
||||||
sub r5, r11, r0 @ buf[ 5] = i5 - t2@
|
sub r5, r11, r0 @ buf[ 5] = i5 - t2@
|
||||||
|
|
||||||
sub r10, r10, r1 @ buf[12] = r5 - t3@
|
sub r10, r10, r1 @ buf[12] = r5 - t3@
|
||||||
add r11, r11, r0 @ buf[13] = i5 + t2@
|
add r11, r11, r0 @ buf[13] = i5 + t2@
|
||||||
|
|
||||||
strd r4, [r14, #16]
|
strd r4, [r14, #16]
|
||||||
strd r10, [r14, #48]
|
strd r10, [r14, #48]
|
||||||
|
|
||||||
sub r0, r2, r7 @ r0 = r1 - i3@
|
sub r0, r2, r7 @ r0 = r1 - i3@
|
||||||
add r1, r3, r6 @ i0 = i1 + r3@
|
add r1, r3, r6 @ i0 = i1 + r3@
|
||||||
|
|
||||||
ldr r11, DATATab
|
ldr r11, DATATab
|
||||||
|
|
||||||
add r2, r2, r7 @ r2 = r1 + i3@
|
add r2, r2, r7 @ r2 = r1 + i3@
|
||||||
sub r3, r3, r6 @ i2 = i1 - r3@
|
sub r3, r3, r6 @ i2 = i1 - r3@
|
||||||
|
|
||||||
sub r4, r0, r1 @ r0 - i0
|
sub r4, r0, r1 @ r0 - i0
|
||||||
add r5, r0, r1 @ r0 + i0
|
add r5, r0, r1 @ r0 + i0
|
||||||
|
|
||||||
sub r0, r2, r3 @ r2 - i2
|
sub r0, r2, r3 @ r2 - i2
|
||||||
add r1, r2, r3 @ r2 + i2
|
add r1, r2, r3 @ r2 + i2
|
||||||
|
|
||||||
smull r8, r6, r4, r11
|
smull r8, r6, r4, r11
|
||||||
smull r9, r7, r5, r11
|
smull r9, r7, r5, r11
|
||||||
|
|
||||||
ldr r2, [sp, #16]
|
ldr r2, [sp, #16]
|
||||||
ldr r3, [sp, #20]
|
ldr r3, [sp, #20]
|
||||||
|
|
||||||
smull r8, r4, r0, r11
|
smull r8, r4, r0, r11
|
||||||
smull r9, r5, r1, r11
|
smull r9, r5, r1, r11
|
||||||
|
|
||||||
ldr r10, [sp, #24]
|
ldr r10, [sp, #24]
|
||||||
ldr r11, [sp, #28]
|
ldr r11, [sp, #28]
|
||||||
|
|
||||||
sub r8, r2, r6
|
sub r8, r2, r6
|
||||||
sub r9, r3, r7
|
sub r9, r3, r7
|
||||||
|
|
||||||
add r2, r2, r6
|
add r2, r2, r6
|
||||||
add r3, r3, r7
|
add r3, r3, r7
|
||||||
|
|
||||||
add r6, r10, r5
|
add r6, r10, r5
|
||||||
sub r7, r11, r4
|
sub r7, r11, r4
|
||||||
|
|
||||||
sub r0, r10, r5
|
sub r0, r10, r5
|
||||||
add r1, r11, r4
|
add r1, r11, r4
|
||||||
|
|
||||||
strd r6, [r14, #8]
|
strd r6, [r14, #8]
|
||||||
strd r8, [r14, #24]
|
strd r8, [r14, #24]
|
||||||
strd r0, [r14, #40]
|
strd r0, [r14, #40]
|
||||||
strd r2, [r14, #56]
|
strd r2, [r14, #56]
|
||||||
|
|
||||||
subs r12, r12, #1
|
subs r12, r12, #1
|
||||||
add r14, r14, #64
|
add r14, r14, #64
|
||||||
|
|
||||||
bne Radix8First_LOOP
|
bne Radix8First_LOOP
|
||||||
|
|
||||||
Radix8First_END:
|
Radix8First_END:
|
||||||
add sp, sp, #0x24
|
add sp, sp, #0x24
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
DATATab:
|
DATATab:
|
||||||
.word 0x5a82799a
|
.word 0x5a82799a
|
||||||
|
|
||||||
@ENDP @ |Radix8First|
|
@ENDP @ |Radix8First|
|
||||||
.end
|
.end
|
||||||
@@ -25,145 +25,145 @@
|
|||||||
|
|
||||||
Radix4FFT:
|
Radix4FFT:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
sub sp, sp, #32
|
sub sp, sp, #32
|
||||||
|
|
||||||
mov r1, r1, asr #2
|
mov r1, r1, asr #2
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq Radix4FFT_END
|
beq Radix4FFT_END
|
||||||
|
|
||||||
Radix4FFT_LOOP1:
|
Radix4FFT_LOOP1:
|
||||||
mov r14, r0 @ xptr = buf@
|
mov r14, r0 @ xptr = buf@
|
||||||
mov r10, r1 @ i = num@
|
mov r10, r1 @ i = num@
|
||||||
mov r9, r2, lsl #3 @ step = 2*bgn@
|
mov r9, r2, lsl #3 @ step = 2*bgn@
|
||||||
cmp r10, #0
|
cmp r10, #0
|
||||||
str r0, [sp]
|
str r0, [sp]
|
||||||
str r1, [sp, #4]
|
str r1, [sp, #4]
|
||||||
str r2, [sp, #8]
|
str r2, [sp, #8]
|
||||||
str r3, [sp, #12]
|
str r3, [sp, #12]
|
||||||
beq Radix4FFT_LOOP1_END
|
beq Radix4FFT_LOOP1_END
|
||||||
|
|
||||||
Radix4FFT_LOOP2:
|
Radix4FFT_LOOP2:
|
||||||
mov r12, r3 @ csptr = twidTab@
|
mov r12, r3 @ csptr = twidTab@
|
||||||
mov r11, r2 @ j = bgn
|
mov r11, r2 @ j = bgn
|
||||||
cmp r11, #0
|
cmp r11, #0
|
||||||
str r10, [sp, #16]
|
str r10, [sp, #16]
|
||||||
beq Radix4FFT_LOOP2_END
|
beq Radix4FFT_LOOP2_END
|
||||||
|
|
||||||
Radix4FFT_LOOP3:
|
Radix4FFT_LOOP3:
|
||||||
str r11, [sp, #20]
|
str r11, [sp, #20]
|
||||||
|
|
||||||
ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@
|
ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@
|
||||||
add r14, r14, r9 @ xptr += step@
|
add r14, r14, r9 @ xptr += step@
|
||||||
|
|
||||||
ldrd r10, [r14, #0] @ r2 = xptr[0]@ r3 = xptr[1]@
|
ldrd r10, [r14, #0] @ r2 = xptr[0]@ r3 = xptr[1]@
|
||||||
ldr r8, [r12], #4 @ cosxsinx = csptr[0]@
|
ldr r8, [r12], #4 @ cosxsinx = csptr[0]@
|
||||||
|
|
||||||
smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0)
|
smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0)
|
||||||
smulwt r3, r11, r8 @ L_mpy_wx(cosx, t1)
|
smulwt r3, r11, r8 @ L_mpy_wx(cosx, t1)
|
||||||
|
|
||||||
smlawb r2, r11, r8, r4 @ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
|
smlawb r2, r11, r8, r4 @ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
|
||||||
smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0)
|
smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0)
|
||||||
|
|
||||||
mov r10, r0, asr #2 @ t0 = r0 >> 2@
|
mov r10, r0, asr #2 @ t0 = r0 >> 2@
|
||||||
mov r11, r1, asr #2 @ t1 = r1 >> 2@
|
mov r11, r1, asr #2 @ t1 = r1 >> 2@
|
||||||
|
|
||||||
sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
||||||
add r14, r14, r9 @ xptr += step@
|
add r14, r14, r9 @ xptr += step@
|
||||||
|
|
||||||
sub r0, r10, r2 @ r0 = t0 - r2@
|
sub r0, r10, r2 @ r0 = t0 - r2@
|
||||||
sub r1, r11, r3 @ r1 = t1 - r3@
|
sub r1, r11, r3 @ r1 = t1 - r3@
|
||||||
|
|
||||||
add r2, r10, r2 @ r2 = t0 + r2@
|
add r2, r10, r2 @ r2 = t0 + r2@
|
||||||
add r3, r11, r3 @ r3 = t1 + r3@
|
add r3, r11, r3 @ r3 = t1 + r3@
|
||||||
|
|
||||||
str r2, [sp, #24]
|
str r2, [sp, #24]
|
||||||
str r3, [sp, #28]
|
str r3, [sp, #28]
|
||||||
|
|
||||||
ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@
|
ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@
|
||||||
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
|
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
|
||||||
|
|
||||||
smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0)
|
smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0)
|
||||||
smulwt r5, r11, r8 @ L_mpy_wx(cosx, t1)
|
smulwt r5, r11, r8 @ L_mpy_wx(cosx, t1)
|
||||||
|
|
||||||
smlawb r4, r11, r8, r6 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
|
smlawb r4, r11, r8, r6 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
|
||||||
smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0)
|
smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0)
|
||||||
|
|
||||||
add r14, r14, r9 @ xptr += step@
|
add r14, r14, r9 @ xptr += step@
|
||||||
sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
||||||
|
|
||||||
ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@
|
ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@
|
||||||
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
|
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
|
||||||
|
|
||||||
smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0)
|
smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0)
|
||||||
smulwt r7, r11, r8 @ L_mpy_wx(cosx, t1)
|
smulwt r7, r11, r8 @ L_mpy_wx(cosx, t1)
|
||||||
|
|
||||||
smlawb r6, r11, r8, r2 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
|
smlawb r6, r11, r8, r2 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
|
||||||
smulwb r3, r10, r8 @ L_mpy_wx(sinx, t0)
|
smulwb r3, r10, r8 @ L_mpy_wx(sinx, t0)
|
||||||
|
|
||||||
mov r10, r4 @ t0 = r4@
|
|
||||||
mov r11, r5 @ t1 = r5@
|
|
||||||
|
|
||||||
sub r7, r7, r3 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
|
||||||
|
|
||||||
|
|
||||||
add r4, r10, r6 @ r4 = t0 + r6@
|
mov r10, r4 @ t0 = r4@
|
||||||
|
mov r11, r5 @ t1 = r5@
|
||||||
|
|
||||||
|
sub r7, r7, r3 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
||||||
|
|
||||||
|
|
||||||
|
add r4, r10, r6 @ r4 = t0 + r6@
|
||||||
sub r5, r7, r11 @ r5 = r7 - t1@
|
sub r5, r7, r11 @ r5 = r7 - t1@
|
||||||
|
|
||||||
sub r6, r10, r6 @ r6 = t0 - r6@
|
sub r6, r10, r6 @ r6 = t0 - r6@
|
||||||
add r7, r7, r11 @ r7 = r7 + t1@
|
add r7, r7, r11 @ r7 = r7 + t1@
|
||||||
|
|
||||||
ldr r2, [sp, #24]
|
ldr r2, [sp, #24]
|
||||||
ldr r3, [sp, #28]
|
ldr r3, [sp, #28]
|
||||||
|
|
||||||
add r10, r0, r5 @ xptr[0] = r0 + r5@
|
add r10, r0, r5 @ xptr[0] = r0 + r5@
|
||||||
add r11, r1, r6 @ xptr[0] = r1 + r6
|
add r11, r1, r6 @ xptr[0] = r1 + r6
|
||||||
|
|
||||||
strd r10, [r14]
|
strd r10, [r14]
|
||||||
sub r14, r14, r9 @ xptr -= step@
|
sub r14, r14, r9 @ xptr -= step@
|
||||||
|
|
||||||
sub r10, r2, r4 @ xptr[0] = r2 - r4@
|
sub r10, r2, r4 @ xptr[0] = r2 - r4@
|
||||||
sub r11, r3, r7 @ xptr[1] = r3 - r7@
|
sub r11, r3, r7 @ xptr[1] = r3 - r7@
|
||||||
|
|
||||||
strd r10, [r14]
|
strd r10, [r14]
|
||||||
sub r14, r14, r9 @ xptr -= step@
|
sub r14, r14, r9 @ xptr -= step@
|
||||||
|
|
||||||
sub r10, r0, r5 @ xptr[0] = r0 - r5@
|
sub r10, r0, r5 @ xptr[0] = r0 - r5@
|
||||||
sub r11, r1, r6 @ xptr[0] = r1 - r6
|
sub r11, r1, r6 @ xptr[0] = r1 - r6
|
||||||
|
|
||||||
strd r10, [r14]
|
strd r10, [r14]
|
||||||
sub r14, r14, r9 @ xptr -= step@
|
sub r14, r14, r9 @ xptr -= step@
|
||||||
|
|
||||||
add r10, r2, r4 @ xptr[0] = r2 - r4@
|
add r10, r2, r4 @ xptr[0] = r2 - r4@
|
||||||
add r11, r3, r7 @ xptr[1] = r3 - r7@
|
add r11, r3, r7 @ xptr[1] = r3 - r7@
|
||||||
|
|
||||||
strd r10, [r14]
|
strd r10, [r14]
|
||||||
add r14, r14, #8 @ xptr += 2@
|
add r14, r14, #8 @ xptr += 2@
|
||||||
|
|
||||||
ldr r11, [sp, #20]
|
ldr r11, [sp, #20]
|
||||||
subs r11, r11, #1
|
subs r11, r11, #1
|
||||||
bne Radix4FFT_LOOP3
|
bne Radix4FFT_LOOP3
|
||||||
|
|
||||||
Radix4FFT_LOOP2_END:
|
Radix4FFT_LOOP2_END:
|
||||||
ldr r10, [sp, #16]
|
ldr r10, [sp, #16]
|
||||||
ldr r3, [sp, #12]
|
ldr r3, [sp, #12]
|
||||||
ldr r2, [sp, #8]
|
ldr r2, [sp, #8]
|
||||||
rsb r8, r9, r9, lsl #2
|
rsb r8, r9, r9, lsl #2
|
||||||
sub r10, r10, #1
|
sub r10, r10, #1
|
||||||
add r14, r14, r8
|
add r14, r14, r8
|
||||||
cmp r10, #0
|
cmp r10, #0
|
||||||
bhi Radix4FFT_LOOP2
|
bhi Radix4FFT_LOOP2
|
||||||
|
|
||||||
Radix4FFT_LOOP1_END:
|
Radix4FFT_LOOP1_END:
|
||||||
ldr r0, [sp]
|
ldr r0, [sp]
|
||||||
ldr r1, [sp, #4]
|
ldr r1, [sp, #4]
|
||||||
add r3, r3, r8, asr #1
|
add r3, r3, r8, asr #1
|
||||||
mov r2, r2, lsl #2
|
mov r2, r2, lsl #2
|
||||||
movs r1, r1, asr #2
|
movs r1, r1, asr #2
|
||||||
bne Radix4FFT_LOOP1
|
bne Radix4FFT_LOOP1
|
||||||
|
|
||||||
Radix4FFT_END:
|
Radix4FFT_END:
|
||||||
add sp, sp, #32
|
add sp, sp, #32
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
@ENDP @ |Radix4FFT|
|
@ENDP @ |Radix4FFT|
|
||||||
.end
|
.end
|
||||||
@@ -26,31 +26,31 @@
|
|||||||
.global CalcBandEnergy
|
.global CalcBandEnergy
|
||||||
|
|
||||||
CalcBandEnergy:
|
CalcBandEnergy:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
mov r2, r2, lsl #16
|
mov r2, r2, lsl #16
|
||||||
ldr r12, [r13, #36]
|
ldr r12, [r13, #36]
|
||||||
mov r9, #0
|
mov r9, #0
|
||||||
mov r5, r2, asr #16
|
mov r5, r2, asr #16
|
||||||
mov r4, #0
|
mov r4, #0
|
||||||
cmp r5, #0
|
cmp r5, #0
|
||||||
ble L212
|
ble L212
|
||||||
|
|
||||||
L22:
|
L22:
|
||||||
mov r2, r4, lsl #1
|
mov r2, r4, lsl #1
|
||||||
ldrsh r10, [r1, r2]
|
ldrsh r10, [r1, r2]
|
||||||
add r11, r1, r2
|
add r11, r1, r2
|
||||||
ldrsh r2, [r11, #2]
|
ldrsh r2, [r11, #2]
|
||||||
mov r14, #0
|
mov r14, #0
|
||||||
cmp r10, r2
|
cmp r10, r2
|
||||||
bge L28
|
bge L28
|
||||||
|
|
||||||
L23:
|
L23:
|
||||||
ldr r11, [r0, +r10, lsl #2]
|
ldr r11, [r0, +r10, lsl #2]
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
ldr r6, [r0, +r10, lsl #2]
|
ldr r6, [r0, +r10, lsl #2]
|
||||||
smull r11, r7, r11, r11
|
smull r11, r7, r11, r11
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
smull r6, r8, r6, r6
|
smull r6, r8, r6, r6
|
||||||
ldr r11, [r0, +r10, lsl #2]
|
ldr r11, [r0, +r10, lsl #2]
|
||||||
qadd r14, r14, r7
|
qadd r14, r14, r7
|
||||||
@@ -59,71 +59,71 @@ L23:
|
|||||||
ldr r6, [r0, +r10, lsl #2]
|
ldr r6, [r0, +r10, lsl #2]
|
||||||
qadd r14, r14, r8
|
qadd r14, r14, r8
|
||||||
smull r6, r8, r6, r6
|
smull r6, r8, r6, r6
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
qadd r14, r14, r7
|
qadd r14, r14, r7
|
||||||
cmp r10, r2
|
cmp r10, r2
|
||||||
qadd r14, r14, r8
|
qadd r14, r14, r8
|
||||||
blt L23
|
blt L23
|
||||||
|
|
||||||
L28:
|
L28:
|
||||||
qadd r14, r14, r14
|
qadd r14, r14, r14
|
||||||
str r14, [r3, +r4, lsl #2]
|
str r14, [r3, +r4, lsl #2]
|
||||||
add r4, r4, #1
|
add r4, r4, #1
|
||||||
qadd r9, r9, r14
|
qadd r9, r9, r14
|
||||||
cmp r4, r5
|
cmp r4, r5
|
||||||
|
|
||||||
blt L22
|
blt L22
|
||||||
|
|
||||||
L212:
|
L212:
|
||||||
str r9, [r12, #0]
|
str r9, [r12, #0]
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
@ENDP ; |CalcBandEnergy|
|
@ENDP ; |CalcBandEnergy|
|
||||||
|
|
||||||
.global CalcBandEnergyMS
|
.global CalcBandEnergyMS
|
||||||
|
|
||||||
CalcBandEnergyMS:
|
CalcBandEnergyMS:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
sub r13, r13, #24
|
sub r13, r13, #24
|
||||||
|
|
||||||
mov r12, #0
|
mov r12, #0
|
||||||
mov r3, r3, lsl #16
|
mov r3, r3, lsl #16
|
||||||
mov r14, #0
|
mov r14, #0
|
||||||
mov r3, r3, asr #16
|
mov r3, r3, asr #16
|
||||||
cmp r3, #0
|
cmp r3, #0
|
||||||
mov r4, #0
|
mov r4, #0
|
||||||
ble L315
|
ble L315
|
||||||
|
|
||||||
L32:
|
L32:
|
||||||
mov r5, r4, lsl #1
|
mov r5, r4, lsl #1
|
||||||
mov r6, #0
|
mov r6, #0
|
||||||
ldrsh r10, [r2, r5]
|
ldrsh r10, [r2, r5]
|
||||||
add r5, r2, r5
|
add r5, r2, r5
|
||||||
mov r7, #0
|
mov r7, #0
|
||||||
ldrsh r11, [r5, #2]
|
ldrsh r11, [r5, #2]
|
||||||
cmp r10, r11
|
cmp r10, r11
|
||||||
bge L39
|
bge L39
|
||||||
|
|
||||||
str r3, [r13, #4]
|
str r3, [r13, #4]
|
||||||
str r4, [r13, #8]
|
str r4, [r13, #8]
|
||||||
str r12, [r13, #12]
|
str r12, [r13, #12]
|
||||||
str r14, [r13, #16]
|
str r14, [r13, #16]
|
||||||
|
|
||||||
L33:
|
L33:
|
||||||
ldr r8, [r0, +r10, lsl #2]
|
ldr r8, [r0, +r10, lsl #2]
|
||||||
ldr r9, [r1, +r10, lsl #2]
|
ldr r9, [r1, +r10, lsl #2]
|
||||||
mov r8, r8, asr #1
|
mov r8, r8, asr #1
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
mov r9, r9, asr #1
|
mov r9, r9, asr #1
|
||||||
|
|
||||||
ldr r12, [r0, +r10, lsl #2]
|
ldr r12, [r0, +r10, lsl #2]
|
||||||
add r5, r8, r9
|
add r5, r8, r9
|
||||||
ldr r14, [r1, +r10, lsl #2]
|
ldr r14, [r1, +r10, lsl #2]
|
||||||
sub r8, r8, r9
|
sub r8, r8, r9
|
||||||
|
|
||||||
smull r5, r3, r5, r5
|
smull r5, r3, r5, r5
|
||||||
mov r12, r12, asr #1
|
mov r12, r12, asr #1
|
||||||
smull r8, r4, r8, r8
|
smull r8, r4, r8, r8
|
||||||
mov r14, r14, asr #1
|
mov r14, r14, asr #1
|
||||||
|
|
||||||
qadd r6, r6, r3
|
qadd r6, r6, r3
|
||||||
@@ -131,27 +131,27 @@ L33:
|
|||||||
qadd r7, r7, r4
|
qadd r7, r7, r4
|
||||||
sub r8, r12, r14
|
sub r8, r12, r14
|
||||||
|
|
||||||
smull r5, r3, r5, r5
|
smull r5, r3, r5, r5
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
smull r8, r4, r8, r8
|
smull r8, r4, r8, r8
|
||||||
|
|
||||||
qadd r6, r6, r3
|
qadd r6, r6, r3
|
||||||
qadd r7, r7, r4
|
qadd r7, r7, r4
|
||||||
|
|
||||||
ldr r8, [r0, +r10, lsl #2]
|
ldr r8, [r0, +r10, lsl #2]
|
||||||
ldr r9, [r1, +r10, lsl #2]
|
ldr r9, [r1, +r10, lsl #2]
|
||||||
mov r8, r8, asr #1
|
mov r8, r8, asr #1
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
mov r9, r9, asr #1
|
mov r9, r9, asr #1
|
||||||
|
|
||||||
ldr r12, [r0, +r10, lsl #2]
|
ldr r12, [r0, +r10, lsl #2]
|
||||||
add r5, r8, r9
|
add r5, r8, r9
|
||||||
ldr r14, [r1, +r10, lsl #2]
|
ldr r14, [r1, +r10, lsl #2]
|
||||||
sub r8, r8, r9
|
sub r8, r8, r9
|
||||||
|
|
||||||
smull r5, r3, r5, r5
|
smull r5, r3, r5, r5
|
||||||
mov r12, r12, asr #1
|
mov r12, r12, asr #1
|
||||||
smull r8, r4, r8, r8
|
smull r8, r4, r8, r8
|
||||||
mov r14, r14, asr #1
|
mov r14, r14, asr #1
|
||||||
|
|
||||||
qadd r6, r6, r3
|
qadd r6, r6, r3
|
||||||
@@ -159,37 +159,37 @@ L33:
|
|||||||
qadd r7, r7, r4
|
qadd r7, r7, r4
|
||||||
sub r8, r12, r14
|
sub r8, r12, r14
|
||||||
|
|
||||||
smull r5, r3, r5, r5
|
smull r5, r3, r5, r5
|
||||||
add r10, r10, #1
|
add r10, r10, #1
|
||||||
smull r8, r4, r8, r8
|
smull r8, r4, r8, r8
|
||||||
|
|
||||||
qadd r6, r6, r3
|
qadd r6, r6, r3
|
||||||
qadd r7, r7, r4
|
qadd r7, r7, r4
|
||||||
|
|
||||||
cmp r10, r11
|
cmp r10, r11
|
||||||
|
|
||||||
blt L33
|
blt L33
|
||||||
|
|
||||||
ldr r3, [r13, #4]
|
ldr r3, [r13, #4]
|
||||||
ldr r4, [r13, #8]
|
ldr r4, [r13, #8]
|
||||||
ldr r12, [r13, #12]
|
ldr r12, [r13, #12]
|
||||||
ldr r14, [r13, #16]
|
ldr r14, [r13, #16]
|
||||||
L39:
|
L39:
|
||||||
qadd r6, r6, r6
|
qadd r6, r6, r6
|
||||||
qadd r7, r7, r7
|
qadd r7, r7, r7
|
||||||
|
|
||||||
ldr r8, [r13, #60]
|
ldr r8, [r13, #60]
|
||||||
ldr r9, [r13, #68]
|
ldr r9, [r13, #68]
|
||||||
|
|
||||||
qadd r12, r12, r6
|
qadd r12, r12, r6
|
||||||
qadd r14, r14, r7
|
qadd r14, r14, r7
|
||||||
|
|
||||||
str r6, [r8, +r4, lsl #2]
|
str r6, [r8, +r4, lsl #2]
|
||||||
str r7, [r9, +r4, lsl #2]
|
str r7, [r9, +r4, lsl #2]
|
||||||
|
|
||||||
add r4, r4, #1
|
add r4, r4, #1
|
||||||
cmp r4, r3
|
cmp r4, r3
|
||||||
blt L32
|
blt L32
|
||||||
|
|
||||||
L315:
|
L315:
|
||||||
ldr r8, [r13, #64]
|
ldr r8, [r13, #64]
|
||||||
|
|||||||
@@ -26,53 +26,53 @@
|
|||||||
|
|
||||||
PreMDCT:
|
PreMDCT:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
add r9, r0, r1, lsl #2
|
add r9, r0, r1, lsl #2
|
||||||
sub r3, r9, #32
|
sub r3, r9, #32
|
||||||
|
|
||||||
movs r1, r1, asr #2
|
movs r1, r1, asr #2
|
||||||
beq PreMDCT_END
|
beq PreMDCT_END
|
||||||
|
|
||||||
PreMDCT_LOOP:
|
PreMDCT_LOOP:
|
||||||
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
|
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
|
||||||
VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
|
VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
|
||||||
VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@
|
VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@
|
||||||
VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
|
VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
|
||||||
VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
|
VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
|
||||||
|
|
||||||
VREV64.32 Q8, Q7
|
VREV64.32 Q8, Q7
|
||||||
VREV64.32 Q9, Q6
|
VREV64.32 Q9, Q6
|
||||||
|
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
|
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
|
||||||
VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1)
|
VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1)
|
||||||
VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1)
|
VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1)
|
||||||
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
|
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
|
||||||
|
|
||||||
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||||
VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
|
VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
|
||||||
|
|
||||||
VST2.I32 {d0, d1, d2, d3}, [r0]!
|
VST2.I32 {d0, d1, d2, d3}, [r0]!
|
||||||
sub r3, r3, #32
|
sub r3, r3, #32
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2)
|
VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2)
|
||||||
VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2)
|
VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2)
|
||||||
VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2)
|
VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2)
|
||||||
VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2)
|
VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2)
|
||||||
|
|
||||||
VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
|
VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
|
||||||
VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
|
VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
|
||||||
|
|
||||||
VREV64.32 Q3, Q1
|
VREV64.32 Q3, Q1
|
||||||
VREV64.32 Q2, Q0
|
VREV64.32 Q2, Q0
|
||||||
|
|
||||||
VST2.I32 {d5, d7}, [r3]!
|
VST2.I32 {d5, d7}, [r3]!
|
||||||
VST2.I32 {d4, d6}, [r3]!
|
VST2.I32 {d4, d6}, [r3]!
|
||||||
|
|
||||||
subs r1, r1, #4
|
subs r1, r1, #4
|
||||||
sub r3, r3, #64
|
sub r3, r3, #64
|
||||||
bne PreMDCT_LOOP
|
bne PreMDCT_LOOP
|
||||||
|
|
||||||
PreMDCT_END:
|
PreMDCT_END:
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
@ENDP @ |PreMDCT|
|
@ENDP @ |PreMDCT|
|
||||||
@@ -82,50 +82,50 @@ PreMDCT_END:
|
|||||||
|
|
||||||
PostMDCT:
|
PostMDCT:
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
add r9, r0, r1, lsl #2
|
add r9, r0, r1, lsl #2
|
||||||
sub r3, r9, #32
|
sub r3, r9, #32
|
||||||
|
|
||||||
movs r1, r1, asr #2
|
movs r1, r1, asr #2
|
||||||
beq PostMDCT_END
|
beq PostMDCT_END
|
||||||
|
|
||||||
PostMDCT_LOOP:
|
PostMDCT_LOOP:
|
||||||
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
|
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
|
||||||
VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
|
VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
|
||||||
VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@
|
VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@
|
||||||
VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
|
VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
|
||||||
VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
|
VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
|
||||||
|
|
||||||
|
VREV64.32 Q8, Q6
|
||||||
|
VREV64.32 Q9, Q7
|
||||||
|
|
||||||
VREV64.32 Q8, Q6
|
|
||||||
VREV64.32 Q9, Q7
|
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
|
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
|
||||||
VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1)
|
VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1)
|
||||||
VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1)
|
VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1)
|
||||||
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
|
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
|
||||||
|
|
||||||
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||||
VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
|
VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2)
|
VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2)
|
||||||
VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2)
|
VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2)
|
||||||
VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2)
|
VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2)
|
||||||
VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2)
|
VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2)
|
||||||
|
|
||||||
VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
|
VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
|
||||||
VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@
|
VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@
|
||||||
|
|
||||||
VREV64.32 Q2, Q4
|
VREV64.32 Q2, Q4
|
||||||
VREV64.32 Q3, Q5
|
VREV64.32 Q3, Q5
|
||||||
|
|
||||||
sub r3, r3, #32
|
sub r3, r3, #32
|
||||||
VST2.I32 {d0, d1, d2, d3}, [r0]!
|
VST2.I32 {d0, d1, d2, d3}, [r0]!
|
||||||
|
|
||||||
VST2.I32 {d5, d7}, [r3]!
|
VST2.I32 {d5, d7}, [r3]!
|
||||||
VST2.I32 {d4, d6}, [r3]!
|
VST2.I32 {d4, d6}, [r3]!
|
||||||
|
|
||||||
subs r1, r1, #4
|
subs r1, r1, #4
|
||||||
sub r3, r3, #64
|
sub r3, r3, #64
|
||||||
bne PostMDCT_LOOP
|
bne PostMDCT_LOOP
|
||||||
|
|
||||||
PostMDCT_END:
|
PostMDCT_END:
|
||||||
|
|||||||
@@ -29,86 +29,86 @@ Radix8First:
|
|||||||
|
|
||||||
ldr r3, SQRT1_2
|
ldr r3, SQRT1_2
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
|
|
||||||
VDUP.I32 Q15, r3
|
VDUP.I32 Q15, r3
|
||||||
beq Radix8First_END
|
beq Radix8First_END
|
||||||
|
|
||||||
Radix8First_LOOP:
|
Radix8First_LOOP:
|
||||||
VLD1.I32 {d0, d1, d2, d3}, [r0]!
|
VLD1.I32 {d0, d1, d2, d3}, [r0]!
|
||||||
VLD1.I32 {d8, d9, d10, d11}, [r0]!
|
VLD1.I32 {d8, d9, d10, d11}, [r0]!
|
||||||
|
|
||||||
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
|
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
|
||||||
VSUB.S32 d5, d0, d1 @ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@
|
VSUB.S32 d5, d0, d1 @ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@
|
||||||
VSUB.S32 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
|
VSUB.S32 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
|
||||||
VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
|
VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
|
||||||
VREV64.I32 d7, d7
|
VREV64.I32 d7, d7
|
||||||
|
|
||||||
VADD.S32 Q0, Q2, Q3 @ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
|
VADD.S32 Q0, Q2, Q3 @ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
|
||||||
VSUB.S32 Q1, Q2, Q3 @ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
|
VSUB.S32 Q1, Q2, Q3 @ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
|
||||||
|
|
||||||
VREV64.I32 d3, d3
|
VREV64.I32 d3, d3
|
||||||
|
|
||||||
VADD.S32 d4, d8, d9 @ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
|
VADD.S32 d4, d8, d9 @ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
|
||||||
VSUB.S32 d7, d10, d11 @ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@
|
VSUB.S32 d7, d10, d11 @ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@
|
||||||
VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
|
VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
|
||||||
VREV64.I32 d7, d7
|
VREV64.I32 d7, d7
|
||||||
VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
|
VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
|
||||||
|
|
||||||
VTRN.32 d1, d3
|
VTRN.32 d1, d3
|
||||||
|
|
||||||
VADD.S32 Q4, Q2, Q3 @ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
|
VADD.S32 Q4, Q2, Q3 @ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
|
||||||
VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
|
VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
|
||||||
|
|
||||||
VREV64.I32 d3, d3
|
VREV64.I32 d3, d3
|
||||||
|
|
||||||
VSHR.S32 d8, d8, #1
|
VSHR.S32 d8, d8, #1
|
||||||
VSHR.S32 Q0, Q0, #1
|
VSHR.S32 Q0, Q0, #1
|
||||||
VREV64.I32 d10, d10
|
VREV64.I32 d10, d10
|
||||||
VTRN.32 d11, d9
|
VTRN.32 d11, d9
|
||||||
VSHR.S32 Q1, Q1, #1
|
VSHR.S32 Q1, Q1, #1
|
||||||
VSHR.S32 d10, d10, #1
|
VSHR.S32 d10, d10, #1
|
||||||
VREV64.I32 d9, d9
|
VREV64.I32 d9, d9
|
||||||
|
|
||||||
sub r0, r0, #0x40
|
sub r0, r0, #0x40
|
||||||
|
|
||||||
VADD.S32 d12, d0, d8
|
VADD.S32 d12, d0, d8
|
||||||
VSUB.S32 d16, d0, d8
|
VSUB.S32 d16, d0, d8
|
||||||
VADD.S32 d14, d2, d10
|
VADD.S32 d14, d2, d10
|
||||||
VSUB.S32 d18, d2, d10
|
VSUB.S32 d18, d2, d10
|
||||||
|
|
||||||
VSUB.S32 d4, d11, d9
|
VSUB.S32 d4, d11, d9
|
||||||
VADD.S32 d5, d11, d9
|
VADD.S32 d5, d11, d9
|
||||||
|
|
||||||
VREV64.I32 d18, d18
|
VREV64.I32 d18, d18
|
||||||
|
|
||||||
VQDMULH.S32 Q3, Q2, Q15
|
VQDMULH.S32 Q3, Q2, Q15
|
||||||
VTRN.32 d14, d18
|
VTRN.32 d14, d18
|
||||||
VTRN.32 d6, d7
|
VTRN.32 d6, d7
|
||||||
VREV64.I32 d18, d18
|
VREV64.I32 d18, d18
|
||||||
|
|
||||||
VSUB.S32 d15, d3, d6
|
VSUB.S32 d15, d3, d6
|
||||||
VREV64.I32 d7, d7
|
VREV64.I32 d7, d7
|
||||||
VADD.S32 d19, d3, d6
|
VADD.S32 d19, d3, d6
|
||||||
VADD.S32 d13, d1, d7
|
VADD.S32 d13, d1, d7
|
||||||
VSUB.S32 d17, d1, d7
|
VSUB.S32 d17, d1, d7
|
||||||
|
|
||||||
VREV64.I32 d17, d17
|
VREV64.I32 d17, d17
|
||||||
VTRN.32 d13, d17
|
VTRN.32 d13, d17
|
||||||
VREV64.I32 d17, d17
|
VREV64.I32 d17, d17
|
||||||
|
|
||||||
subs r1, r1, #1
|
subs r1, r1, #1
|
||||||
|
|
||||||
VST1.I32 {d12, d13, d14, d15}, [r0]!
|
VST1.I32 {d12, d13, d14, d15}, [r0]!
|
||||||
VST1.I32 {d16, d17, d18, d19}, [r0]!
|
VST1.I32 {d16, d17, d18, d19}, [r0]!
|
||||||
bne Radix8First_LOOP
|
bne Radix8First_LOOP
|
||||||
|
|
||||||
Radix8First_END:
|
Radix8First_END:
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
SQRT1_2:
|
SQRT1_2:
|
||||||
.word 0x2d413ccd
|
.word 0x2d413ccd
|
||||||
|
|
||||||
@ENDP @ |Radix8First|
|
@ENDP @ |Radix8First|
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Radix4First
|
.global Radix4First
|
||||||
|
|
||||||
@@ -117,28 +117,28 @@ Radix4First:
|
|||||||
|
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq Radix4First_END
|
beq Radix4First_END
|
||||||
|
|
||||||
Radix4First_LOOP:
|
Radix4First_LOOP:
|
||||||
VLD1.I32 {d0, d1, d2, d3}, [r0]
|
VLD1.I32 {d0, d1, d2, d3}, [r0]
|
||||||
|
|
||||||
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
|
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
|
||||||
VSUB.S32 d5, d0, d1 @ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
|
VSUB.S32 d5, d0, d1 @ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
|
||||||
VSUB.S32 d7, d2, d3 @ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
|
VSUB.S32 d7, d2, d3 @ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
|
||||||
VADD.S32 d6, d2, d3 @ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
|
VADD.S32 d6, d2, d3 @ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
|
||||||
|
|
||||||
VREV64.I32 d7, d7 @
|
VREV64.I32 d7, d7 @
|
||||||
|
|
||||||
VADD.S32 Q4, Q2, Q3
|
VADD.S32 Q4, Q2, Q3
|
||||||
VSUB.S32 Q5, Q2, Q3
|
VSUB.S32 Q5, Q2, Q3
|
||||||
|
|
||||||
VREV64.I32 d11, d11
|
VREV64.I32 d11, d11
|
||||||
VTRN.32 d9, d11
|
VTRN.32 d9, d11
|
||||||
subs r1, r1, #1
|
subs r1, r1, #1
|
||||||
VREV64.I32 d11, d11
|
VREV64.I32 d11, d11
|
||||||
VST1.I32 {d8, d9, d10, d11}, [r0]!
|
VST1.I32 {d8, d9, d10, d11}, [r0]!
|
||||||
|
|
||||||
bne Radix4First_LOOP
|
bne Radix4First_LOOP
|
||||||
|
|
||||||
Radix4First_END:
|
Radix4First_END:
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
|
|||||||
@@ -28,116 +28,116 @@ Radix4FFT:
|
|||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
mov r1, r1, asr #2
|
mov r1, r1, asr #2
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq Radix4FFT_END
|
beq Radix4FFT_END
|
||||||
|
|
||||||
Radix4FFT_LOOP1:
|
Radix4FFT_LOOP1:
|
||||||
mov r5, r2, lsl #1
|
mov r5, r2, lsl #1
|
||||||
mov r8, r0
|
mov r8, r0
|
||||||
mov r7, r1
|
mov r7, r1
|
||||||
mov r5, r5, lsl #2
|
mov r5, r5, lsl #2
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
rsbeq r12, r5, r5, lsl #2
|
rsbeq r12, r5, r5, lsl #2
|
||||||
beq Radix4FFT_LOOP1_END
|
beq Radix4FFT_LOOP1_END
|
||||||
|
|
||||||
rsb r12, r5, r5, lsl #2
|
rsb r12, r5, r5, lsl #2
|
||||||
|
|
||||||
Radix4FFT_LOOP2:
|
Radix4FFT_LOOP2:
|
||||||
mov r6, r3
|
mov r6, r3
|
||||||
mov r4, r2
|
mov r4, r2
|
||||||
cmp r2, #0
|
cmp r2, #0
|
||||||
beq Radix4FFT_LOOP2_END
|
beq Radix4FFT_LOOP2_END
|
||||||
|
|
||||||
Radix4FFT_LOOP3:
|
Radix4FFT_LOOP3:
|
||||||
@r0 = xptr[0]@
|
@r0 = xptr[0]@
|
||||||
@r1 = xptr[1]@
|
@r1 = xptr[1]@
|
||||||
VLD2.I32 {D0, D1, D2, D3}, [r8]
|
VLD2.I32 {D0, D1, D2, D3}, [r8]
|
||||||
VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@
|
VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@
|
||||||
|
|
||||||
add r8, r8, r5 @ xptr += step@
|
add r8, r8, r5 @ xptr += step@
|
||||||
VLD2.I32 {D4, D5, D6,D7}, [r8] @ r2 = xptr[0]@ r3 = xptr[1]@
|
VLD2.I32 {D4, D5, D6,D7}, [r8] @ r2 = xptr[0]@ r3 = xptr[1]@
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0)
|
VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0)
|
||||||
VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1)
|
VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1)
|
||||||
VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1)
|
VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1)
|
||||||
VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0)
|
VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0)
|
||||||
|
|
||||||
VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
||||||
VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
||||||
|
|
||||||
add r8, r8, r5 @ xptr += step@
|
add r8, r8, r5 @ xptr += step@
|
||||||
VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@
|
VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@
|
||||||
VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@
|
VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@
|
||||||
|
|
||||||
VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@
|
VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@
|
||||||
VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@
|
VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@
|
||||||
VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@
|
VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@
|
||||||
VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@
|
VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@
|
||||||
|
|
||||||
VLD2.I32 {D8, D9, D10, D11}, [r8]
|
VLD2.I32 {D8, D9, D10, D11}, [r8]
|
||||||
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
||||||
add r8, r8, r5
|
add r8, r8, r5
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0)
|
VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0)
|
||||||
VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1)
|
VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1)
|
||||||
VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1)
|
VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1)
|
||||||
VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0)
|
VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0)
|
||||||
|
|
||||||
VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
||||||
VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
||||||
|
|
||||||
VLD2.I32 {D12, D13, D14, D15}, [r8]
|
VLD2.I32 {D12, D13, D14, D15}, [r8]
|
||||||
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
||||||
|
|
||||||
VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0)
|
VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0)
|
||||||
VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1)
|
VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1)
|
||||||
VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1)
|
VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1)
|
||||||
VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0)
|
VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0)
|
||||||
|
|
||||||
VADD.S32 Q6, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
VADD.S32 Q6, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
||||||
VSUB.S32 Q7, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
VSUB.S32 Q7, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
||||||
|
|
||||||
VADD.S32 Q4, Q8, Q6 @ r4 = t0 + r6@
|
VADD.S32 Q4, Q8, Q6 @ r4 = t0 + r6@
|
||||||
VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@
|
VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@
|
||||||
VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@
|
VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@
|
||||||
VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@
|
VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@
|
||||||
|
|
||||||
VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@
|
VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@
|
||||||
VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@
|
VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@
|
||||||
VST2.I32 {D16, D17, D18, D19}, [r8]
|
VST2.I32 {D16, D17, D18, D19}, [r8]
|
||||||
|
|
||||||
VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@
|
VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@
|
||||||
sub r8, r8, r5 @ xptr -= step@
|
sub r8, r8, r5 @ xptr -= step@
|
||||||
VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@
|
VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@
|
||||||
VST2.I32 {D20, D21, D22, D23}, [r8]
|
VST2.I32 {D20, D21, D22, D23}, [r8]
|
||||||
|
|
||||||
VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@
|
VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@
|
||||||
sub r8, r8, r5 @ xptr -= step@
|
sub r8, r8, r5 @ xptr -= step@
|
||||||
VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@
|
VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@
|
||||||
VST2.I32 {D16, D17, D18, D19}, [r8]
|
VST2.I32 {D16, D17, D18, D19}, [r8]
|
||||||
|
|
||||||
VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@
|
VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@
|
||||||
sub r8, r8, r5 @ xptr -= step@
|
sub r8, r8, r5 @ xptr -= step@
|
||||||
VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@
|
VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@
|
||||||
VST2.I32 {D20, D21, D22, D23}, [r8]!
|
VST2.I32 {D20, D21, D22, D23}, [r8]!
|
||||||
|
|
||||||
subs r4, r4, #4
|
subs r4, r4, #4
|
||||||
bne Radix4FFT_LOOP3
|
bne Radix4FFT_LOOP3
|
||||||
|
|
||||||
Radix4FFT_LOOP2_END:
|
Radix4FFT_LOOP2_END:
|
||||||
add r8, r8, r12
|
add r8, r8, r12
|
||||||
sub r7, r7, #1
|
sub r7, r7, #1
|
||||||
cmp r7, #0
|
cmp r7, #0
|
||||||
bhi Radix4FFT_LOOP2
|
bhi Radix4FFT_LOOP2
|
||||||
|
|
||||||
Radix4FFT_LOOP1_END:
|
Radix4FFT_LOOP1_END:
|
||||||
add r3, r12, r3
|
add r3, r12, r3
|
||||||
mov r2, r2, lsl #2
|
mov r2, r2, lsl #2
|
||||||
movs r1, r1, asr #2
|
movs r1, r1, asr #2
|
||||||
bne Radix4FFT_LOOP1
|
bne Radix4FFT_LOOP1
|
||||||
|
|
||||||
Radix4FFT_END:
|
Radix4FFT_END:
|
||||||
ldmia sp!, {r4 - r11, pc}
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
@ENDP @ |Radix4FFT|
|
@ENDP @ |Radix4FFT|
|
||||||
.end
|
.end
|
||||||
@@ -37,18 +37,18 @@ void CalcBandEnergy(const Word32 *mdctSpectrum,
|
|||||||
Word32 *bandEnergySum)
|
Word32 *bandEnergySum)
|
||||||
{
|
{
|
||||||
Word32 i, j;
|
Word32 i, j;
|
||||||
Word32 accuSum = 0;
|
Word32 accuSum = 0;
|
||||||
|
|
||||||
for (i=0; i<numBands; i++) {
|
for (i=0; i<numBands; i++) {
|
||||||
Word32 accu = 0;
|
Word32 accu = 0;
|
||||||
for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
|
for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
|
||||||
accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
|
accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
|
||||||
|
|
||||||
accu = L_add(accu, accu);
|
accu = L_add(accu, accu);
|
||||||
accuSum = L_add(accuSum, accu);
|
accuSum = L_add(accuSum, accu);
|
||||||
bandEnergy[i] = accu;
|
bandEnergy[i] = accu;
|
||||||
}
|
}
|
||||||
*bandEnergySum = accuSum;
|
*bandEnergySum = accuSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
@@ -68,15 +68,15 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
|
|||||||
{
|
{
|
||||||
|
|
||||||
Word32 i, j;
|
Word32 i, j;
|
||||||
Word32 accuMidSum = 0;
|
Word32 accuMidSum = 0;
|
||||||
Word32 accuSideSum = 0;
|
Word32 accuSideSum = 0;
|
||||||
|
|
||||||
|
|
||||||
for(i=0; i<numBands; i++) {
|
for(i=0; i<numBands; i++) {
|
||||||
Word32 accuMid = 0;
|
Word32 accuMid = 0;
|
||||||
Word32 accuSide = 0;
|
Word32 accuSide = 0;
|
||||||
for (j=bandOffset[i]; j<bandOffset[i+1]; j++) {
|
for (j=bandOffset[i]; j<bandOffset[i+1]; j++) {
|
||||||
Word32 specm, specs;
|
Word32 specm, specs;
|
||||||
Word32 l, r;
|
Word32 l, r;
|
||||||
|
|
||||||
l = mdctSpectrumLeft[j] >> 1;
|
l = mdctSpectrumLeft[j] >> 1;
|
||||||
@@ -86,17 +86,17 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
|
|||||||
accuMid = L_add(accuMid, MULHIGH(specm, specm));
|
accuMid = L_add(accuMid, MULHIGH(specm, specm));
|
||||||
accuSide = L_add(accuSide, MULHIGH(specs, specs));
|
accuSide = L_add(accuSide, MULHIGH(specs, specs));
|
||||||
}
|
}
|
||||||
|
|
||||||
accuMid = L_add(accuMid, accuMid);
|
accuMid = L_add(accuMid, accuMid);
|
||||||
accuSide = L_add(accuSide, accuSide);
|
accuSide = L_add(accuSide, accuSide);
|
||||||
bandEnergyMid[i] = accuMid;
|
bandEnergyMid[i] = accuMid;
|
||||||
accuMidSum = L_add(accuMidSum, accuMid);
|
accuMidSum = L_add(accuMidSum, accuMid);
|
||||||
bandEnergySide[i] = accuSide;
|
bandEnergySide[i] = accuSide;
|
||||||
accuSideSum = L_add(accuSideSum, accuSide);
|
accuSideSum = L_add(accuSideSum, accuSide);
|
||||||
|
|
||||||
}
|
}
|
||||||
*bandEnergyMidSum = accuMidSum;
|
*bandEnergyMidSum = accuMidSum;
|
||||||
*bandEnergySideSum = accuSideSum;
|
*bandEnergySideSum = accuSideSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -32,15 +32,15 @@ static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf,
|
|||||||
UWord8 **pBitBufWord,
|
UWord8 **pBitBufWord,
|
||||||
Word16 cnt)
|
Word16 cnt)
|
||||||
{
|
{
|
||||||
*pBitBufWord += cnt;
|
*pBitBufWord += cnt;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(*pBitBufWord > hBitBuf->pBitBufEnd) {
|
if(*pBitBufWord > hBitBuf->pBitBufEnd) {
|
||||||
*pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
|
*pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*pBitBufWord < hBitBuf->pBitBufBase) {
|
if(*pBitBufWord < hBitBuf->pBitBufBase) {
|
||||||
*pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
|
*pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,18 +57,18 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
|
|||||||
{
|
{
|
||||||
assert(bitBufSize*8 <= 32768);
|
assert(bitBufSize*8 <= 32768);
|
||||||
|
|
||||||
hBitBuf->pBitBufBase = pBitBufBase;
|
hBitBuf->pBitBufBase = pBitBufBase;
|
||||||
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
||||||
|
|
||||||
hBitBuf->pWriteNext = pBitBufBase;
|
hBitBuf->pWriteNext = pBitBufBase;
|
||||||
|
|
||||||
hBitBuf->cache = 0;
|
hBitBuf->cache = 0;
|
||||||
|
|
||||||
hBitBuf->wBitPos = 0;
|
hBitBuf->wBitPos = 0;
|
||||||
hBitBuf->cntBits = 0;
|
hBitBuf->cntBits = 0;
|
||||||
|
|
||||||
hBitBuf->size = (bitBufSize << 3);
|
hBitBuf->size = (bitBufSize << 3);
|
||||||
hBitBuf->isValid = 1;
|
hBitBuf->isValid = 1;
|
||||||
|
|
||||||
return hBitBuf;
|
return hBitBuf;
|
||||||
}
|
}
|
||||||
@@ -82,8 +82,8 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
|
|||||||
void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
|
void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
|
||||||
{
|
{
|
||||||
if(*hBitBuf)
|
if(*hBitBuf)
|
||||||
(*hBitBuf)->isValid = 0;
|
(*hBitBuf)->isValid = 0;
|
||||||
*hBitBuf = NULL;
|
*hBitBuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -96,15 +96,15 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
|
|||||||
UWord8 *pBitBufBase,
|
UWord8 *pBitBufBase,
|
||||||
Word16 bitBufSize)
|
Word16 bitBufSize)
|
||||||
{
|
{
|
||||||
hBitBuf->pBitBufBase = pBitBufBase;
|
hBitBuf->pBitBufBase = pBitBufBase;
|
||||||
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
||||||
|
|
||||||
|
|
||||||
hBitBuf->pWriteNext = pBitBufBase;
|
|
||||||
|
|
||||||
hBitBuf->wBitPos = 0;
|
hBitBuf->pWriteNext = pBitBufBase;
|
||||||
hBitBuf->cntBits = 0;
|
|
||||||
|
hBitBuf->wBitPos = 0;
|
||||||
|
hBitBuf->cntBits = 0;
|
||||||
|
|
||||||
hBitBuf->cache = 0;
|
hBitBuf->cache = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +117,7 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
|
|||||||
void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
|
void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
|
||||||
HANDLE_BIT_BUF hBitBufDst)
|
HANDLE_BIT_BUF hBitBufDst)
|
||||||
{
|
{
|
||||||
*hBitBufDst = *hBitBufSrc;
|
*hBitBufDst = *hBitBufSrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -148,25 +148,25 @@ Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
|
|||||||
if(noBitsToWrite == 0)
|
if(noBitsToWrite == 0)
|
||||||
return noBitsToWrite;
|
return noBitsToWrite;
|
||||||
|
|
||||||
hBitBuf->cntBits += noBitsToWrite;
|
hBitBuf->cntBits += noBitsToWrite;
|
||||||
|
|
||||||
wBitPos = hBitBuf->wBitPos;
|
wBitPos = hBitBuf->wBitPos;
|
||||||
wBitPos += noBitsToWrite;
|
wBitPos += noBitsToWrite;
|
||||||
writeValue <<= 32 - wBitPos;
|
writeValue <<= 32 - wBitPos;
|
||||||
writeValue |= hBitBuf->cache;
|
writeValue |= hBitBuf->cache;
|
||||||
|
|
||||||
while (wBitPos >= 8)
|
while (wBitPos >= 8)
|
||||||
{
|
{
|
||||||
UWord8 tmp;
|
UWord8 tmp;
|
||||||
tmp = (UWord8)((writeValue >> 24) & 0xFF);
|
tmp = (UWord8)((writeValue >> 24) & 0xFF);
|
||||||
|
|
||||||
*hBitBuf->pWriteNext++ = tmp;
|
*hBitBuf->pWriteNext++ = tmp;
|
||||||
writeValue <<= 8;
|
writeValue <<= 8;
|
||||||
wBitPos -= 8;
|
wBitPos -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
hBitBuf->wBitPos = wBitPos;
|
hBitBuf->wBitPos = wBitPos;
|
||||||
hBitBuf->cache = writeValue;
|
hBitBuf->cache = writeValue;
|
||||||
|
|
||||||
return noBitsToWrite;
|
return noBitsToWrite;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ static Word32 encodeSpectralData(Word16 *sfbOffset,
|
|||||||
Word16 i,sfb;
|
Word16 i,sfb;
|
||||||
Word16 dbgVal;
|
Word16 dbgVal;
|
||||||
SECTION_INFO* psectioninfo;
|
SECTION_INFO* psectioninfo;
|
||||||
dbgVal = GetBitsAvail(hBitStream);
|
dbgVal = GetBitsAvail(hBitStream);
|
||||||
|
|
||||||
for(i=0; i<sectionData->noOfSections; i++) {
|
for(i=0; i<sectionData->noOfSections; i++) {
|
||||||
psectioninfo = &(sectionData->sectionInfo[i]);
|
psectioninfo = &(sectionData->sectionInfo[i]);
|
||||||
@@ -100,7 +100,7 @@ static void encodeIcsInfo(Word16 blockType,
|
|||||||
WriteBits(hBitStream,blockType,2);
|
WriteBits(hBitStream,blockType,2);
|
||||||
WriteBits(hBitStream,windowShape,1);
|
WriteBits(hBitStream,windowShape,1);
|
||||||
|
|
||||||
|
|
||||||
switch(blockType){
|
switch(blockType){
|
||||||
case LONG_WINDOW:
|
case LONG_WINDOW:
|
||||||
case START_WINDOW:
|
case START_WINDOW:
|
||||||
@@ -137,30 +137,30 @@ static Word32 encodeSectionData(SECTION_DATA *sectionData,
|
|||||||
Word16 sectLen;
|
Word16 sectLen;
|
||||||
Word16 i;
|
Word16 i;
|
||||||
Word16 dbgVal=GetBitsAvail(hBitStream);
|
Word16 dbgVal=GetBitsAvail(hBitStream);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch(sectionData->blockType)
|
switch(sectionData->blockType)
|
||||||
{
|
{
|
||||||
case LONG_WINDOW:
|
case LONG_WINDOW:
|
||||||
case START_WINDOW:
|
case START_WINDOW:
|
||||||
case STOP_WINDOW:
|
case STOP_WINDOW:
|
||||||
sectEscapeVal = SECT_ESC_VAL_LONG;
|
sectEscapeVal = SECT_ESC_VAL_LONG;
|
||||||
sectLenBits = SECT_BITS_LONG;
|
sectLenBits = SECT_BITS_LONG;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHORT_WINDOW:
|
case SHORT_WINDOW:
|
||||||
sectEscapeVal = SECT_ESC_VAL_SHORT;
|
sectEscapeVal = SECT_ESC_VAL_SHORT;
|
||||||
sectLenBits = SECT_BITS_SHORT;
|
sectLenBits = SECT_BITS_SHORT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0;i<sectionData->noOfSections;i++) {
|
for(i=0;i<sectionData->noOfSections;i++) {
|
||||||
WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4);
|
WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4);
|
||||||
sectLen = sectionData->sectionInfo[i].sfbCnt;
|
sectLen = sectionData->sectionInfo[i].sfbCnt;
|
||||||
|
|
||||||
while(sectLen >= sectEscapeVal) {
|
while(sectLen >= sectEscapeVal) {
|
||||||
|
|
||||||
WriteBits(hBitStream,sectEscapeVal,sectLenBits);
|
WriteBits(hBitStream,sectEscapeVal,sectLenBits);
|
||||||
sectLen = sectLen - sectEscapeVal;
|
sectLen = sectLen - sectEscapeVal;
|
||||||
}
|
}
|
||||||
@@ -183,24 +183,24 @@ static Word32 encodeScaleFactorData(UWord16 *maxValueInSfb,
|
|||||||
{
|
{
|
||||||
Word16 i,j,lastValScf,deltaScf;
|
Word16 i,j,lastValScf,deltaScf;
|
||||||
Word16 dbgVal = GetBitsAvail(hBitStream);
|
Word16 dbgVal = GetBitsAvail(hBitStream);
|
||||||
SECTION_INFO* psectioninfo;
|
SECTION_INFO* psectioninfo;
|
||||||
|
|
||||||
lastValScf=scalefac[sectionData->firstScf];
|
lastValScf=scalefac[sectionData->firstScf];
|
||||||
|
|
||||||
for(i=0;i<sectionData->noOfSections;i++){
|
for(i=0;i<sectionData->noOfSections;i++){
|
||||||
psectioninfo = &(sectionData->sectionInfo[i]);
|
psectioninfo = &(sectionData->sectionInfo[i]);
|
||||||
if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){
|
if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){
|
||||||
for (j=psectioninfo->sfbStart;
|
for (j=psectioninfo->sfbStart;
|
||||||
j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){
|
j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){
|
||||||
|
|
||||||
if(maxValueInSfb[j] == 0) {
|
if(maxValueInSfb[j] == 0) {
|
||||||
deltaScf = 0;
|
deltaScf = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
deltaScf = lastValScf - scalefac[j];
|
deltaScf = lastValScf - scalefac[j];
|
||||||
lastValScf = scalefac[j];
|
lastValScf = scalefac[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
if(codeScalefactorDelta(deltaScf,hBitStream)){
|
if(codeScalefactorDelta(deltaScf,hBitStream)){
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ static void encodeMSInfo(Word16 sfbCnt,
|
|||||||
{
|
{
|
||||||
Word16 sfb, sfbOff;
|
Word16 sfb, sfbOff;
|
||||||
|
|
||||||
|
|
||||||
switch(msDigest)
|
switch(msDigest)
|
||||||
{
|
{
|
||||||
case MS_NONE:
|
case MS_NONE:
|
||||||
@@ -242,7 +242,7 @@ static void encodeMSInfo(Word16 sfbCnt,
|
|||||||
WriteBits(hBitStream,SI_MS_MASK_SOME,2);
|
WriteBits(hBitStream,SI_MS_MASK_SOME,2);
|
||||||
for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) {
|
for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) {
|
||||||
for(sfb=0; sfb<maxSfb; sfb++) {
|
for(sfb=0; sfb<maxSfb; sfb++) {
|
||||||
|
|
||||||
if(jsFlags[sfbOff+sfb] & MS_ON) {
|
if(jsFlags[sfbOff+sfb] & MS_ON) {
|
||||||
WriteBits(hBitStream,1,1);
|
WriteBits(hBitStream,1,1);
|
||||||
}
|
}
|
||||||
@@ -272,7 +272,7 @@ static void encodeTnsData(TNS_INFO tnsInfo,
|
|||||||
Word16 coefBits;
|
Word16 coefBits;
|
||||||
Flag isShort;
|
Flag isShort;
|
||||||
|
|
||||||
|
|
||||||
if (blockType==2) {
|
if (blockType==2) {
|
||||||
isShort = 1;
|
isShort = 1;
|
||||||
numOfWindows = TRANS_FAC;
|
numOfWindows = TRANS_FAC;
|
||||||
@@ -282,52 +282,52 @@ static void encodeTnsData(TNS_INFO tnsInfo,
|
|||||||
numOfWindows = 1;
|
numOfWindows = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tnsPresent=0;
|
tnsPresent=0;
|
||||||
for (i=0; i<numOfWindows; i++) {
|
for (i=0; i<numOfWindows; i++) {
|
||||||
|
|
||||||
if (tnsInfo.tnsActive[i]) {
|
if (tnsInfo.tnsActive[i]) {
|
||||||
tnsPresent=1;
|
tnsPresent=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tnsPresent==0) {
|
if (tnsPresent==0) {
|
||||||
WriteBits(hBitStream,0,1);
|
WriteBits(hBitStream,0,1);
|
||||||
}
|
}
|
||||||
else{ /* there is data to be written*/
|
else{ /* there is data to be written*/
|
||||||
WriteBits(hBitStream,1,1); /*data_present */
|
WriteBits(hBitStream,1,1); /*data_present */
|
||||||
for (i=0; i<numOfWindows; i++) {
|
for (i=0; i<numOfWindows; i++) {
|
||||||
|
|
||||||
WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2));
|
WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2));
|
||||||
|
|
||||||
if (tnsInfo.tnsActive[i]) {
|
if (tnsInfo.tnsActive[i]) {
|
||||||
|
|
||||||
WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1);
|
WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1);
|
||||||
|
|
||||||
WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6));
|
WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6));
|
||||||
|
|
||||||
WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5));
|
WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5));
|
||||||
|
|
||||||
if (tnsInfo.order[i]){
|
if (tnsInfo.order[i]){
|
||||||
WriteBits(hBitStream, FILTER_DIRECTION, 1);
|
WriteBits(hBitStream, FILTER_DIRECTION, 1);
|
||||||
|
|
||||||
if(tnsInfo.coefRes[i] == 4) {
|
if(tnsInfo.coefRes[i] == 4) {
|
||||||
coefBits = 3;
|
coefBits = 3;
|
||||||
for(k=0; k<tnsInfo.order[i]; k++) {
|
for(k=0; k<tnsInfo.order[i]; k++) {
|
||||||
|
|
||||||
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 ||
|
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 ||
|
||||||
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) {
|
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) {
|
||||||
coefBits = 4;
|
coefBits = 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
coefBits = 2;
|
coefBits = 2;
|
||||||
for(k=0; k<tnsInfo.order[i]; k++) {
|
for(k=0; k<tnsInfo.order[i]; k++) {
|
||||||
|
|
||||||
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 ||
|
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 ||
|
||||||
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) {
|
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) {
|
||||||
coefBits = 3;
|
coefBits = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -335,7 +335,7 @@ static void encodeTnsData(TNS_INFO tnsInfo,
|
|||||||
WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/
|
WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/
|
||||||
for (k=0; k<tnsInfo.order[i]; k++ ) {
|
for (k=0; k<tnsInfo.order[i]; k++ ) {
|
||||||
static const Word16 rmask[] = {0,1,3,7,15};
|
static const Word16 rmask[] = {0,1,3,7,15};
|
||||||
|
|
||||||
WriteBits(hBitStream,tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] & rmask[coefBits],coefBits);
|
WriteBits(hBitStream,tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] & rmask[coefBits],coefBits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -397,7 +397,7 @@ writeIndividualChannelStream(Flag commonWindow,
|
|||||||
|
|
||||||
encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream);
|
encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream);
|
||||||
|
|
||||||
|
|
||||||
if(!commonWindow) {
|
if(!commonWindow) {
|
||||||
encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream);
|
encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream);
|
||||||
}
|
}
|
||||||
@@ -536,7 +536,7 @@ static void writeFillElement( const UWord8 *ancBytes,
|
|||||||
Write fill Element(s):
|
Write fill Element(s):
|
||||||
amount of a fill element can be 7+X*8 Bits, X element of [0..270]
|
amount of a fill element can be 7+X*8 Bits, X element of [0..270]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while(totFillBits >= (3+4)) {
|
while(totFillBits >= (3+4)) {
|
||||||
cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1));
|
cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1));
|
||||||
|
|
||||||
@@ -545,7 +545,7 @@ static void writeFillElement( const UWord8 *ancBytes,
|
|||||||
|
|
||||||
totFillBits = totFillBits - (3+4);
|
totFillBits = totFillBits - (3+4);
|
||||||
|
|
||||||
|
|
||||||
if ((cnt == (1<<4)-1)) {
|
if ((cnt == (1<<4)-1)) {
|
||||||
|
|
||||||
esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1);
|
esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1);
|
||||||
@@ -555,7 +555,7 @@ static void writeFillElement( const UWord8 *ancBytes,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(i=0;i<cnt;i++) {
|
for(i=0;i<cnt;i++) {
|
||||||
|
|
||||||
if(ancBytes)
|
if(ancBytes)
|
||||||
WriteBits(hBitStream, *ancBytes++,8);
|
WriteBits(hBitStream, *ancBytes++,8);
|
||||||
else
|
else
|
||||||
@@ -576,7 +576,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
|||||||
ELEMENT_INFO elInfo,
|
ELEMENT_INFO elInfo,
|
||||||
QC_OUT *qcOut,
|
QC_OUT *qcOut,
|
||||||
PSY_OUT *psyOut,
|
PSY_OUT *psyOut,
|
||||||
Word16 *globUsedBits,
|
Word16 *globUsedBits,
|
||||||
const UWord8 *ancBytes,
|
const UWord8 *ancBytes,
|
||||||
Word16 sampindex
|
Word16 sampindex
|
||||||
) /* returns error code */
|
) /* returns error code */
|
||||||
@@ -586,7 +586,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
|||||||
Word16 frameBits=0;
|
Word16 frameBits=0;
|
||||||
|
|
||||||
/* struct bitbuffer bsWriteCopy; */
|
/* struct bitbuffer bsWriteCopy; */
|
||||||
bitMarkUp = GetBitsAvail(hBitStream);
|
bitMarkUp = GetBitsAvail(hBitStream);
|
||||||
if(qcOut->qcElement.adtsUsed) /* write adts header*/
|
if(qcOut->qcElement.adtsUsed) /* write adts header*/
|
||||||
{
|
{
|
||||||
WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
|
WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
|
||||||
@@ -601,23 +601,23 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
|||||||
6 channels or less, else a channel
|
6 channels or less, else a channel
|
||||||
configuration should be written */
|
configuration should be written */
|
||||||
WriteBits(hBitStream, 0, 1); /* original/copy */
|
WriteBits(hBitStream, 0, 1); /* original/copy */
|
||||||
WriteBits(hBitStream, 0, 1); /* home */
|
WriteBits(hBitStream, 0, 1); /* home */
|
||||||
|
|
||||||
/* Variable ADTS header */
|
/* Variable ADTS header */
|
||||||
WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
|
WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
|
||||||
WriteBits(hBitStream, 0, 1); /* copyr. id. start */
|
WriteBits(hBitStream, 0, 1); /* copyr. id. start */
|
||||||
WriteBits(hBitStream, *globUsedBits >> 3, 13);
|
WriteBits(hBitStream, *globUsedBits >> 3, 13);
|
||||||
WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
|
WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
|
||||||
WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */
|
WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */
|
||||||
}
|
}
|
||||||
|
|
||||||
*globUsedBits=0;
|
*globUsedBits=0;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
Word16 *sfbOffset[2];
|
Word16 *sfbOffset[2];
|
||||||
TNS_INFO tnsInfo[2];
|
TNS_INFO tnsInfo[2];
|
||||||
elementUsedBits = 0;
|
elementUsedBits = 0;
|
||||||
|
|
||||||
switch (elInfo.elType) {
|
switch (elInfo.elType) {
|
||||||
|
|
||||||
@@ -636,7 +636,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
|||||||
{
|
{
|
||||||
Word16 msDigest;
|
Word16 msDigest;
|
||||||
Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask;
|
Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask;
|
||||||
msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
|
msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
|
||||||
sfbOffset[0] =
|
sfbOffset[0] =
|
||||||
psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
|
psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
|
||||||
sfbOffset[1] =
|
sfbOffset[1] =
|
||||||
@@ -668,20 +668,20 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
writeFillElement(NULL,
|
writeFillElement(NULL,
|
||||||
qcOut->totFillBits,
|
qcOut->totFillBits,
|
||||||
hBitStream);
|
hBitStream);
|
||||||
|
|
||||||
WriteBits(hBitStream,ID_END,3);
|
WriteBits(hBitStream,ID_END,3);
|
||||||
|
|
||||||
/* byte alignement */
|
/* byte alignement */
|
||||||
WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
|
WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
|
||||||
|
|
||||||
*globUsedBits = *globUsedBits- bitMarkUp;
|
*globUsedBits = *globUsedBits- bitMarkUp;
|
||||||
bitMarkUp = GetBitsAvail(hBitStream);
|
bitMarkUp = GetBitsAvail(hBitStream);
|
||||||
*globUsedBits = *globUsedBits + bitMarkUp;
|
*globUsedBits = *globUsedBits + bitMarkUp;
|
||||||
frameBits = frameBits + *globUsedBits;
|
frameBits = frameBits + *globUsedBits;
|
||||||
|
|
||||||
|
|
||||||
if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed +
|
if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed +
|
||||||
qcOut->totFillBits + qcOut->alignBits)) {
|
qcOut->totFillBits + qcOut->alignBits)) {
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
IIR high pass coeffs
|
IIR high pass coeffs
|
||||||
*/
|
*/
|
||||||
Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = {
|
Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = {
|
||||||
0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */
|
0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */
|
static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */
|
||||||
@@ -76,8 +76,8 @@ Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
const Word32 bitRate, const Word16 nChannels)
|
const Word32 bitRate, const Word16 nChannels)
|
||||||
{
|
{
|
||||||
/* select attackRatio */
|
/* select attackRatio */
|
||||||
|
|
||||||
if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) ||
|
if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) ||
|
||||||
(sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) {
|
(sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) {
|
||||||
blockSwitchingControl->invAttackRatio = invAttackRatioHighBr;
|
blockSwitchingControl->invAttackRatio = invAttackRatioHighBr;
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
|
|
||||||
/* Reset grouping info */
|
/* Reset grouping info */
|
||||||
for (i=0; i<TRANS_FAC; i++) {
|
for (i=0; i<TRANS_FAC; i++) {
|
||||||
blockSwitchingControl->groupLen[i] = 0;
|
blockSwitchingControl->groupLen[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -125,21 +125,21 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
&blockSwitchingControl->attackIndex,
|
&blockSwitchingControl->attackIndex,
|
||||||
BLOCK_SWITCH_WINDOWS);
|
BLOCK_SWITCH_WINDOWS);
|
||||||
|
|
||||||
blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
|
blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
|
||||||
|
|
||||||
/* Set grouping info */
|
/* Set grouping info */
|
||||||
blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
|
blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
|
||||||
|
|
||||||
for (i=0; i<MAX_NO_OF_GROUPS; i++) {
|
for (i=0; i<MAX_NO_OF_GROUPS; i++) {
|
||||||
blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i];
|
blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */
|
/* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */
|
||||||
if(sampleRate >= 16000) {
|
if(sampleRate >= 16000) {
|
||||||
/* Save current window energy as last window energy */
|
/* Save current window energy as last window energy */
|
||||||
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
|
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
|
||||||
blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w];
|
blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w];
|
||||||
blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w];
|
blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -147,10 +147,10 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN);
|
CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN);
|
||||||
|
|
||||||
/* reset attack */
|
/* reset attack */
|
||||||
blockSwitchingControl->attack = FALSE;
|
blockSwitchingControl->attack = FALSE;
|
||||||
|
|
||||||
enMax = 0;
|
enMax = 0;
|
||||||
enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1];
|
enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1];
|
||||||
|
|
||||||
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
|
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
|
||||||
Word32 enM1_Tmp, accWindowNrg_Tmp, windowNrgF_Tmp;
|
Word32 enM1_Tmp, accWindowNrg_Tmp, windowNrgF_Tmp;
|
||||||
@@ -172,15 +172,15 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
/* if the energy with the ratio is bigger than the average, and the attack and short block */
|
/* if the energy with the ratio is bigger than the average, and the attack and short block */
|
||||||
if ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) >
|
if ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) >
|
||||||
blockSwitchingControl->accWindowNrg ) {
|
blockSwitchingControl->accWindowNrg ) {
|
||||||
blockSwitchingControl->attack = TRUE;
|
blockSwitchingControl->attack = TRUE;
|
||||||
blockSwitchingControl->lastAttackIndex = w;
|
blockSwitchingControl->lastAttackIndex = w;
|
||||||
}
|
}
|
||||||
enM1 = blockSwitchingControl->windowNrgF[1][w];
|
enM1 = blockSwitchingControl->windowNrgF[1][w];
|
||||||
enMax = max(enMax, enM1);
|
enMax = max(enMax, enM1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enMax < minAttackNrg) {
|
if (enMax < minAttackNrg) {
|
||||||
blockSwitchingControl->attack = FALSE;
|
blockSwitchingControl->attack = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -188,22 +188,22 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
blockSwitchingControl->attack = TRUE;
|
blockSwitchingControl->attack = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if attack spreads over frame border */
|
/* Check if attack spreads over frame border */
|
||||||
if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) {
|
if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) {
|
||||||
|
|
||||||
if (blockSwitchingControl->attackIndex == TRANS_FAC-1) {
|
if (blockSwitchingControl->attackIndex == TRANS_FAC-1) {
|
||||||
blockSwitchingControl->attack = TRUE;
|
blockSwitchingControl->attack = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockSwitchingControl->lastattack = FALSE;
|
blockSwitchingControl->lastattack = FALSE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
blockSwitchingControl->lastattack = blockSwitchingControl->attack;
|
blockSwitchingControl->lastattack = blockSwitchingControl->attack;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
|
blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (blockSwitchingControl->attack) {
|
if (blockSwitchingControl->attack) {
|
||||||
blockSwitchingControl->nextwindowSequence = SHORT_WINDOW;
|
blockSwitchingControl->nextwindowSequence = SHORT_WINDOW;
|
||||||
}
|
}
|
||||||
@@ -211,27 +211,27 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
blockSwitchingControl->nextwindowSequence = LONG_WINDOW;
|
blockSwitchingControl->nextwindowSequence = LONG_WINDOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update short block group */
|
/* update short block group */
|
||||||
if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) {
|
if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) {
|
||||||
|
|
||||||
if (blockSwitchingControl->windowSequence== LONG_WINDOW) {
|
if (blockSwitchingControl->windowSequence== LONG_WINDOW) {
|
||||||
blockSwitchingControl->windowSequence = START_WINDOW;
|
blockSwitchingControl->windowSequence = START_WINDOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blockSwitchingControl->windowSequence == STOP_WINDOW) {
|
if (blockSwitchingControl->windowSequence == STOP_WINDOW) {
|
||||||
blockSwitchingControl->windowSequence = SHORT_WINDOW;
|
blockSwitchingControl->windowSequence = SHORT_WINDOW;
|
||||||
blockSwitchingControl->noOfGroups = 3;
|
blockSwitchingControl->noOfGroups = 3;
|
||||||
blockSwitchingControl->groupLen[0] = 3;
|
blockSwitchingControl->groupLen[0] = 3;
|
||||||
blockSwitchingControl->groupLen[1] = 3;
|
blockSwitchingControl->groupLen[1] = 3;
|
||||||
blockSwitchingControl->groupLen[2] = 2;
|
blockSwitchingControl->groupLen[2] = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update block type */
|
/* update block type */
|
||||||
if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) {
|
if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) {
|
||||||
|
|
||||||
if (blockSwitchingControl->windowSequence == SHORT_WINDOW) {
|
if (blockSwitchingControl->windowSequence == SHORT_WINDOW) {
|
||||||
blockSwitchingControl->nextwindowSequence = STOP_WINDOW;
|
blockSwitchingControl->nextwindowSequence = STOP_WINDOW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,17 +252,17 @@ static Word32 SrchMaxWithIndex(const Word32 in[], Word16 *index, Word16 n)
|
|||||||
Word32 i, idx;
|
Word32 i, idx;
|
||||||
|
|
||||||
/* Search maximum value in array and return index and value */
|
/* Search maximum value in array and return index and value */
|
||||||
max = 0;
|
max = 0;
|
||||||
idx = 0;
|
idx = 0;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
|
|
||||||
if (in[i+1] > max) {
|
if (in[i+1] > max) {
|
||||||
max = in[i+1];
|
max = in[i+1];
|
||||||
idx = i;
|
idx = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*index = idx;
|
*index = idx;
|
||||||
|
|
||||||
return(max);
|
return(max);
|
||||||
}
|
}
|
||||||
@@ -292,11 +292,11 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
states1 = blockSwitchingControl->iirStates[1];
|
states1 = blockSwitchingControl->iirStates[1];
|
||||||
Coeff0 = hiPassCoeff[0];
|
Coeff0 = hiPassCoeff[0];
|
||||||
Coeff1 = hiPassCoeff[1];
|
Coeff1 = hiPassCoeff[1];
|
||||||
tidx = 0;
|
tidx = 0;
|
||||||
for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
|
for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
|
||||||
|
|
||||||
accuUE = 0;
|
accuUE = 0;
|
||||||
accuFE = 0;
|
accuFE = 0;
|
||||||
|
|
||||||
for(i=0; i<windowLen; i++) {
|
for(i=0; i<windowLen; i++) {
|
||||||
Word32 accu1, accu2, accu3;
|
Word32 accu1, accu2, accu3;
|
||||||
@@ -309,16 +309,16 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
|||||||
accu3 = accu1 - states0;
|
accu3 = accu1 - states0;
|
||||||
out = accu3 - accu2;
|
out = accu3 - accu2;
|
||||||
|
|
||||||
states0 = accu1;
|
states0 = accu1;
|
||||||
states1 = out;
|
states1 = out;
|
||||||
|
|
||||||
tempFiltered = extract_h(out);
|
tempFiltered = extract_h(out);
|
||||||
accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT;
|
accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT;
|
||||||
accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT;
|
accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockSwitchingControl->windowNrg[1][w] = accuUE;
|
blockSwitchingControl->windowNrg[1][w] = accuUE;
|
||||||
blockSwitchingControl->windowNrgF[1][w] = accuFE;
|
blockSwitchingControl->windowNrgF[1][w] = accuFE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,8 +346,8 @@ static Word16 IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[])
|
|||||||
accu2 = fixmul( coeff[0], states[1] );
|
accu2 = fixmul( coeff[0], states[1] );
|
||||||
out = accu3 - accu2;
|
out = accu3 - accu2;
|
||||||
|
|
||||||
states[0] = accu1;
|
states[0] = accu1;
|
||||||
states[1] = out;
|
states[1] = out;
|
||||||
|
|
||||||
return round16(out);
|
return round16(out);
|
||||||
}
|
}
|
||||||
@@ -374,54 +374,54 @@ Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
|
|||||||
const Word16 nChannels)
|
const Word16 nChannels)
|
||||||
{
|
{
|
||||||
Word16 i;
|
Word16 i;
|
||||||
Word16 patchType = LONG_WINDOW;
|
Word16 patchType = LONG_WINDOW;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (nChannels == 1) { /* Mono */
|
if (nChannels == 1) { /* Mono */
|
||||||
if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) {
|
if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) {
|
||||||
blockSwitchingControlLeft->noOfGroups = 1;
|
blockSwitchingControlLeft->noOfGroups = 1;
|
||||||
blockSwitchingControlLeft->groupLen[0] = 1;
|
blockSwitchingControlLeft->groupLen[0] = 1;
|
||||||
|
|
||||||
for (i=1; i<TRANS_FAC; i++) {
|
for (i=1; i<TRANS_FAC; i++) {
|
||||||
blockSwitchingControlLeft->groupLen[i] = 0;
|
blockSwitchingControlLeft->groupLen[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { /* Stereo common Window */
|
else { /* Stereo common Window */
|
||||||
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
|
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
|
||||||
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
|
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
|
||||||
|
|
||||||
/* Set synchronized Blocktype */
|
/* Set synchronized Blocktype */
|
||||||
blockSwitchingControlLeft->windowSequence = patchType;
|
blockSwitchingControlLeft->windowSequence = patchType;
|
||||||
blockSwitchingControlRight->windowSequence = patchType;
|
blockSwitchingControlRight->windowSequence = patchType;
|
||||||
|
|
||||||
/* Synchronize grouping info */
|
/* Synchronize grouping info */
|
||||||
if(patchType != SHORT_WINDOW) { /* Long Blocks */
|
if(patchType != SHORT_WINDOW) { /* Long Blocks */
|
||||||
/* Set grouping info */
|
/* Set grouping info */
|
||||||
blockSwitchingControlLeft->noOfGroups = 1;
|
blockSwitchingControlLeft->noOfGroups = 1;
|
||||||
blockSwitchingControlRight->noOfGroups = 1;
|
blockSwitchingControlRight->noOfGroups = 1;
|
||||||
blockSwitchingControlLeft->groupLen[0] = 1;
|
blockSwitchingControlLeft->groupLen[0] = 1;
|
||||||
blockSwitchingControlRight->groupLen[0] = 1;
|
blockSwitchingControlRight->groupLen[0] = 1;
|
||||||
|
|
||||||
for (i=1; i<TRANS_FAC; i++) {
|
for (i=1; i<TRANS_FAC; i++) {
|
||||||
blockSwitchingControlLeft->groupLen[i] = 0;
|
blockSwitchingControlLeft->groupLen[i] = 0;
|
||||||
blockSwitchingControlRight->groupLen[i] = 0;
|
blockSwitchingControlRight->groupLen[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) {
|
if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) {
|
||||||
/* Left Channel wins */
|
/* Left Channel wins */
|
||||||
blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
|
blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
|
||||||
for (i=0; i<TRANS_FAC; i++) {
|
for (i=0; i<TRANS_FAC; i++) {
|
||||||
blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
|
blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Right Channel wins */
|
/* Right Channel wins */
|
||||||
blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
|
blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
|
||||||
for (i=0; i<TRANS_FAC; i++) {
|
for (i=0; i<TRANS_FAC; i++) {
|
||||||
blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
|
blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,32 +29,32 @@ static const Word16 maxChannelBits = MAXBITS_COEF;
|
|||||||
|
|
||||||
static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
|
static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
|
||||||
{
|
{
|
||||||
Word16 error=0;
|
Word16 error=0;
|
||||||
|
|
||||||
elInfo->elType=elType;
|
elInfo->elType=elType;
|
||||||
|
|
||||||
switch(elInfo->elType) {
|
switch(elInfo->elType) {
|
||||||
|
|
||||||
case ID_SCE:
|
case ID_SCE:
|
||||||
elInfo->nChannelsInEl=1;
|
elInfo->nChannelsInEl=1;
|
||||||
|
|
||||||
elInfo->ChannelIndex[0]=0;
|
elInfo->ChannelIndex[0]=0;
|
||||||
|
|
||||||
elInfo->instanceTag=0;
|
elInfo->instanceTag=0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_CPE:
|
case ID_CPE:
|
||||||
|
|
||||||
elInfo->nChannelsInEl=2;
|
elInfo->nChannelsInEl=2;
|
||||||
|
|
||||||
elInfo->ChannelIndex[0]=0;
|
elInfo->ChannelIndex[0]=0;
|
||||||
elInfo->ChannelIndex[1]=1;
|
elInfo->ChannelIndex[1]=1;
|
||||||
|
|
||||||
elInfo->instanceTag=0;
|
elInfo->instanceTag=0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error=1;
|
error=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@@ -64,11 +64,11 @@ static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
|
|||||||
Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
|
Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
|
||||||
{
|
{
|
||||||
Word16 error;
|
Word16 error;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
switch(nChannels) {
|
switch(nChannels) {
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
initElement(elInfo, ID_SCE);
|
initElement(elInfo, ID_SCE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error=4;
|
error=4;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@@ -91,18 +91,18 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits,
|
|||||||
Word16 staticBitsTot)
|
Word16 staticBitsTot)
|
||||||
{
|
{
|
||||||
Word16 error;
|
Word16 error;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
switch(elInfo.nChannelsInEl) {
|
switch(elInfo.nChannelsInEl) {
|
||||||
case 1:
|
case 1:
|
||||||
elementBits->chBitrate = bitrateTot;
|
elementBits->chBitrate = bitrateTot;
|
||||||
elementBits->averageBits = averageBitsTot - staticBitsTot;
|
elementBits->averageBits = averageBitsTot - staticBitsTot;
|
||||||
elementBits->maxBits = maxChannelBits;
|
elementBits->maxBits = maxChannelBits;
|
||||||
|
|
||||||
elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
|
elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
|
||||||
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
||||||
elementBits->bitResLevel = elementBits->maxBitResBits;
|
elementBits->bitResLevel = elementBits->maxBitResBits;
|
||||||
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
@@ -111,13 +111,13 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits,
|
|||||||
elementBits->maxBits = maxChannelBits << 1;
|
elementBits->maxBits = maxChannelBits << 1;
|
||||||
|
|
||||||
elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
|
elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
|
||||||
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
||||||
elementBits->bitResLevel = elementBits->maxBitResBits;
|
elementBits->bitResLevel = elementBits->maxBitResBits;
|
||||||
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,12 +45,12 @@ buildBitLookUp(const Word16 *quantSpectrum,
|
|||||||
for (i=0; i<maxSfb; i++) {
|
for (i=0; i<maxSfb; i++) {
|
||||||
Word16 sfbWidth, maxVal;
|
Word16 sfbWidth, maxVal;
|
||||||
|
|
||||||
sectionInfo[i].sfbCnt = 1;
|
sectionInfo[i].sfbCnt = 1;
|
||||||
sectionInfo[i].sfbStart = i;
|
sectionInfo[i].sfbStart = i;
|
||||||
sectionInfo[i].sectionBits = INVALID_BITCOUNT;
|
sectionInfo[i].sectionBits = INVALID_BITCOUNT;
|
||||||
sectionInfo[i].codeBook = -1;
|
sectionInfo[i].codeBook = -1;
|
||||||
sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
|
sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
|
||||||
maxVal = sfbMax[i];
|
maxVal = sfbMax[i];
|
||||||
bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]);
|
bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,13 +66,13 @@ static Word16
|
|||||||
findBestBook(const Word16 *bc, Word16 *book)
|
findBestBook(const Word16 *bc, Word16 *book)
|
||||||
{
|
{
|
||||||
Word32 minBits, j;
|
Word32 minBits, j;
|
||||||
minBits = INVALID_BITCOUNT;
|
minBits = INVALID_BITCOUNT;
|
||||||
|
|
||||||
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
|
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
|
||||||
|
|
||||||
if (bc[j] < minBits) {
|
if (bc[j] < minBits) {
|
||||||
minBits = bc[j];
|
minBits = bc[j];
|
||||||
*book = j;
|
*book = j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return extract_l(minBits);
|
return extract_l(minBits);
|
||||||
@@ -82,12 +82,12 @@ static Word16
|
|||||||
findMinMergeBits(const Word16 *bc1, const Word16 *bc2)
|
findMinMergeBits(const Word16 *bc1, const Word16 *bc2)
|
||||||
{
|
{
|
||||||
Word32 minBits, j, sum;
|
Word32 minBits, j, sum;
|
||||||
minBits = INVALID_BITCOUNT;
|
minBits = INVALID_BITCOUNT;
|
||||||
|
|
||||||
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
|
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
|
||||||
sum = bc1[j] + bc2[j];
|
sum = bc1[j] + bc2[j];
|
||||||
if (sum < minBits) {
|
if (sum < minBits) {
|
||||||
minBits = sum;
|
minBits = sum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return extract_l(minBits);
|
return extract_l(minBits);
|
||||||
@@ -109,13 +109,13 @@ findMaxMerge(const Word16 mergeGainLookUp[MAX_SFB_LONG],
|
|||||||
const Word16 maxSfb, Word16 *maxNdx)
|
const Word16 maxSfb, Word16 *maxNdx)
|
||||||
{
|
{
|
||||||
Word32 i, maxMergeGain;
|
Word32 i, maxMergeGain;
|
||||||
maxMergeGain = 0;
|
maxMergeGain = 0;
|
||||||
|
|
||||||
for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) {
|
for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) {
|
||||||
|
|
||||||
if (mergeGainLookUp[i] > maxMergeGain) {
|
if (mergeGainLookUp[i] > maxMergeGain) {
|
||||||
maxMergeGain = mergeGainLookUp[i];
|
maxMergeGain = mergeGainLookUp[i];
|
||||||
*maxNdx = i;
|
*maxNdx = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return extract_l(maxMergeGain);
|
return extract_l(maxMergeGain);
|
||||||
@@ -159,7 +159,7 @@ gmStage0(SECTION_INFO * sectionInfo,
|
|||||||
|
|
||||||
for (i=0; i<maxSfb; i++) {
|
for (i=0; i<maxSfb; i++) {
|
||||||
/* Side-Info bits will be calculated in Stage 1! */
|
/* Side-Info bits will be calculated in Stage 1! */
|
||||||
|
|
||||||
if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) {
|
if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) {
|
||||||
sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
|
sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
|
||||||
}
|
}
|
||||||
@@ -180,13 +180,13 @@ gmStage1(SECTION_INFO * sectionInfo,
|
|||||||
SECTION_INFO * sectionInfo_s;
|
SECTION_INFO * sectionInfo_s;
|
||||||
SECTION_INFO * sectionInfo_e;
|
SECTION_INFO * sectionInfo_e;
|
||||||
Word32 mergeStart, mergeEnd;
|
Word32 mergeStart, mergeEnd;
|
||||||
mergeStart = 0;
|
mergeStart = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
sectionInfo_s = sectionInfo + mergeStart;
|
sectionInfo_s = sectionInfo + mergeStart;
|
||||||
for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
|
for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
|
||||||
sectionInfo_e = sectionInfo + mergeEnd;
|
sectionInfo_e = sectionInfo + mergeEnd;
|
||||||
if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
|
if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
|
||||||
break;
|
break;
|
||||||
sectionInfo_s->sfbCnt += 1;
|
sectionInfo_s->sfbCnt += 1;
|
||||||
@@ -196,11 +196,11 @@ gmStage1(SECTION_INFO * sectionInfo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt];
|
sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt];
|
||||||
sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */
|
sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */
|
||||||
|
|
||||||
|
mergeStart = mergeEnd;
|
||||||
|
|
||||||
mergeStart = mergeEnd;
|
|
||||||
|
|
||||||
|
|
||||||
} while (mergeStart - maxSfb < 0);
|
} while (mergeStart - maxSfb < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +230,7 @@ gmStage2(SECTION_INFO *sectionInfo,
|
|||||||
|
|
||||||
maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx);
|
maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx);
|
||||||
|
|
||||||
|
|
||||||
if (maxMergeGain <= 0)
|
if (maxMergeGain <= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ gmStage2(SECTION_INFO *sectionInfo,
|
|||||||
|
|
||||||
mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
|
mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
|
||||||
|
|
||||||
|
|
||||||
if (maxNdx != 0) {
|
if (maxNdx != 0) {
|
||||||
maxNdxLast = sectionInfo[maxNdx - 1].sfbStart;
|
maxNdxLast = sectionInfo[maxNdx - 1].sfbStart;
|
||||||
mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo,
|
mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo,
|
||||||
@@ -255,9 +255,9 @@ gmStage2(SECTION_INFO *sectionInfo,
|
|||||||
}
|
}
|
||||||
maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
|
maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
|
||||||
|
|
||||||
sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
|
sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (maxNdxNext - maxSfb < 0) {
|
if (maxNdxNext - maxSfb < 0) {
|
||||||
mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo,
|
mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo,
|
||||||
bitLookUp,
|
bitLookUp,
|
||||||
@@ -286,7 +286,7 @@ noiselessCounter(SECTION_DATA *sectionData,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
use appropriate side info table
|
use appropriate side info table
|
||||||
*/
|
*/
|
||||||
switch (blockType)
|
switch (blockType)
|
||||||
{
|
{
|
||||||
case LONG_WINDOW:
|
case LONG_WINDOW:
|
||||||
@@ -300,11 +300,11 @@ noiselessCounter(SECTION_DATA *sectionData,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sectionData->noOfSections = 0;
|
sectionData->noOfSections = 0;
|
||||||
sectionData->huffmanBits = 0;
|
sectionData->huffmanBits = 0;
|
||||||
sectionData->sideInfoBits = 0;
|
sectionData->sideInfoBits = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (sectionData->maxSfbPerGroup == 0)
|
if (sectionData->maxSfbPerGroup == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -353,7 +353,7 @@ noiselessCounter(SECTION_DATA *sectionData,
|
|||||||
sectionData->huffmanBits = (sectionData->huffmanBits +
|
sectionData->huffmanBits = (sectionData->huffmanBits +
|
||||||
(sectionInfo[i].sectionBits - sideInfoTab[sectionInfo[i].sfbCnt]));
|
(sectionInfo[i].sectionBits - sideInfoTab[sectionInfo[i].sfbCnt]));
|
||||||
sectionData->sideInfoBits = (sectionData->sideInfoBits + sideInfoTab[sectionInfo[i].sfbCnt]);
|
sectionData->sideInfoBits = (sectionData->sideInfoBits + sideInfoTab[sectionInfo[i].sfbCnt]);
|
||||||
sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i];
|
sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i];
|
||||||
sectionData->noOfSections = sectionData->noOfSections + 1;
|
sectionData->noOfSections = sectionData->noOfSections + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -386,25 +386,25 @@ static void scfCount(const Word16 *scalefacGain,
|
|||||||
Word32 lastValScf = 0;
|
Word32 lastValScf = 0;
|
||||||
Word32 deltaScf = 0;
|
Word32 deltaScf = 0;
|
||||||
Flag found = 0;
|
Flag found = 0;
|
||||||
Word32 scfSkipCounter = 0;
|
Word32 scfSkipCounter = 0;
|
||||||
|
|
||||||
|
|
||||||
|
sectionData->scalefacBits = 0;
|
||||||
|
|
||||||
sectionData->scalefacBits = 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (scalefacGain == NULL) {
|
if (scalefacGain == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lastValScf = 0;
|
lastValScf = 0;
|
||||||
sectionData->firstScf = 0;
|
sectionData->firstScf = 0;
|
||||||
|
|
||||||
psectionInfo = sectionData->sectionInfo;
|
psectionInfo = sectionData->sectionInfo;
|
||||||
for (i=0; i<sectionData->noOfSections; i++) {
|
for (i=0; i<sectionData->noOfSections; i++) {
|
||||||
|
|
||||||
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) {
|
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) {
|
||||||
sectionData->firstScf = psectionInfo->sfbStart;
|
sectionData->firstScf = psectionInfo->sfbStart;
|
||||||
lastValScf = scalefacGain[sectionData->firstScf];
|
lastValScf = scalefacGain[sectionData->firstScf];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
psectionInfo += 1;
|
psectionInfo += 1;
|
||||||
@@ -412,38 +412,38 @@ static void scfCount(const Word16 *scalefacGain,
|
|||||||
|
|
||||||
psectionInfo = sectionData->sectionInfo;
|
psectionInfo = sectionData->sectionInfo;
|
||||||
for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) {
|
for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) {
|
||||||
|
|
||||||
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO
|
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO
|
||||||
&& psectionInfo->codeBook != CODE_BOOK_PNS_NO) {
|
&& psectionInfo->codeBook != CODE_BOOK_PNS_NO) {
|
||||||
for (j = psectionInfo->sfbStart;
|
for (j = psectionInfo->sfbStart;
|
||||||
j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) {
|
j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) {
|
||||||
/* check if we can repeat the last value to save bits */
|
/* check if we can repeat the last value to save bits */
|
||||||
|
|
||||||
if (maxValueInSfb[j] == 0) {
|
if (maxValueInSfb[j] == 0) {
|
||||||
found = 0;
|
found = 0;
|
||||||
|
|
||||||
if (scfSkipCounter == 0) {
|
if (scfSkipCounter == 0) {
|
||||||
/* end of section */
|
/* end of section */
|
||||||
|
|
||||||
if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) {
|
if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) {
|
||||||
found = 0;
|
found = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) {
|
for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) {
|
||||||
|
|
||||||
if (maxValueInSfb[k] != 0) {
|
if (maxValueInSfb[k] != 0) {
|
||||||
int tmp = L_abs(scalefacGain[k] - lastValScf);
|
int tmp = L_abs(scalefacGain[k] - lastValScf);
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
if ( tmp < CODE_BOOK_SCF_LAV) {
|
if ( tmp < CODE_BOOK_SCF_LAV) {
|
||||||
/* save bits */
|
/* save bits */
|
||||||
deltaScf = 0;
|
deltaScf = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* do not save bits */
|
/* do not save bits */
|
||||||
deltaScf = lastValScf - scalefacGain[j];
|
deltaScf = lastValScf - scalefacGain[j];
|
||||||
lastValScf = scalefacGain[j];
|
lastValScf = scalefacGain[j];
|
||||||
scfSkipCounter = 0;
|
scfSkipCounter = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -451,26 +451,26 @@ static void scfCount(const Word16 *scalefacGain,
|
|||||||
scfSkipCounter = scfSkipCounter + 1;
|
scfSkipCounter = scfSkipCounter + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
psectionInfom = psectionInfo + 1;
|
psectionInfom = psectionInfo + 1;
|
||||||
/* search for the next maxValueInSfb[] != 0 in all other sections */
|
/* search for the next maxValueInSfb[] != 0 in all other sections */
|
||||||
for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) {
|
for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) {
|
||||||
|
|
||||||
if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) &&
|
if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) &&
|
||||||
(psectionInfom->codeBook != CODE_BOOK_PNS_NO)) {
|
(psectionInfom->codeBook != CODE_BOOK_PNS_NO)) {
|
||||||
for (n = psectionInfom->sfbStart;
|
for (n = psectionInfom->sfbStart;
|
||||||
n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) {
|
n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) {
|
||||||
|
|
||||||
if (maxValueInSfb[n] != 0) {
|
if (maxValueInSfb[n] != 0) {
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) {
|
if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) {
|
||||||
deltaScf = 0;
|
deltaScf = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
deltaScf = (lastValScf - scalefacGain[j]);
|
deltaScf = (lastValScf - scalefacGain[j]);
|
||||||
lastValScf = scalefacGain[j];
|
lastValScf = scalefacGain[j];
|
||||||
scfSkipCounter = 0;
|
scfSkipCounter = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -481,20 +481,20 @@ static void scfCount(const Word16 *scalefacGain,
|
|||||||
|
|
||||||
psectionInfom += 1;
|
psectionInfom += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found == 0) {
|
if (found == 0) {
|
||||||
deltaScf = 0;
|
deltaScf = 0;
|
||||||
scfSkipCounter = 0;
|
scfSkipCounter = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
deltaScf = 0;
|
deltaScf = 0;
|
||||||
scfSkipCounter = scfSkipCounter - 1;
|
scfSkipCounter = scfSkipCounter - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
deltaScf = lastValScf - scalefacGain[j];
|
deltaScf = lastValScf - scalefacGain[j];
|
||||||
lastValScf = scalefacGain[j];
|
lastValScf = scalefacGain[j];
|
||||||
}
|
}
|
||||||
sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf);
|
sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf);
|
||||||
}
|
}
|
||||||
@@ -517,14 +517,14 @@ dynBitCount(const Word16 *quantSpectrum,
|
|||||||
const Word16 *sfbOffset,
|
const Word16 *sfbOffset,
|
||||||
SECTION_DATA *sectionData)
|
SECTION_DATA *sectionData)
|
||||||
{
|
{
|
||||||
sectionData->blockType = blockType;
|
sectionData->blockType = blockType;
|
||||||
sectionData->sfbCnt = sfbCnt;
|
sectionData->sfbCnt = sfbCnt;
|
||||||
sectionData->sfbPerGroup = sfbPerGroup;
|
sectionData->sfbPerGroup = sfbPerGroup;
|
||||||
if(sfbPerGroup)
|
if(sfbPerGroup)
|
||||||
sectionData->noOfGroups = sfbCnt/sfbPerGroup;
|
sectionData->noOfGroups = sfbCnt/sfbPerGroup;
|
||||||
else
|
else
|
||||||
sectionData->noOfGroups = 0x7fff;
|
sectionData->noOfGroups = 0x7fff;
|
||||||
sectionData->maxSfbPerGroup = maxSfbPerGroup;
|
sectionData->maxSfbPerGroup = maxSfbPerGroup;
|
||||||
|
|
||||||
noiselessCounter(sectionData,
|
noiselessCounter(sectionData,
|
||||||
sectionData->mergeGainLookUp,
|
sectionData->mergeGainLookUp,
|
||||||
@@ -539,7 +539,7 @@ dynBitCount(const Word16 *quantSpectrum,
|
|||||||
sectionData);
|
sectionData);
|
||||||
|
|
||||||
|
|
||||||
return (sectionData->huffmanBits + sectionData->sideInfoBits +
|
return (sectionData->huffmanBits + sectionData->sideInfoBits +
|
||||||
sectionData->scalefacBits);
|
sectionData->scalefacBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,29 +57,29 @@ groupShortData(Word32 *mdctSpectrum,
|
|||||||
|
|
||||||
/* for short: regroup and */
|
/* for short: regroup and */
|
||||||
/* cumulate energies und thresholds group-wise . */
|
/* cumulate energies und thresholds group-wise . */
|
||||||
|
|
||||||
/* calculate sfbCnt */
|
/* calculate sfbCnt */
|
||||||
highestSfb = 0;
|
highestSfb = 0;
|
||||||
for (wnd=0; wnd<TRANS_FAC; wnd++) {
|
for (wnd=0; wnd<TRANS_FAC; wnd++) {
|
||||||
for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
|
for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
|
||||||
for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
|
for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
|
||||||
|
|
||||||
if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
|
if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line >= sfbOffset[sfb]) break;
|
if (line >= sfbOffset[sfb]) break;
|
||||||
}
|
}
|
||||||
highestSfb = max(highestSfb, sfb);
|
highestSfb = max(highestSfb, sfb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (highestSfb < 0) {
|
if (highestSfb < 0) {
|
||||||
highestSfb = 0;
|
highestSfb = 0;
|
||||||
}
|
}
|
||||||
*maxSfbPerGroup = highestSfb + 1;
|
*maxSfbPerGroup = highestSfb + 1;
|
||||||
|
|
||||||
/* calculate sfbOffset */
|
/* calculate sfbOffset */
|
||||||
i = 0;
|
i = 0;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
|
groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
|
||||||
@@ -87,15 +87,15 @@ groupShortData(Word32 *mdctSpectrum,
|
|||||||
}
|
}
|
||||||
offset += groupLen[grp] * FRAME_LEN_SHORT;
|
offset += groupLen[grp] * FRAME_LEN_SHORT;
|
||||||
}
|
}
|
||||||
groupedSfbOffset[i] = FRAME_LEN_LONG;
|
groupedSfbOffset[i] = FRAME_LEN_LONG;
|
||||||
i += 1;
|
i += 1;
|
||||||
|
|
||||||
/* calculate minSnr */
|
/* calculate minSnr */
|
||||||
i = 0;
|
i = 0;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
groupedSfbMinSnr[i] = sfbMinSnr[sfb];
|
groupedSfbMinSnr[i] = sfbMinSnr[sfb];
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
offset += groupLen[grp] * FRAME_LEN_SHORT;
|
offset += groupLen[grp] * FRAME_LEN_SHORT;
|
||||||
@@ -103,74 +103,74 @@ groupShortData(Word32 *mdctSpectrum,
|
|||||||
|
|
||||||
|
|
||||||
/* sum up sfbThresholds */
|
/* sum up sfbThresholds */
|
||||||
wnd = 0;
|
wnd = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
|
Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
|
||||||
for (j=1; j<groupLen[grp]; j++) {
|
for (j=1; j<groupLen[grp]; j++) {
|
||||||
thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
|
thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
|
||||||
}
|
}
|
||||||
sfbThreshold->sfbLong[i] = thresh;
|
sfbThreshold->sfbLong[i] = thresh;
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
wnd += groupLen[grp];
|
wnd += groupLen[grp];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sum up sfbEnergies left/right */
|
/* sum up sfbEnergies left/right */
|
||||||
wnd = 0;
|
wnd = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
|
Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
|
||||||
for (j=1; j<groupLen[grp]; j++) {
|
for (j=1; j<groupLen[grp]; j++) {
|
||||||
energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
|
energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
|
||||||
}
|
}
|
||||||
sfbEnergy->sfbLong[i] = energy;
|
sfbEnergy->sfbLong[i] = energy;
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
wnd += groupLen[grp];
|
wnd += groupLen[grp];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sum up sfbEnergies mid/side */
|
/* sum up sfbEnergies mid/side */
|
||||||
wnd = 0;
|
wnd = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
|
Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
|
||||||
for (j=1; j<groupLen[grp]; j++) {
|
for (j=1; j<groupLen[grp]; j++) {
|
||||||
energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
|
energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
|
||||||
}
|
}
|
||||||
sfbEnergyMS->sfbLong[i] = energy;
|
sfbEnergyMS->sfbLong[i] = energy;
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
wnd += groupLen[grp];
|
wnd += groupLen[grp];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sum up sfbSpreadedEnergies */
|
/* sum up sfbSpreadedEnergies */
|
||||||
wnd = 0;
|
wnd = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
|
Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
|
||||||
for (j=1; j<groupLen[grp]; j++) {
|
for (j=1; j<groupLen[grp]; j++) {
|
||||||
energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
|
energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
|
||||||
}
|
}
|
||||||
sfbSpreadedEnergy->sfbLong[i] = energy;
|
sfbSpreadedEnergy->sfbLong[i] = energy;
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
wnd += groupLen[grp];
|
wnd += groupLen[grp];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* re-group spectrum */
|
/* re-group spectrum */
|
||||||
wnd = 0;
|
wnd = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||||
for (j = 0; j < groupLen[grp]; j++) {
|
for (j = 0; j < groupLen[grp]; j++) {
|
||||||
Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
|
Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
|
||||||
for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
|
for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
|
||||||
tmpSpectrum[i] = mdctSpectrum[line];
|
tmpSpectrum[i] = mdctSpectrum[line];
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,10 +179,10 @@ groupShortData(Word32 *mdctSpectrum,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(i=0;i<FRAME_LEN_LONG;i+=4) {
|
for(i=0;i<FRAME_LEN_LONG;i+=4) {
|
||||||
mdctSpectrum[i] = tmpSpectrum[i];
|
mdctSpectrum[i] = tmpSpectrum[i];
|
||||||
mdctSpectrum[i+1] = tmpSpectrum[i+1];
|
mdctSpectrum[i+1] = tmpSpectrum[i+1];
|
||||||
mdctSpectrum[i+2] = tmpSpectrum[i+2];
|
mdctSpectrum[i+2] = tmpSpectrum[i+2];
|
||||||
mdctSpectrum[i+3] = tmpSpectrum[i+3];
|
mdctSpectrum[i+3] = tmpSpectrum[i+3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,56 +49,56 @@ void BuildInterface(Word32 *groupedMdctSpectrum,
|
|||||||
PSY_OUT_CHANNEL *psyOutCh)
|
PSY_OUT_CHANNEL *psyOutCh)
|
||||||
{
|
{
|
||||||
Word32 j;
|
Word32 j;
|
||||||
Word32 grp;
|
Word32 grp;
|
||||||
Word32 mask;
|
Word32 mask;
|
||||||
Word16 *tmpV;
|
Word16 *tmpV;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
copy values to psyOut
|
copy values to psyOut
|
||||||
*/
|
*/
|
||||||
psyOutCh->maxSfbPerGroup = maxSfbPerGroup;
|
psyOutCh->maxSfbPerGroup = maxSfbPerGroup;
|
||||||
psyOutCh->sfbCnt = groupedSfbCnt;
|
psyOutCh->sfbCnt = groupedSfbCnt;
|
||||||
if(noOfGroups)
|
if(noOfGroups)
|
||||||
psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups;
|
psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups;
|
||||||
else
|
else
|
||||||
psyOutCh->sfbPerGroup = 0x7fff;
|
psyOutCh->sfbPerGroup = 0x7fff;
|
||||||
psyOutCh->windowSequence = windowSequence;
|
psyOutCh->windowSequence = windowSequence;
|
||||||
psyOutCh->windowShape = windowShape;
|
psyOutCh->windowShape = windowShape;
|
||||||
psyOutCh->mdctScale = mdctScale;
|
psyOutCh->mdctScale = mdctScale;
|
||||||
psyOutCh->mdctSpectrum = groupedMdctSpectrum;
|
psyOutCh->mdctSpectrum = groupedMdctSpectrum;
|
||||||
psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong;
|
psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong;
|
||||||
psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong;
|
psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong;
|
||||||
psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
|
psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
|
||||||
|
|
||||||
tmpV = psyOutCh->sfbOffsets;
|
tmpV = psyOutCh->sfbOffsets;
|
||||||
for(j=0; j<groupedSfbCnt + 1; j++) {
|
for(j=0; j<groupedSfbCnt + 1; j++) {
|
||||||
*tmpV++ = groupedSfbOffset[j];
|
*tmpV++ = groupedSfbOffset[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpV = psyOutCh->sfbMinSnr;
|
tmpV = psyOutCh->sfbMinSnr;
|
||||||
for(j=0;j<groupedSfbCnt; j++) {
|
for(j=0;j<groupedSfbCnt; j++) {
|
||||||
*tmpV++ = groupedSfbMinSnr[j];
|
*tmpV++ = groupedSfbMinSnr[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate grouping mask */
|
/* generate grouping mask */
|
||||||
mask = 0;
|
mask = 0;
|
||||||
for (grp = 0; grp < noOfGroups; grp++) {
|
for (grp = 0; grp < noOfGroups; grp++) {
|
||||||
mask = mask << 1;
|
mask = mask << 1;
|
||||||
for (j=1; j<groupLen[grp]; j++) {
|
for (j=1; j<groupLen[grp]; j++) {
|
||||||
mask = mask << 1;
|
mask = mask << 1;
|
||||||
mask |= 1;
|
mask |= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
psyOutCh->groupingMask = mask;
|
psyOutCh->groupingMask = mask;
|
||||||
|
|
||||||
if (windowSequence != SHORT_WINDOW) {
|
if (windowSequence != SHORT_WINDOW) {
|
||||||
psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
|
psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
|
||||||
psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
|
psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Word32 i;
|
Word32 i;
|
||||||
Word32 accuSumMS=0;
|
Word32 accuSumMS=0;
|
||||||
Word32 accuSumLR=0;
|
Word32 accuSumLR=0;
|
||||||
Word32 *pSumMS = sfbEnergySumMS.sfbShort;
|
Word32 *pSumMS = sfbEnergySumMS.sfbShort;
|
||||||
Word32 *pSumLR = sfbEnergySumLR.sfbShort;
|
Word32 *pSumLR = sfbEnergySumLR.sfbShort;
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ void BuildInterface(Word32 *groupedMdctSpectrum,
|
|||||||
accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
|
accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
|
||||||
accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
|
accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
|
||||||
}
|
}
|
||||||
psyOutCh->sfbEnSumMS = accuSumMS;
|
psyOutCh->sfbEnSumMS = accuSumMS;
|
||||||
psyOutCh->sfbEnSumLR = accuSumLR;
|
psyOutCh->sfbEnSumLR = accuSumLR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,20 +45,20 @@ void prepareSfbPe(PE_DATA *peData,
|
|||||||
const Word16 peOffset)
|
const Word16 peOffset)
|
||||||
{
|
{
|
||||||
Word32 sfbGrp, sfb;
|
Word32 sfbGrp, sfb;
|
||||||
Word32 ch;
|
Word32 ch;
|
||||||
|
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch];
|
PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch];
|
||||||
for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){
|
for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
|
peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
|
||||||
sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
|
sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
|
||||||
peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb];
|
peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
peData->offset = peOffset;
|
peData->offset = peOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -78,23 +78,23 @@ void calcSfbPe(PE_DATA *peData,
|
|||||||
Word32 ldThr, ldRatio;
|
Word32 ldThr, ldRatio;
|
||||||
Word32 pe, constPart, nActiveLines;
|
Word32 pe, constPart, nActiveLines;
|
||||||
|
|
||||||
peData->pe = peData->offset;
|
peData->pe = peData->offset;
|
||||||
peData->constPart = 0;
|
peData->constPart = 0;
|
||||||
peData->nActiveLines = 0;
|
peData->nActiveLines = 0;
|
||||||
for(ch=0; ch<nChannels; ch++) {
|
for(ch=0; ch<nChannels; ch++) {
|
||||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||||
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
|
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
|
||||||
const Word32 *sfbEnergy = psyOutChan->sfbEnergy;
|
const Word32 *sfbEnergy = psyOutChan->sfbEnergy;
|
||||||
const Word32 *sfbThreshold = psyOutChan->sfbThreshold;
|
const Word32 *sfbThreshold = psyOutChan->sfbThreshold;
|
||||||
|
|
||||||
pe = 0;
|
pe = 0;
|
||||||
constPart = 0;
|
constPart = 0;
|
||||||
nActiveLines = 0;
|
nActiveLines = 0;
|
||||||
|
|
||||||
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
|
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
Word32 nrg = sfbEnergy[sfbGrp+sfb];
|
Word32 nrg = sfbEnergy[sfbGrp+sfb];
|
||||||
Word32 thres = sfbThreshold[sfbGrp+sfb];
|
Word32 thres = sfbThreshold[sfbGrp+sfb];
|
||||||
Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
|
Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
|
||||||
|
|
||||||
if (nrg > thres) {
|
if (nrg > thres) {
|
||||||
@@ -102,8 +102,8 @@ void calcSfbPe(PE_DATA *peData,
|
|||||||
|
|
||||||
ldRatio = sfbLDEn - ldThr;
|
ldRatio = sfbLDEn - ldThr;
|
||||||
|
|
||||||
nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
|
nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
|
||||||
|
|
||||||
/* sfbPe = nl*log2(en/thr)*/
|
/* sfbPe = nl*log2(en/thr)*/
|
||||||
if (ldRatio >= C1_I) {
|
if (ldRatio >= C1_I) {
|
||||||
peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
|
peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
|
||||||
@@ -120,26 +120,26 @@ void calcSfbPe(PE_DATA *peData,
|
|||||||
peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
|
peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
peChanData->sfbPe[sfbGrp+sfb] = 0;
|
peChanData->sfbPe[sfbGrp+sfb] = 0;
|
||||||
peChanData->sfbConstPart[sfbGrp+sfb] = 0;
|
peChanData->sfbConstPart[sfbGrp+sfb] = 0;
|
||||||
peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
|
peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
|
||||||
}
|
}
|
||||||
pe = pe + peChanData->sfbPe[sfbGrp+sfb];
|
pe = pe + peChanData->sfbPe[sfbGrp+sfb];
|
||||||
constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb];
|
constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb];
|
||||||
nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
|
nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
peChanData->pe = saturate(pe);
|
|
||||||
peChanData->constPart = saturate(constPart);
|
|
||||||
peChanData->nActiveLines = saturate(nActiveLines);
|
|
||||||
|
|
||||||
|
peChanData->pe = saturate(pe);
|
||||||
|
peChanData->constPart = saturate(constPart);
|
||||||
|
peChanData->nActiveLines = saturate(nActiveLines);
|
||||||
|
|
||||||
|
|
||||||
pe += peData->pe;
|
pe += peData->pe;
|
||||||
peData->pe = saturate(pe);
|
peData->pe = saturate(pe);
|
||||||
constPart += peData->constPart;
|
constPart += peData->constPart;
|
||||||
peData->constPart = saturate(constPart);
|
peData->constPart = saturate(constPart);
|
||||||
nActiveLines += peData->nActiveLines;
|
nActiveLines += peData->nActiveLines;
|
||||||
peData->nActiveLines = saturate(nActiveLines);
|
peData->nActiveLines = saturate(nActiveLines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name: mem_malloc
|
* function name: mem_malloc
|
||||||
* description: malloc the alignments memory
|
* description: malloc the alignments memory
|
||||||
* returns: the point of the memory
|
* returns: the point of the memory
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
*
|
*
|
||||||
* function name: MsStereoProcessing
|
* function name: MsStereoProcessing
|
||||||
* description: detect use ms stereo or not
|
* description: detect use ms stereo or not
|
||||||
* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn))
|
* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn))
|
||||||
* >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo
|
* >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
@@ -51,7 +51,7 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
|||||||
const Word16 maxSfbPerGroup,
|
const Word16 maxSfbPerGroup,
|
||||||
const Word16 *sfbOffset) {
|
const Word16 *sfbOffset) {
|
||||||
Word32 temp;
|
Word32 temp;
|
||||||
Word32 sfb,sfboffs, j;
|
Word32 sfb,sfboffs, j;
|
||||||
Word32 msMaskTrueSomewhere = 0;
|
Word32 msMaskTrueSomewhere = 0;
|
||||||
Word32 msMaskFalseSomewhere = 0;
|
Word32 msMaskFalseSomewhere = 0;
|
||||||
|
|
||||||
@@ -64,12 +64,12 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
|||||||
Word32 thrL, thrR, nrgL, nrgR;
|
Word32 thrL, thrR, nrgL, nrgR;
|
||||||
Word32 idx, shift;
|
Word32 idx, shift;
|
||||||
|
|
||||||
idx = sfb + sfboffs;
|
idx = sfb + sfboffs;
|
||||||
|
|
||||||
thrL = sfbThresholdLeft[idx];
|
thrL = sfbThresholdLeft[idx];
|
||||||
thrR = sfbThresholdRight[idx];
|
thrR = sfbThresholdRight[idx];
|
||||||
nrgL = sfbEnergyLeft[idx];
|
nrgL = sfbEnergyLeft[idx];
|
||||||
nrgR = sfbEnergyRight[idx];
|
nrgR = sfbEnergyRight[idx];
|
||||||
|
|
||||||
minThreshold = min(thrL, thrR);
|
minThreshold = min(thrL, thrR);
|
||||||
|
|
||||||
@@ -82,8 +82,8 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
|||||||
|
|
||||||
pnlr = fixmul(nrgL, nrgR);
|
pnlr = fixmul(nrgL, nrgR);
|
||||||
|
|
||||||
nrgL = sfbEnergyMid[idx];
|
nrgL = sfbEnergyMid[idx];
|
||||||
nrgR = sfbEnergySide[idx];
|
nrgR = sfbEnergySide[idx];
|
||||||
|
|
||||||
nrgL = max(nrgL,minThreshold) + 1;
|
nrgL = max(nrgL,minThreshold) + 1;
|
||||||
shift = norm_l(nrgL);
|
shift = norm_l(nrgL);
|
||||||
@@ -97,42 +97,42 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
|||||||
|
|
||||||
temp = (pnlr + 1) / ((pnms >> 8) + 1);
|
temp = (pnlr + 1) / ((pnms >> 8) + 1);
|
||||||
|
|
||||||
temp = pnms - pnlr;
|
temp = pnms - pnlr;
|
||||||
if( temp > 0 ){
|
if( temp > 0 ){
|
||||||
|
|
||||||
msMask[idx] = 1;
|
msMask[idx] = 1;
|
||||||
msMaskTrueSomewhere = 1;
|
msMaskTrueSomewhere = 1;
|
||||||
|
|
||||||
for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) {
|
for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) {
|
||||||
Word32 left, right;
|
Word32 left, right;
|
||||||
left = (mdctSpectrumLeft[j] >> 1);
|
left = (mdctSpectrumLeft[j] >> 1);
|
||||||
right = (mdctSpectrumRight[j] >> 1);
|
right = (mdctSpectrumRight[j] >> 1);
|
||||||
mdctSpectrumLeft[j] = left + right;
|
mdctSpectrumLeft[j] = left + right;
|
||||||
mdctSpectrumRight[j] = left - right;
|
mdctSpectrumRight[j] = left - right;
|
||||||
}
|
}
|
||||||
|
|
||||||
sfbThresholdLeft[idx] = minThreshold;
|
|
||||||
sfbThresholdRight[idx] = minThreshold;
|
|
||||||
sfbEnergyLeft[idx] = sfbEnergyMid[idx];
|
|
||||||
sfbEnergyRight[idx] = sfbEnergySide[idx];
|
|
||||||
|
|
||||||
sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1;
|
sfbThresholdLeft[idx] = minThreshold;
|
||||||
sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx];
|
sfbThresholdRight[idx] = minThreshold;
|
||||||
|
sfbEnergyLeft[idx] = sfbEnergyMid[idx];
|
||||||
|
sfbEnergyRight[idx] = sfbEnergySide[idx];
|
||||||
|
|
||||||
|
sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1;
|
||||||
|
sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx];
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msMask[idx] = 0;
|
msMask[idx] = 0;
|
||||||
msMaskFalseSomewhere = 1;
|
msMaskFalseSomewhere = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( msMaskTrueSomewhere ) {
|
if ( msMaskTrueSomewhere ) {
|
||||||
if(msMaskFalseSomewhere ) {
|
if(msMaskFalseSomewhere ) {
|
||||||
*msDigest = SI_MS_MASK_SOME;
|
*msDigest = SI_MS_MASK_SOME;
|
||||||
} else {
|
} else {
|
||||||
*msDigest = SI_MS_MASK_ALL;
|
*msDigest = SI_MS_MASK_ALL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*msDigest = SI_MS_MASK_NONE;
|
*msDigest = SI_MS_MASK_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:InitPreEchoControl
|
* function name:InitPreEchoControl
|
||||||
* description: init pre echo control parameter
|
* description: init pre echo control parameter
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@@ -40,13 +40,13 @@ void InitPreEchoControl(Word32 *pbThresholdNm1,
|
|||||||
Word16 pb;
|
Word16 pb;
|
||||||
|
|
||||||
for(pb=0; pb<numPb; pb++) {
|
for(pb=0; pb<numPb; pb++) {
|
||||||
pbThresholdNm1[pb] = pbThresholdQuiet[pb];
|
pbThresholdNm1[pb] = pbThresholdQuiet[pb];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:PreEchoControl
|
* function name:PreEchoControl
|
||||||
* description: update shreshold to avoid pre echo
|
* description: update shreshold to avoid pre echo
|
||||||
* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n)))
|
* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n)))
|
||||||
*
|
*
|
||||||
@@ -68,22 +68,22 @@ void PreEchoControl(Word32 *pbThresholdNm1,
|
|||||||
(void)maxAllowedIncreaseFactor;
|
(void)maxAllowedIncreaseFactor;
|
||||||
|
|
||||||
scaling = ((mdctScale - mdctScalenm1) << 1);
|
scaling = ((mdctScale - mdctScalenm1) << 1);
|
||||||
|
|
||||||
if ( scaling > 0 ) {
|
if ( scaling > 0 ) {
|
||||||
for(i = 0; i < numPb; i++) {
|
for(i = 0; i < numPb; i++) {
|
||||||
tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1);
|
tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1);
|
||||||
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
|
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
|
||||||
|
|
||||||
/* copy thresholds to internal memory */
|
/* copy thresholds to internal memory */
|
||||||
pbThresholdNm1[i] = pbThreshold[i];
|
pbThresholdNm1[i] = pbThreshold[i];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(pbThreshold[i] > tmpThreshold1) {
|
if(pbThreshold[i] > tmpThreshold1) {
|
||||||
pbThreshold[i] = tmpThreshold1;
|
pbThreshold[i] = tmpThreshold1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tmpThreshold2 > pbThreshold[i]) {
|
if(tmpThreshold2 > pbThreshold[i]) {
|
||||||
pbThreshold[i] = tmpThreshold2;
|
pbThreshold[i] = tmpThreshold2;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -96,15 +96,15 @@ void PreEchoControl(Word32 *pbThresholdNm1,
|
|||||||
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
|
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
|
||||||
|
|
||||||
/* copy thresholds to internal memory */
|
/* copy thresholds to internal memory */
|
||||||
pbThresholdNm1[i] = pbThreshold[i];
|
pbThresholdNm1[i] = pbThreshold[i];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(((pbThreshold[i] >> scaling) > tmpThreshold1)) {
|
if(((pbThreshold[i] >> scaling) > tmpThreshold1)) {
|
||||||
pbThreshold[i] = tmpThreshold1 << scaling;
|
pbThreshold[i] = tmpThreshold1 << scaling;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tmpThreshold2 > pbThreshold[i]) {
|
if(tmpThreshold2 > pbThreshold[i]) {
|
||||||
pbThreshold[i] = tmpThreshold2;
|
pbThreshold[i] = tmpThreshold2;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,17 +88,17 @@ Word32 GetSRIndex(Word32 sampleRate)
|
|||||||
*
|
*
|
||||||
* function name: atan_1000
|
* function name: atan_1000
|
||||||
* description: calculates 1000*atan(x/1000)
|
* description: calculates 1000*atan(x/1000)
|
||||||
* based on atan approx for x > 0
|
* based on atan approx for x > 0
|
||||||
* atan(x) = x/((float)1.0f+(float)0.280872f*x*x) if x < 1
|
* atan(x) = x/((float)1.0f+(float)0.280872f*x*x) if x < 1
|
||||||
* = pi/2 - x/((float)0.280872f +x*x) if x >= 1
|
* = pi/2 - x/((float)0.280872f +x*x) if x >= 1
|
||||||
* return: 1000*atan(x/1000)
|
* return: 1000*atan(x/1000)
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static Word16 atan_1000(Word32 val)
|
static Word16 atan_1000(Word32 val)
|
||||||
{
|
{
|
||||||
Word32 y;
|
Word32 y;
|
||||||
|
|
||||||
|
|
||||||
if(L_sub(val, 1000) < 0) {
|
if(L_sub(val, 1000) < 0) {
|
||||||
y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1))));
|
y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1))));
|
||||||
}
|
}
|
||||||
@@ -126,9 +126,9 @@ static Word16 BarcLineValue(Word16 noOfLines, Word16 fftLine, Word32 samplingFre
|
|||||||
/* center frequency of fft line */
|
/* center frequency of fft line */
|
||||||
center_freq = (fftLine * samplingFreq) / (noOfLines << 1);
|
center_freq = (fftLine * samplingFreq) / (noOfLines << 1);
|
||||||
temp = atan_1000((center_freq << 2) / (3*10));
|
temp = atan_1000((center_freq << 2) / (3*10));
|
||||||
bvalFFTLine =
|
bvalFFTLine =
|
||||||
(26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE);
|
(26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE);
|
||||||
|
|
||||||
return saturate(bvalFFTLine);
|
return saturate(bvalFFTLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,17 +148,17 @@ static void initThrQuiet(Word16 numPb,
|
|||||||
for(i=0; i<numPb; i++) {
|
for(i=0; i<numPb; i++) {
|
||||||
Word16 bv1, bv2;
|
Word16 bv1, bv2;
|
||||||
|
|
||||||
|
|
||||||
if (i>0)
|
if (i>0)
|
||||||
bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1;
|
bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1;
|
||||||
else
|
else
|
||||||
bv1 = pbBarcVal[i] >> 1;
|
bv1 = pbBarcVal[i] >> 1;
|
||||||
|
|
||||||
|
|
||||||
if (i < (numPb - 1))
|
if (i < (numPb - 1))
|
||||||
bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1;
|
bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1;
|
||||||
else {
|
else {
|
||||||
bv2 = pbBarcVal[i];
|
bv2 = pbBarcVal[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
bv1 = min((bv1 / BARC_SCALE), max_bark);
|
bv1 = min((bv1 / BARC_SCALE), max_bark);
|
||||||
@@ -166,9 +166,9 @@ static void initThrQuiet(Word16 numPb,
|
|||||||
|
|
||||||
barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]);
|
barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
we calculate
|
we calculate
|
||||||
pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]);
|
pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -196,47 +196,47 @@ static void initSpreading(Word16 numPb,
|
|||||||
Word16 i;
|
Word16 i;
|
||||||
Word16 maskLowSprEn, maskHighSprEn;
|
Word16 maskLowSprEn, maskHighSprEn;
|
||||||
|
|
||||||
|
|
||||||
if (sub(blockType, SHORT_WINDOW) != 0) {
|
if (sub(blockType, SHORT_WINDOW) != 0) {
|
||||||
maskLowSprEn = maskLowSprEnLong;
|
maskLowSprEn = maskLowSprEnLong;
|
||||||
|
|
||||||
if (bitrate > 22000)
|
if (bitrate > 22000)
|
||||||
maskHighSprEn = maskHighSprEnLong;
|
maskHighSprEn = maskHighSprEnLong;
|
||||||
else
|
else
|
||||||
maskHighSprEn = maskHighSprEnLongLowBr;
|
maskHighSprEn = maskHighSprEnLongLowBr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
maskLowSprEn = maskLowSprEnShort;
|
maskLowSprEn = maskLowSprEnShort;
|
||||||
maskHighSprEn = maskHighSprEnShort;
|
maskHighSprEn = maskHighSprEnShort;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0; i<numPb; i++) {
|
for(i=0; i<numPb; i++) {
|
||||||
|
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
Word32 dbVal;
|
Word32 dbVal;
|
||||||
Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1];
|
Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE)
|
we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE)
|
||||||
*/
|
*/
|
||||||
dbVal = (maskHigh * dbark);
|
dbVal = (maskHigh * dbark);
|
||||||
pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */
|
pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */
|
||||||
|
|
||||||
dbVal = (maskLow * dbark);
|
dbVal = (maskLow * dbark);
|
||||||
pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
||||||
|
|
||||||
|
|
||||||
dbVal = (maskHighSprEn * dbark);
|
dbVal = (maskHighSprEn * dbark);
|
||||||
pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
||||||
dbVal = (maskLowSprEn * dbark);
|
dbVal = (maskLowSprEn * dbark);
|
||||||
pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pbMaskHiFactor[i] = 0;
|
pbMaskHiFactor[i] = 0;
|
||||||
pbMaskLoFactor[numPb-1] = 0;
|
pbMaskLoFactor[numPb-1] = 0;
|
||||||
|
|
||||||
pbMaskHiFactorSprEn[i] = 0;
|
pbMaskHiFactorSprEn[i] = 0;
|
||||||
pbMaskLoFactorSprEn[numPb-1] = 0;
|
pbMaskLoFactorSprEn[numPb-1] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,12 +258,12 @@ static void initBarcValues(Word16 numPb,
|
|||||||
Word16 i;
|
Word16 i;
|
||||||
Word16 pbBval0, pbBval1;
|
Word16 pbBval0, pbBval1;
|
||||||
|
|
||||||
pbBval0 = 0;
|
pbBval0 = 0;
|
||||||
|
|
||||||
for(i=0; i<numPb; i++){
|
for(i=0; i<numPb; i++){
|
||||||
pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
|
pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
|
||||||
pbBval[i] = (pbBval0 + pbBval1) >> 1;
|
pbBval[i] = (pbBval0 + pbBval1) >> 1;
|
||||||
pbBval0 = pbBval1;
|
pbBval0 = pbBval1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,38 +295,38 @@ static void initMinSnr(const Word32 bitrate,
|
|||||||
|
|
||||||
pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate));
|
pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate));
|
||||||
|
|
||||||
pbVal0 = 0;
|
pbVal0 = 0;
|
||||||
|
|
||||||
for (sfb=0; sfb<sfbActive; sfb++) {
|
for (sfb=0; sfb<sfbActive; sfb++) {
|
||||||
|
|
||||||
pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
|
pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
|
||||||
barcWidth = pbVal1 - pbVal0;
|
barcWidth = pbVal1 - pbVal0;
|
||||||
pbVal0 = pbVal1;
|
pbVal0 = pbVal1;
|
||||||
|
|
||||||
/* allow at least 2.4% of pe for each active barc */
|
/* allow at least 2.4% of pe for each active barc */
|
||||||
pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
|
pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
|
||||||
(pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
|
(pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
|
||||||
|
|
||||||
|
|
||||||
pePart = min(pePart, 8400);
|
pePart = min(pePart, 8400);
|
||||||
pePart = max(pePart, 1400);
|
pePart = max(pePart, 1400);
|
||||||
|
|
||||||
/* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
|
/* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
|
||||||
/* we add an offset of 2^16 to the pow functions */
|
/* we add an offset of 2^16 to the pow functions */
|
||||||
/* 0xc000 = 1.5*(1 << 15)*/
|
/* 0xc000 = 1.5*(1 << 15)*/
|
||||||
|
|
||||||
snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
|
snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
|
||||||
|
|
||||||
if(snr > 0x00008000)
|
if(snr > 0x00008000)
|
||||||
{
|
{
|
||||||
shift = norm_l(snr);
|
shift = norm_l(snr);
|
||||||
snr = Div_32(0x00008000 << shift, snr << shift);
|
snr = Div_32(0x00008000 << shift, snr << shift);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
snr = 0x7fffffff;
|
snr = 0x7fffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* upper limit is -1 dB */
|
/* upper limit is -1 dB */
|
||||||
snr = min(snr, c_maxsnr);
|
snr = min(snr, c_maxsnr);
|
||||||
/* lower limit is -25 dB */
|
/* lower limit is -25 dB */
|
||||||
@@ -354,7 +354,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
|
|||||||
/*
|
/*
|
||||||
init sfb table
|
init sfb table
|
||||||
*/
|
*/
|
||||||
samplerateindex = GetSRIndex(samplerate);
|
samplerateindex = GetSRIndex(samplerate);
|
||||||
psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
|
psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
|
||||||
psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
|
psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
|
||||||
psyConf->sampRateIdx = samplerateindex;
|
psyConf->sampRateIdx = samplerateindex;
|
||||||
@@ -391,19 +391,19 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
|
|||||||
/*
|
/*
|
||||||
init ratio
|
init ratio
|
||||||
*/
|
*/
|
||||||
psyConf->ratio = c_ratio;
|
psyConf->ratio = c_ratio;
|
||||||
|
|
||||||
psyConf->maxAllowedIncreaseFactor = 2;
|
psyConf->maxAllowedIncreaseFactor = 2;
|
||||||
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/
|
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/
|
||||||
|
|
||||||
psyConf->clipEnergy = c_maxClipEnergyLong;
|
psyConf->clipEnergy = c_maxClipEnergyLong;
|
||||||
psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate);
|
psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate);
|
||||||
|
|
||||||
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
|
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
|
||||||
if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0)
|
if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
psyConf->sfbActive = sfb;
|
psyConf->sfbActive = sfb;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
calculate minSnr
|
calculate minSnr
|
||||||
@@ -429,7 +429,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
|
|||||||
Word16 InitPsyConfigurationShort(Word32 bitrate,
|
Word16 InitPsyConfigurationShort(Word32 bitrate,
|
||||||
Word32 samplerate,
|
Word32 samplerate,
|
||||||
Word16 bandwidth,
|
Word16 bandwidth,
|
||||||
PSY_CONFIGURATION_SHORT *psyConf)
|
PSY_CONFIGURATION_SHORT *psyConf)
|
||||||
{
|
{
|
||||||
Word32 samplerateindex;
|
Word32 samplerateindex;
|
||||||
Word16 sfbBarcVal[MAX_SFB_SHORT];
|
Word16 sfbBarcVal[MAX_SFB_SHORT];
|
||||||
@@ -437,7 +437,7 @@ Word16 InitPsyConfigurationShort(Word32 bitrate,
|
|||||||
/*
|
/*
|
||||||
init sfb table
|
init sfb table
|
||||||
*/
|
*/
|
||||||
samplerateindex = GetSRIndex(samplerate);
|
samplerateindex = GetSRIndex(samplerate);
|
||||||
psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
|
psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
|
||||||
psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
|
psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
|
||||||
psyConf->sampRateIdx = samplerateindex;
|
psyConf->sampRateIdx = samplerateindex;
|
||||||
@@ -473,21 +473,21 @@ Word16 InitPsyConfigurationShort(Word32 bitrate,
|
|||||||
/*
|
/*
|
||||||
init ratio
|
init ratio
|
||||||
*/
|
*/
|
||||||
psyConf->ratio = c_ratio;
|
psyConf->ratio = c_ratio;
|
||||||
|
|
||||||
psyConf->maxAllowedIncreaseFactor = 2;
|
psyConf->maxAllowedIncreaseFactor = 2;
|
||||||
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
|
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
|
||||||
|
|
||||||
psyConf->clipEnergy = c_maxClipEnergyShort;
|
psyConf->clipEnergy = c_maxClipEnergyShort;
|
||||||
|
|
||||||
psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate);
|
psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate);
|
||||||
|
|
||||||
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
|
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
|
||||||
|
|
||||||
if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)
|
if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
psyConf->sfbActive = sfb;
|
psyConf->sfbActive = sfb;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
calculate minSnr
|
calculate minSnr
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
|
|||||||
Word32 *mdctSpectrum;
|
Word32 *mdctSpectrum;
|
||||||
Word32 *scratchTNS;
|
Word32 *scratchTNS;
|
||||||
Word16 *mdctDelayBuffer;
|
Word16 *mdctDelayBuffer;
|
||||||
|
|
||||||
mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
|
mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
|
||||||
if(NULL == mdctSpectrum)
|
if(NULL == mdctSpectrum)
|
||||||
return 1;
|
return 1;
|
||||||
@@ -99,7 +99,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<nChan; i++){
|
for (i=0; i<nChan; i++){
|
||||||
hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET;
|
hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET;
|
||||||
hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG;
|
hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,12 +124,12 @@ Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP)
|
|||||||
{
|
{
|
||||||
if(hPsy->psyData[0].mdctDelayBuffer)
|
if(hPsy->psyData[0].mdctDelayBuffer)
|
||||||
mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
|
mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
|
||||||
|
|
||||||
if(hPsy->psyData[0].mdctSpectrum)
|
if(hPsy->psyData[0].mdctSpectrum)
|
||||||
mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
|
mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
|
||||||
|
|
||||||
for (nch=0; nch<MAX_CHANNELS; nch++){
|
for (nch=0; nch<MAX_CHANNELS; nch++){
|
||||||
hPsy->psyData[nch].mdctDelayBuffer = NULL;
|
hPsy->psyData[nch].mdctDelayBuffer = NULL;
|
||||||
hPsy->psyData[nch].mdctSpectrum = NULL;
|
hPsy->psyData[nch].mdctSpectrum = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,14 +216,14 @@ Word16 psyMainInit(PSY_KERNEL *hPsy,
|
|||||||
|
|
||||||
if (!err)
|
if (!err)
|
||||||
for(ch=0;ch < channels;ch++){
|
for(ch=0;ch < channels;ch++){
|
||||||
|
|
||||||
InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl,
|
InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl,
|
||||||
bitRate, channels);
|
bitRate, channels);
|
||||||
|
|
||||||
InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1,
|
InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1,
|
||||||
hPsy->psyConfLong.sfbCnt,
|
hPsy->psyConfLong.sfbCnt,
|
||||||
hPsy->psyConfLong.sfbThresholdQuiet);
|
hPsy->psyConfLong.sfbThresholdQuiet);
|
||||||
hPsy->psyData[ch].mdctScalenm1 = 0;
|
hPsy->psyData[ch].mdctScalenm1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(err);
|
return(err);
|
||||||
@@ -241,7 +241,7 @@ Word16 psyMainInit(PSY_KERNEL *hPsy,
|
|||||||
|
|
||||||
Word16 psyMain(Word16 nChannels,
|
Word16 psyMain(Word16 nChannels,
|
||||||
ELEMENT_INFO *elemInfo,
|
ELEMENT_INFO *elemInfo,
|
||||||
Word16 *timeSignal,
|
Word16 *timeSignal,
|
||||||
PSY_DATA psyData[MAX_CHANNELS],
|
PSY_DATA psyData[MAX_CHANNELS],
|
||||||
TNS_DATA tnsData[MAX_CHANNELS],
|
TNS_DATA tnsData[MAX_CHANNELS],
|
||||||
PSY_CONFIGURATION_LONG *hPsyConfLong,
|
PSY_CONFIGURATION_LONG *hPsyConfLong,
|
||||||
@@ -260,8 +260,8 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
Word16 channels;
|
Word16 channels;
|
||||||
Word16 maxScale;
|
Word16 maxScale;
|
||||||
|
|
||||||
channels = elemInfo->nChannelsInEl;
|
channels = elemInfo->nChannelsInEl;
|
||||||
maxScale = 0;
|
maxScale = 0;
|
||||||
|
|
||||||
/* block switching */
|
/* block switching */
|
||||||
for(ch = 0; ch < channels; ch++) {
|
for(ch = 0; ch < channels; ch++) {
|
||||||
@@ -291,7 +291,7 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
/* common scaling for all channels */
|
/* common scaling for all channels */
|
||||||
for (ch=0; ch<channels; ch++) {
|
for (ch=0; ch<channels; ch++) {
|
||||||
Word16 scaleDiff = maxScale - mdctScalingArray[ch];
|
Word16 scaleDiff = maxScale - mdctScalingArray[ch];
|
||||||
|
|
||||||
if (scaleDiff > 0) {
|
if (scaleDiff > 0) {
|
||||||
Word32 *Spectrum = psyData[ch].mdctSpectrum;
|
Word32 *Spectrum = psyData[ch].mdctSpectrum;
|
||||||
for(line=0; line<FRAME_LEN_LONG; line++) {
|
for(line=0; line<FRAME_LEN_LONG; line++) {
|
||||||
@@ -299,11 +299,11 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
Spectrum++;
|
Spectrum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
psyData[ch].mdctScale = maxScale;
|
psyData[ch].mdctScale = maxScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ch=0; ch<channels; ch++) {
|
for (ch=0; ch<channels; ch++) {
|
||||||
|
|
||||||
if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) {
|
if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) {
|
||||||
/* update long block parameter */
|
/* update long block parameter */
|
||||||
advancePsychLong(&psyData[ch],
|
advancePsychLong(&psyData[ch],
|
||||||
@@ -317,7 +317,7 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
/* determine maxSfb */
|
/* determine maxSfb */
|
||||||
for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) {
|
for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) {
|
||||||
for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) {
|
for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) {
|
||||||
|
|
||||||
if (psyData[ch].mdctSpectrum[line] != 0) break;
|
if (psyData[ch].mdctSpectrum[line] != 0) break;
|
||||||
}
|
}
|
||||||
if (line >= hPsyConfLong->sfbOffset[sfb]) break;
|
if (line >= hPsyConfLong->sfbOffset[sfb]) break;
|
||||||
@@ -326,7 +326,7 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
|
|
||||||
/* Calc bandwise energies for mid and side channel
|
/* Calc bandwise energies for mid and side channel
|
||||||
Do it only if 2 channels exist */
|
Do it only if 2 channels exist */
|
||||||
|
|
||||||
if (ch == 1)
|
if (ch == 1)
|
||||||
advancePsychLongMS(psyData, hPsyConfLong);
|
advancePsychLongMS(psyData, hPsyConfLong);
|
||||||
}
|
}
|
||||||
@@ -341,7 +341,7 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
|
|
||||||
/* Calc bandwise energies for mid and side channel
|
/* Calc bandwise energies for mid and side channel
|
||||||
Do it only if 2 channels exist */
|
Do it only if 2 channels exist */
|
||||||
|
|
||||||
if (ch == 1)
|
if (ch == 1)
|
||||||
advancePsychShortMS (psyData, hPsyConfShort);
|
advancePsychShortMS (psyData, hPsyConfShort);
|
||||||
}
|
}
|
||||||
@@ -349,7 +349,7 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
|
|
||||||
/* group short data */
|
/* group short data */
|
||||||
for(ch=0; ch<channels; ch++) {
|
for(ch=0; ch<channels; ch++) {
|
||||||
|
|
||||||
if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) {
|
if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) {
|
||||||
groupShortData(psyData[ch].mdctSpectrum,
|
groupShortData(psyData[ch].mdctSpectrum,
|
||||||
pScratchTns,
|
pScratchTns,
|
||||||
@@ -374,10 +374,10 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
stereo Processing
|
stereo Processing
|
||||||
*/
|
*/
|
||||||
if (channels == 2) {
|
if (channels == 2) {
|
||||||
psyOutElement->toolsInfo.msDigest = MS_NONE;
|
psyOutElement->toolsInfo.msDigest = MS_NONE;
|
||||||
maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]);
|
maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]);
|
||||||
|
|
||||||
|
|
||||||
if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW)
|
if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW)
|
||||||
MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
|
MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
|
||||||
psyData[1].sfbEnergy.sfbLong,
|
psyData[1].sfbEnergy.sfbLong,
|
||||||
@@ -420,7 +420,7 @@ Word16 psyMain(Word16 nChannels,
|
|||||||
build output
|
build output
|
||||||
*/
|
*/
|
||||||
for(ch=0;ch<channels;ch++) {
|
for(ch=0;ch<channels;ch++) {
|
||||||
|
|
||||||
if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW)
|
if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW)
|
||||||
BuildInterface(psyData[ch].mdctSpectrum,
|
BuildInterface(psyData[ch].mdctSpectrum,
|
||||||
psyData[ch].mdctScale,
|
psyData[ch].mdctScale,
|
||||||
@@ -483,7 +483,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
/* low pass */
|
/* low pass */
|
||||||
data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
|
data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
|
||||||
for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
|
for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
|
||||||
*data0++ = 0;
|
*data0++ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calc sfb-bandwise mdct-energies for left and right channel */
|
/* Calc sfb-bandwise mdct-energies for left and right channel */
|
||||||
@@ -505,7 +505,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
psyData->blockSwitchingControl.windowSequence,
|
psyData->blockSwitchingControl.windowSequence,
|
||||||
psyData->sfbEnergy.sfbLong);
|
psyData->sfbEnergy.sfbLong);
|
||||||
|
|
||||||
/* TnsSync */
|
/* TnsSync */
|
||||||
if (ch == 1) {
|
if (ch == 1) {
|
||||||
TnsSync(tnsData,
|
TnsSync(tnsData,
|
||||||
tnsData2,
|
tnsData2,
|
||||||
@@ -514,7 +514,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
psyData->blockSwitchingControl.windowSequence);
|
psyData->blockSwitchingControl.windowSequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tns Encoder */
|
/* Tns Encoder */
|
||||||
TnsEncode(&psyOutChannel->tnsInfo,
|
TnsEncode(&psyOutChannel->tnsInfo,
|
||||||
tnsData,
|
tnsData,
|
||||||
hPsyConfLong->sfbCnt,
|
hPsyConfLong->sfbCnt,
|
||||||
@@ -532,15 +532,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
*data1++ = min(tdata, clipEnergy);
|
*data1++ = min(tdata, clipEnergy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calc sfb-bandwise mdct-energies for left and right channel again */
|
/* Calc sfb-bandwise mdct-energies for left and right channel again */
|
||||||
if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) {
|
if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) {
|
||||||
Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand;
|
Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand;
|
||||||
CalcBandEnergy( psyData->mdctSpectrum,
|
CalcBandEnergy( psyData->mdctSpectrum,
|
||||||
hPsyConfLong->sfbOffset+tnsStartBand,
|
hPsyConfLong->sfbOffset+tnsStartBand,
|
||||||
hPsyConfLong->sfbActive - tnsStartBand,
|
hPsyConfLong->sfbActive - tnsStartBand,
|
||||||
psyData->sfbEnergy.sfbLong+tnsStartBand,
|
psyData->sfbEnergy.sfbLong+tnsStartBand,
|
||||||
&psyData->sfbEnergySum.sfbLong);
|
&psyData->sfbEnergySum.sfbLong);
|
||||||
|
|
||||||
data0 = psyData->sfbEnergy.sfbLong;
|
data0 = psyData->sfbEnergy.sfbLong;
|
||||||
tdata = psyData->sfbEnergySum.sfbLong;
|
tdata = psyData->sfbEnergySum.sfbLong;
|
||||||
for (i=0; i<tnsStartBand; i++)
|
for (i=0; i<tnsStartBand; i++)
|
||||||
@@ -565,13 +565,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
data0++; data1++;
|
data0++; data1++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* preecho control */
|
/* preecho control */
|
||||||
if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
|
if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
|
||||||
data0 = psyData->sfbThresholdnm1;
|
data0 = psyData->sfbThresholdnm1;
|
||||||
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
||||||
*data0++ = MAX_32;
|
*data0++ = MAX_32;
|
||||||
}
|
}
|
||||||
psyData->mdctScalenm1 = 0;
|
psyData->mdctScalenm1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PreEchoControl( psyData->sfbThresholdnm1,
|
PreEchoControl( psyData->sfbThresholdnm1,
|
||||||
@@ -581,15 +581,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
psyData->sfbThreshold.sfbLong,
|
psyData->sfbThreshold.sfbLong,
|
||||||
psyData->mdctScale,
|
psyData->mdctScale,
|
||||||
psyData->mdctScalenm1);
|
psyData->mdctScalenm1);
|
||||||
psyData->mdctScalenm1 = psyData->mdctScale;
|
psyData->mdctScalenm1 = psyData->mdctScale;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
|
if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
|
||||||
data0 = psyData->sfbThresholdnm1;
|
data0 = psyData->sfbThresholdnm1;
|
||||||
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
||||||
*data0++ = MAX_32;
|
*data0++ = MAX_32;
|
||||||
}
|
}
|
||||||
psyData->mdctScalenm1 = 0;
|
psyData->mdctScalenm1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* apply tns mult table on cb thresholds */
|
/* apply tns mult table on cb thresholds */
|
||||||
@@ -603,13 +603,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
data0 = psyData->sfbSpreadedEnergy.sfbLong;
|
data0 = psyData->sfbSpreadedEnergy.sfbLong;
|
||||||
data1 = psyData->sfbEnergy.sfbLong;
|
data1 = psyData->sfbEnergy.sfbLong;
|
||||||
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
||||||
//psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
|
//psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
|
||||||
*data0++ = *data1++;
|
*data0++ = *data1++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* spreading energy */
|
/* spreading energy */
|
||||||
SpreadingMax(hPsyConfLong->sfbCnt,
|
SpreadingMax(hPsyConfLong->sfbCnt,
|
||||||
hPsyConfLong->sfbMaskLowFactorSprEn,
|
hPsyConfLong->sfbMaskLowFactorSprEn,
|
||||||
hPsyConfLong->sfbMaskHighFactorSprEn,
|
hPsyConfLong->sfbMaskHighFactorSprEn,
|
||||||
psyData->sfbSpreadedEnergy.sfbLong);
|
psyData->sfbSpreadedEnergy.sfbLong);
|
||||||
|
|
||||||
@@ -619,7 +619,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name: advancePsychLongMS
|
* function name: advancePsychLongMS
|
||||||
* description: update mdct-energies for left add or minus right channel
|
* description: update mdct-energies for left add or minus right channel
|
||||||
* for long block
|
* for long block
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@@ -657,7 +657,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
|||||||
Word32 w;
|
Word32 w;
|
||||||
Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
|
Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
|
||||||
Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift;
|
Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift;
|
||||||
Word32 wOffset = 0;
|
Word32 wOffset = 0;
|
||||||
Word32 *data0, *data1;
|
Word32 *data0, *data1;
|
||||||
|
|
||||||
for(w = 0; w < TRANS_FAC; w++) {
|
for(w = 0; w < TRANS_FAC; w++) {
|
||||||
@@ -666,7 +666,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
|||||||
/* low pass */
|
/* low pass */
|
||||||
data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
|
data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
|
||||||
for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
|
for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
|
||||||
*data0++ = 0;
|
*data0++ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calc sfb-bandwise mdct-energies for left and right channel */
|
/* Calc sfb-bandwise mdct-energies for left and right channel */
|
||||||
@@ -713,9 +713,9 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
|||||||
*data0++ = min(tdata, clipEnergy);
|
*data0++ = min(tdata, clipEnergy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calc sfb-bandwise mdct-energies for left and right channel again */
|
/* Calc sfb-bandwise mdct-energies for left and right channel again */
|
||||||
if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) {
|
if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) {
|
||||||
Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
|
Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
|
||||||
CalcBandEnergy( psyData->mdctSpectrum+wOffset,
|
CalcBandEnergy( psyData->mdctSpectrum+wOffset,
|
||||||
hPsyConfShort->sfbOffset+tnsStartBand,
|
hPsyConfShort->sfbOffset+tnsStartBand,
|
||||||
(hPsyConfShort->sfbActive - tnsStartBand),
|
(hPsyConfShort->sfbActive - tnsStartBand),
|
||||||
@@ -748,7 +748,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* preecho */
|
/* preecho */
|
||||||
PreEchoControl( psyData->sfbThresholdnm1,
|
PreEchoControl( psyData->sfbThresholdnm1,
|
||||||
hPsyConfShort->sfbCnt,
|
hPsyConfShort->sfbCnt,
|
||||||
hPsyConfShort->maxAllowedIncreaseFactor,
|
hPsyConfShort->maxAllowedIncreaseFactor,
|
||||||
@@ -770,14 +770,14 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
|||||||
*data0++ = *data1++;
|
*data0++ = *data1++;
|
||||||
}
|
}
|
||||||
SpreadingMax(hPsyConfShort->sfbCnt,
|
SpreadingMax(hPsyConfShort->sfbCnt,
|
||||||
hPsyConfShort->sfbMaskLowFactorSprEn,
|
hPsyConfShort->sfbMaskLowFactorSprEn,
|
||||||
hPsyConfShort->sfbMaskHighFactorSprEn,
|
hPsyConfShort->sfbMaskHighFactorSprEn,
|
||||||
psyData->sfbSpreadedEnergy.sfbShort[w]);
|
psyData->sfbSpreadedEnergy.sfbShort[w]);
|
||||||
|
|
||||||
wOffset += FRAME_LEN_SHORT;
|
wOffset += FRAME_LEN_SHORT;
|
||||||
} /* for TRANS_FAC */
|
} /* for TRANS_FAC */
|
||||||
|
|
||||||
psyData->mdctScalenm1 = psyData->mdctScale;
|
psyData->mdctScalenm1 = psyData->mdctScale;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -785,7 +785,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name: advancePsychShortMS
|
* function name: advancePsychShortMS
|
||||||
* description: update mdct-energies for left add or minus right channel
|
* description: update mdct-energies for left add or minus right channel
|
||||||
* for short block
|
* for short block
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@@ -793,7 +793,7 @@ static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
|
|||||||
const PSY_CONFIGURATION_SHORT *hPsyConfShort)
|
const PSY_CONFIGURATION_SHORT *hPsyConfShort)
|
||||||
{
|
{
|
||||||
Word32 w, wOffset;
|
Word32 w, wOffset;
|
||||||
wOffset = 0;
|
wOffset = 0;
|
||||||
for(w=0; w<TRANS_FAC; w++) {
|
for(w=0; w<TRANS_FAC; w++) {
|
||||||
CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset,
|
CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset,
|
||||||
psyData[1].mdctSpectrum+wOffset,
|
psyData[1].mdctSpectrum+wOffset,
|
||||||
|
|||||||
@@ -68,12 +68,12 @@ static Word16 calcFrameLen(Word32 bitRate,
|
|||||||
result = (FRAME_LEN_LONG >> 3) * bitRate;
|
result = (FRAME_LEN_LONG >> 3) * bitRate;
|
||||||
quot = result / sampleRate;
|
quot = result / sampleRate;
|
||||||
|
|
||||||
|
|
||||||
if (mode == FRAME_LEN_BYTES_MODULO) {
|
if (mode == FRAME_LEN_BYTES_MODULO) {
|
||||||
result -= quot * sampleRate;
|
result -= quot * sampleRate;
|
||||||
}
|
}
|
||||||
else { /* FRAME_LEN_BYTES_INT */
|
else { /* FRAME_LEN_BYTES_INT */
|
||||||
result = quot;
|
result = quot;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -83,7 +83,7 @@ static Word16 calcFrameLen(Word32 bitRate,
|
|||||||
*
|
*
|
||||||
* function name:framePadding
|
* function name:framePadding
|
||||||
* description: Calculates if padding is needed for actual frame
|
* description: Calculates if padding is needed for actual frame
|
||||||
* returns: paddingOn or not
|
* returns: paddingOn or not
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static Word16 framePadding(Word32 bitRate,
|
static Word16 framePadding(Word32 bitRate,
|
||||||
@@ -93,16 +93,16 @@ static Word16 framePadding(Word32 bitRate,
|
|||||||
Word16 paddingOn;
|
Word16 paddingOn;
|
||||||
Word16 difference;
|
Word16 difference;
|
||||||
|
|
||||||
paddingOn = 0;
|
paddingOn = 0;
|
||||||
|
|
||||||
difference = calcFrameLen( bitRate,
|
difference = calcFrameLen( bitRate,
|
||||||
sampleRate,
|
sampleRate,
|
||||||
FRAME_LEN_BYTES_MODULO );
|
FRAME_LEN_BYTES_MODULO );
|
||||||
*paddingRest = *paddingRest - difference;
|
*paddingRest = *paddingRest - difference;
|
||||||
|
|
||||||
|
|
||||||
if (*paddingRest <= 0 ) {
|
if (*paddingRest <= 0 ) {
|
||||||
paddingOn = 1;
|
paddingOn = 1;
|
||||||
*paddingRest = *paddingRest + sampleRate;
|
*paddingRest = *paddingRest + sampleRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,12 +123,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
|
|||||||
Word32 i;
|
Word32 i;
|
||||||
Word16 *quantSpec;
|
Word16 *quantSpec;
|
||||||
Word16 *scf;
|
Word16 *scf;
|
||||||
UWord16 *maxValueInSfb;
|
UWord16 *maxValueInSfb;
|
||||||
|
|
||||||
quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
|
quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
|
||||||
if(NULL == quantSpec)
|
if(NULL == quantSpec)
|
||||||
return 1;
|
return 1;
|
||||||
scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
|
scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
|
||||||
if(NULL == scf)
|
if(NULL == scf)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
@@ -141,12 +141,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
|
|||||||
|
|
||||||
for (i=0; i<nChannels; i++) {
|
for (i=0; i<nChannels; i++) {
|
||||||
hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
|
hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
|
||||||
|
|
||||||
hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB;
|
hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB;
|
||||||
|
|
||||||
hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB;
|
hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,21 +165,21 @@ void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
|
|||||||
{
|
{
|
||||||
if(hQC->qcChannel[0].quantSpec);
|
if(hQC->qcChannel[0].quantSpec);
|
||||||
mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
|
mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
|
||||||
|
|
||||||
if(hQC->qcChannel[0].maxValueInSfb)
|
if(hQC->qcChannel[0].maxValueInSfb)
|
||||||
mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
|
mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
|
||||||
|
|
||||||
if(hQC->qcChannel[0].scf)
|
if(hQC->qcChannel[0].scf)
|
||||||
mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
|
mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
|
||||||
|
|
||||||
for (i=0; i<MAX_CHANNELS; i++) {
|
for (i=0; i<MAX_CHANNELS; i++) {
|
||||||
hQC->qcChannel[i].quantSpec = NULL;
|
hQC->qcChannel[i].quantSpec = NULL;
|
||||||
|
|
||||||
hQC->qcChannel[i].maxValueInSfb = NULL;
|
hQC->qcChannel[i].maxValueInSfb = NULL;
|
||||||
|
|
||||||
hQC->qcChannel[i].scf = NULL;
|
hQC->qcChannel[i].scf = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
@@ -204,8 +204,8 @@ Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
|
|||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
|
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
nothing to do
|
nothing to do
|
||||||
*/
|
*/
|
||||||
hQC=NULL;
|
hQC=NULL;
|
||||||
@@ -221,15 +221,15 @@ void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
|
|||||||
Word16 QCInit(QC_STATE *hQC,
|
Word16 QCInit(QC_STATE *hQC,
|
||||||
struct QC_INIT *init)
|
struct QC_INIT *init)
|
||||||
{
|
{
|
||||||
hQC->nChannels = init->elInfo->nChannelsInEl;
|
hQC->nChannels = init->elInfo->nChannelsInEl;
|
||||||
hQC->maxBitsTot = init->maxBits;
|
hQC->maxBitsTot = init->maxBits;
|
||||||
hQC->bitResTot = sub(init->bitRes, init->averageBits);
|
hQC->bitResTot = sub(init->bitRes, init->averageBits);
|
||||||
hQC->averageBitsTot = init->averageBits;
|
hQC->averageBitsTot = init->averageBits;
|
||||||
hQC->maxBitFac = init->maxBitFac;
|
hQC->maxBitFac = init->maxBitFac;
|
||||||
|
|
||||||
hQC->padding.paddingRest = init->padding.paddingRest;
|
hQC->padding.paddingRest = init->padding.paddingRest;
|
||||||
|
|
||||||
hQC->globStatBits = 3; /* for ID_END */
|
hQC->globStatBits = 3; /* for ID_END */
|
||||||
|
|
||||||
/* channel elements init */
|
/* channel elements init */
|
||||||
InitElementBits(&hQC->elementBits,
|
InitElementBits(&hQC->elementBits,
|
||||||
@@ -248,13 +248,13 @@ Word16 QCInit(QC_STATE *hQC,
|
|||||||
|
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
*
|
*
|
||||||
* function name: QCMain
|
* function name: QCMain
|
||||||
* description: quantization and coding the spectrum
|
* description: quantization and coding the spectrum
|
||||||
* returns: 0 if success
|
* returns: 0 if success
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
Word16 QCMain(QC_STATE* hQC,
|
Word16 QCMain(QC_STATE* hQC,
|
||||||
ELEMENT_BITS* elBits,
|
ELEMENT_BITS* elBits,
|
||||||
ATS_ELEMENT* adjThrStateElement,
|
ATS_ELEMENT* adjThrStateElement,
|
||||||
PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
|
PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
|
||||||
@@ -262,34 +262,34 @@ Word16 QCMain(QC_STATE* hQC,
|
|||||||
QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
|
QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
|
||||||
QC_OUT_ELEMENT* qcOutElement,
|
QC_OUT_ELEMENT* qcOutElement,
|
||||||
Word16 nChannels,
|
Word16 nChannels,
|
||||||
Word16 ancillaryDataBytes)
|
Word16 ancillaryDataBytes)
|
||||||
{
|
{
|
||||||
Word16 maxChDynBits[MAX_CHANNELS];
|
Word16 maxChDynBits[MAX_CHANNELS];
|
||||||
Word16 chBitDistribution[MAX_CHANNELS];
|
Word16 chBitDistribution[MAX_CHANNELS];
|
||||||
Word32 ch;
|
Word32 ch;
|
||||||
|
|
||||||
if (elBits->bitResLevel < 0) {
|
if (elBits->bitResLevel < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elBits->bitResLevel > elBits->maxBitResBits) {
|
if (elBits->bitResLevel > elBits->maxBitResBits) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
|
qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
|
||||||
psyOutElement,
|
psyOutElement,
|
||||||
nChannels,
|
nChannels,
|
||||||
qcOutElement->adtsUsed);
|
qcOutElement->adtsUsed);
|
||||||
|
|
||||||
|
|
||||||
if (ancillaryDataBytes) {
|
if (ancillaryDataBytes) {
|
||||||
qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
|
qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
|
||||||
|
|
||||||
if (ancillaryDataBytes >= 15)
|
if (ancillaryDataBytes >= 15)
|
||||||
qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
|
qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qcOutElement->ancBitsUsed = 0;
|
qcOutElement->ancBitsUsed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
|
CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
|
||||||
@@ -301,7 +301,7 @@ Word16 QCMain(QC_STATE* hQC,
|
|||||||
psyOutElement,
|
psyOutElement,
|
||||||
chBitDistribution,
|
chBitDistribution,
|
||||||
hQC->logSfbEnergy,
|
hQC->logSfbEnergy,
|
||||||
hQC->sfbNRelevantLines,
|
hQC->sfbNRelevantLines,
|
||||||
qcOutElement,
|
qcOutElement,
|
||||||
elBits,
|
elBits,
|
||||||
nChannels,
|
nChannels,
|
||||||
@@ -323,14 +323,14 @@ Word16 QCMain(QC_STATE* hQC,
|
|||||||
maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
|
maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
qcOutElement->dynBitsUsed = 0;
|
qcOutElement->dynBitsUsed = 0;
|
||||||
for (ch = 0; ch < nChannels; ch++) {
|
for (ch = 0; ch < nChannels; ch++) {
|
||||||
Word32 chDynBits;
|
Word32 chDynBits;
|
||||||
Flag constraintsFulfilled;
|
Flag constraintsFulfilled;
|
||||||
Word32 iter;
|
Word32 iter;
|
||||||
iter = 0;
|
iter = 0;
|
||||||
do {
|
do {
|
||||||
constraintsFulfilled = 1;
|
constraintsFulfilled = 1;
|
||||||
|
|
||||||
QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
|
QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
|
||||||
psyOutChannel[ch].maxSfbPerGroup,
|
psyOutChannel[ch].maxSfbPerGroup,
|
||||||
@@ -340,14 +340,14 @@ Word16 QCMain(QC_STATE* hQC,
|
|||||||
qcOutChannel[ch].globalGain,
|
qcOutChannel[ch].globalGain,
|
||||||
qcOutChannel[ch].scf,
|
qcOutChannel[ch].scf,
|
||||||
qcOutChannel[ch].quantSpec);
|
qcOutChannel[ch].quantSpec);
|
||||||
|
|
||||||
if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt,
|
if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt,
|
||||||
psyOutChannel[ch].maxSfbPerGroup,
|
psyOutChannel[ch].maxSfbPerGroup,
|
||||||
psyOutChannel[ch].sfbPerGroup,
|
psyOutChannel[ch].sfbPerGroup,
|
||||||
psyOutChannel[ch].sfbOffsets,
|
psyOutChannel[ch].sfbOffsets,
|
||||||
qcOutChannel[ch].quantSpec,
|
qcOutChannel[ch].quantSpec,
|
||||||
qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) {
|
qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) {
|
||||||
constraintsFulfilled = 0;
|
constraintsFulfilled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
|
chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
|
||||||
@@ -359,24 +359,24 @@ Word16 QCMain(QC_STATE* hQC,
|
|||||||
psyOutChannel[ch].sfbPerGroup,
|
psyOutChannel[ch].sfbPerGroup,
|
||||||
psyOutChannel[ch].sfbOffsets,
|
psyOutChannel[ch].sfbOffsets,
|
||||||
&qcOutChannel[ch].sectionData);
|
&qcOutChannel[ch].sectionData);
|
||||||
|
|
||||||
if (chDynBits >= maxChDynBits[ch]) {
|
if (chDynBits >= maxChDynBits[ch]) {
|
||||||
constraintsFulfilled = 0;
|
constraintsFulfilled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!constraintsFulfilled) {
|
if (!constraintsFulfilled) {
|
||||||
qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1;
|
qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter = iter + 1;
|
iter = iter + 1;
|
||||||
|
|
||||||
} while(!constraintsFulfilled);
|
} while(!constraintsFulfilled);
|
||||||
|
|
||||||
qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits;
|
qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits;
|
||||||
|
|
||||||
qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale;
|
qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale;
|
||||||
qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
|
qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
|
||||||
qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape;
|
qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save dynBitsUsed for correction of bits2pe relation */
|
/* save dynBitsUsed for correction of bits2pe relation */
|
||||||
@@ -411,13 +411,13 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
|
|||||||
Word16 sfbOffs, sfb;
|
Word16 sfbOffs, sfb;
|
||||||
Word16 maxValueAll;
|
Word16 maxValueAll;
|
||||||
|
|
||||||
maxValueAll = 0;
|
maxValueAll = 0;
|
||||||
|
|
||||||
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
|
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
|
||||||
for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
|
for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
|
||||||
Word16 line;
|
Word16 line;
|
||||||
Word16 maxThisSfb;
|
Word16 maxThisSfb;
|
||||||
maxThisSfb = 0;
|
maxThisSfb = 0;
|
||||||
|
|
||||||
for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
|
for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
|
||||||
Word16 absVal;
|
Word16 absVal;
|
||||||
@@ -425,7 +425,7 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
|
|||||||
maxThisSfb = max(maxThisSfb, absVal);
|
maxThisSfb = max(maxThisSfb, absVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
maxValue[sfbOffs+sfb] = maxThisSfb;
|
maxValue[sfbOffs+sfb] = maxThisSfb;
|
||||||
maxValueAll = max(maxValueAll, maxThisSfb);
|
maxValueAll = max(maxValueAll, maxThisSfb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -441,15 +441,15 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
|
|||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
void updateBitres(QC_STATE* qcKernel,
|
void updateBitres(QC_STATE* qcKernel,
|
||||||
QC_OUT* qcOut)
|
QC_OUT* qcOut)
|
||||||
|
|
||||||
{
|
{
|
||||||
ELEMENT_BITS *elBits;
|
ELEMENT_BITS *elBits;
|
||||||
|
|
||||||
qcKernel->bitResTot = 0;
|
qcKernel->bitResTot = 0;
|
||||||
|
|
||||||
elBits = &qcKernel->elementBits;
|
elBits = &qcKernel->elementBits;
|
||||||
|
|
||||||
|
|
||||||
if (elBits->averageBits > 0) {
|
if (elBits->averageBits > 0) {
|
||||||
/* constant bitrate */
|
/* constant bitrate */
|
||||||
Word16 bitsUsed;
|
Word16 bitsUsed;
|
||||||
@@ -460,8 +460,8 @@ void updateBitres(QC_STATE* qcKernel,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* variable bitrate */
|
/* variable bitrate */
|
||||||
elBits->bitResLevel = elBits->maxBits;
|
elBits->bitResLevel = elBits->maxBits;
|
||||||
qcKernel->bitResTot = qcKernel->maxBitsTot;
|
qcKernel->bitResTot = qcKernel->maxBitsTot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,55 +476,55 @@ Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
|
|||||||
{
|
{
|
||||||
Word32 nFullFillElem;
|
Word32 nFullFillElem;
|
||||||
Word32 totFillBits;
|
Word32 totFillBits;
|
||||||
Word16 diffBits;
|
Word16 diffBits;
|
||||||
Word16 bitsUsed;
|
Word16 bitsUsed;
|
||||||
|
|
||||||
totFillBits = 0;
|
totFillBits = 0;
|
||||||
|
|
||||||
qcOut->totStaticBitsUsed = qcKernel->globStatBits;
|
qcOut->totStaticBitsUsed = qcKernel->globStatBits;
|
||||||
qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed;
|
qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed;
|
||||||
qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed;
|
qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed;
|
||||||
qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed;
|
qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed;
|
||||||
qcOut->totFillBits = qcOut->qcElement.fillBits;
|
qcOut->totFillBits = qcOut->qcElement.fillBits;
|
||||||
|
|
||||||
if (qcOut->qcElement.fillBits) {
|
if (qcOut->qcElement.fillBits) {
|
||||||
totFillBits += qcOut->qcElement.fillBits;
|
totFillBits += qcOut->qcElement.fillBits;
|
||||||
}
|
}
|
||||||
|
|
||||||
nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
|
nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
|
||||||
|
|
||||||
qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
|
qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
|
||||||
|
|
||||||
/* check fill elements */
|
/* check fill elements */
|
||||||
|
|
||||||
if (qcOut->totFillBits > 0) {
|
if (qcOut->totFillBits > 0) {
|
||||||
/* minimum Fillelement contains 7 (TAG + byte cnt) bits */
|
/* minimum Fillelement contains 7 (TAG + byte cnt) bits */
|
||||||
qcOut->totFillBits = max(7, qcOut->totFillBits);
|
qcOut->totFillBits = max(7, qcOut->totFillBits);
|
||||||
/* fill element size equals n*8 + 7 */
|
/* fill element size equals n*8 + 7 */
|
||||||
qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007);
|
qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007);
|
||||||
}
|
}
|
||||||
|
|
||||||
qcOut->totFillBits = qcOut->totFillBits + nFullFillElem;
|
qcOut->totFillBits = qcOut->totFillBits + nFullFillElem;
|
||||||
|
|
||||||
/* now distribute extra fillbits and alignbits over channel elements */
|
/* now distribute extra fillbits and alignbits over channel elements */
|
||||||
qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed +
|
qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed +
|
||||||
qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007);
|
qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) &&
|
if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) &&
|
||||||
(qcOut->totFillBits > 8))
|
(qcOut->totFillBits > 8))
|
||||||
qcOut->totFillBits = qcOut->totFillBits - 8;
|
qcOut->totFillBits = qcOut->totFillBits - 8;
|
||||||
|
|
||||||
|
|
||||||
diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits;
|
diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits;
|
||||||
|
|
||||||
if(diffBits>=0) {
|
if(diffBits>=0) {
|
||||||
qcOut->qcElement.fillBits += diffBits;
|
qcOut->qcElement.fillBits += diffBits;
|
||||||
}
|
}
|
||||||
|
|
||||||
bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed;
|
bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed;
|
||||||
bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits;
|
bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits;
|
||||||
|
|
||||||
if (bitsUsed > qcKernel->maxBitsTot) {
|
if (bitsUsed > qcKernel->maxBitsTot) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -564,9 +564,9 @@ Word16 AdjustBitrate(QC_STATE *hQC,
|
|||||||
codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
|
codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
|
||||||
codeBits = frameLen - hQC->globStatBits;
|
codeBits = frameLen - hQC->globStatBits;
|
||||||
|
|
||||||
/* calculate bits for every channel element */
|
/* calculate bits for every channel element */
|
||||||
if (codeBits != codeBitsLast) {
|
if (codeBits != codeBitsLast) {
|
||||||
Word16 totalBits = 0;
|
Word16 totalBits = 0;
|
||||||
|
|
||||||
hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
|
hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
|
||||||
totalBits += hQC->elementBits.averageBits;
|
totalBits += hQC->elementBits.averageBits;
|
||||||
@@ -574,7 +574,7 @@ Word16 AdjustBitrate(QC_STATE *hQC,
|
|||||||
hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
|
hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
hQC->averageBitsTot = frameLen;
|
hQC->averageBitsTot = frameLen;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,32 +34,32 @@ static const Word32 XROUND = 0x33e425af; /* final rounding constant (-0.0946f+ 0
|
|||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:pow34
|
* function name:pow34
|
||||||
* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$.
|
* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$.
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
__inline Word32 pow34(Word32 x)
|
__inline Word32 pow34(Word32 x)
|
||||||
{
|
{
|
||||||
/* index table using MANT_DIGITS bits, but mask out the sign bit and the MSB
|
/* index table using MANT_DIGITS bits, but mask out the sign bit and the MSB
|
||||||
which is always one */
|
which is always one */
|
||||||
return mTab_3_4[(x >> (INT_BITS-2-MANT_DIGITS)) & (MANT_SIZE-1)];
|
return mTab_3_4[(x >> (INT_BITS-2-MANT_DIGITS)) & (MANT_SIZE-1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:quantizeSingleLine
|
* function name:quantizeSingleLine
|
||||||
* description: quantizes spectrum
|
* description: quantizes spectrum
|
||||||
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
||||||
{
|
{
|
||||||
Word32 e, minusFinalExp, finalShift;
|
Word32 e, minusFinalExp, finalShift;
|
||||||
Word32 x;
|
Word32 x;
|
||||||
Word16 qua = 0;
|
Word16 qua = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (absSpectrum) {
|
if (absSpectrum) {
|
||||||
e = norm_l(absSpectrum);
|
e = norm_l(absSpectrum);
|
||||||
x = pow34(absSpectrum << e);
|
x = pow34(absSpectrum << e);
|
||||||
@@ -71,7 +71,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
|||||||
|
|
||||||
/* separate the exponent into a shift, and a multiply */
|
/* separate the exponent into a shift, and a multiply */
|
||||||
finalShift = minusFinalExp >> 4;
|
finalShift = minusFinalExp >> 4;
|
||||||
|
|
||||||
if (finalShift < INT_BITS) {
|
if (finalShift < INT_BITS) {
|
||||||
x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]);
|
x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]);
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
|||||||
x >>= finalShift;
|
x >>= finalShift;
|
||||||
else
|
else
|
||||||
x <<= (-finalShift);
|
x <<= (-finalShift);
|
||||||
|
|
||||||
qua = saturate(x);
|
qua = saturate(x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,10 +94,10 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
|||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:quantizeLines
|
* function name:quantizeLines
|
||||||
* description: quantizes spectrum lines
|
* description: quantizes spectrum lines
|
||||||
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
||||||
* input: global gain, number of lines to process, spectral data
|
* input: global gain, number of lines to process, spectral data
|
||||||
* output: quantized spectrum
|
* output: quantized spectrum
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@@ -116,15 +116,15 @@ static void quantizeLines(const Word16 gain,
|
|||||||
pquat = quantBorders[m];
|
pquat = quantBorders[m];
|
||||||
|
|
||||||
g += 16;
|
g += 16;
|
||||||
|
|
||||||
if(g >= 0)
|
if(g >= 0)
|
||||||
{
|
{
|
||||||
for (line=0; line<noOfLines; line++) {
|
for (line=0; line<noOfLines; line++) {
|
||||||
Word32 qua;
|
Word32 qua;
|
||||||
qua = 0;
|
qua = 0;
|
||||||
|
|
||||||
mdctSpeL = mdctSpectrum[line];
|
mdctSpeL = mdctSpectrum[line];
|
||||||
|
|
||||||
if (mdctSpeL) {
|
if (mdctSpeL) {
|
||||||
Word32 sa;
|
Word32 sa;
|
||||||
Word32 saShft;
|
Word32 saShft;
|
||||||
@@ -134,27 +134,27 @@ static void quantizeLines(const Word16 gain,
|
|||||||
saShft = sa >> g;
|
saShft = sa >> g;
|
||||||
|
|
||||||
if (saShft > pquat[0]) {
|
if (saShft > pquat[0]) {
|
||||||
|
|
||||||
if (saShft < pquat[1]) {
|
if (saShft < pquat[1]) {
|
||||||
|
|
||||||
qua = mdctSpeL>0 ? 1 : -1;
|
qua = mdctSpeL>0 ? 1 : -1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[2]) {
|
if (saShft < pquat[2]) {
|
||||||
|
|
||||||
qua = mdctSpeL>0 ? 2 : -2;
|
qua = mdctSpeL>0 ? 2 : -2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[3]) {
|
if (saShft < pquat[3]) {
|
||||||
|
|
||||||
qua = mdctSpeL>0 ? 3 : -3;
|
qua = mdctSpeL>0 ? 3 : -3;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qua = quantizeSingleLine(gain, sa);
|
qua = quantizeSingleLine(gain, sa);
|
||||||
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
|
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
|
||||||
|
|
||||||
if (mdctSpeL < 0)
|
if (mdctSpeL < 0)
|
||||||
qua = -qua;
|
qua = -qua;
|
||||||
}
|
}
|
||||||
@@ -162,17 +162,17 @@ static void quantizeLines(const Word16 gain,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
quaSpectrum[line] = qua ;
|
quaSpectrum[line] = qua ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (line=0; line<noOfLines; line++) {
|
for (line=0; line<noOfLines; line++) {
|
||||||
Word32 qua;
|
Word32 qua;
|
||||||
qua = 0;
|
qua = 0;
|
||||||
|
|
||||||
mdctSpeL = mdctSpectrum[line];
|
mdctSpeL = mdctSpectrum[line];
|
||||||
|
|
||||||
if (mdctSpeL) {
|
if (mdctSpeL) {
|
||||||
Word32 sa;
|
Word32 sa;
|
||||||
Word32 saShft;
|
Word32 saShft;
|
||||||
@@ -181,27 +181,27 @@ static void quantizeLines(const Word16 gain,
|
|||||||
saShft = sa << g;
|
saShft = sa << g;
|
||||||
|
|
||||||
if (saShft > pquat[0]) {
|
if (saShft > pquat[0]) {
|
||||||
|
|
||||||
if (saShft < pquat[1]) {
|
if (saShft < pquat[1]) {
|
||||||
|
|
||||||
qua = mdctSpeL>0 ? 1 : -1;
|
qua = mdctSpeL>0 ? 1 : -1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[2]) {
|
if (saShft < pquat[2]) {
|
||||||
|
|
||||||
qua = mdctSpeL>0 ? 2 : -2;
|
qua = mdctSpeL>0 ? 2 : -2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[3]) {
|
if (saShft < pquat[3]) {
|
||||||
|
|
||||||
qua = mdctSpeL>0 ? 3 : -3;
|
qua = mdctSpeL>0 ? 3 : -3;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qua = quantizeSingleLine(gain, sa);
|
qua = quantizeSingleLine(gain, sa);
|
||||||
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
|
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
|
||||||
|
|
||||||
if (mdctSpeL < 0)
|
if (mdctSpeL < 0)
|
||||||
qua = -qua;
|
qua = -qua;
|
||||||
}
|
}
|
||||||
@@ -209,8 +209,8 @@ static void quantizeLines(const Word16 gain,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
quaSpectrum[line] = qua ;
|
quaSpectrum[line] = qua ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -218,10 +218,10 @@ static void quantizeLines(const Word16 gain,
|
|||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:iquantizeLines
|
* function name:iquantizeLines
|
||||||
* description: iquantizes spectrum lines without sign
|
* description: iquantizes spectrum lines without sign
|
||||||
* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
|
* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
|
||||||
* input: global gain, number of lines to process,quantized spectrum
|
* input: global gain, number of lines to process,quantized spectrum
|
||||||
* output: spectral data
|
* output: spectral data
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@@ -234,11 +234,11 @@ static void iquantizeLines(const Word16 gain,
|
|||||||
Word32 iquantizershift;
|
Word32 iquantizershift;
|
||||||
Word32 line;
|
Word32 line;
|
||||||
|
|
||||||
iquantizermod = gain & 3;
|
iquantizermod = gain & 3;
|
||||||
iquantizershift = gain >> 2;
|
iquantizershift = gain >> 2;
|
||||||
|
|
||||||
for (line=0; line<noOfLines; line++) {
|
for (line=0; line<noOfLines; line++) {
|
||||||
|
|
||||||
if( quantSpectrum[line] != 0 ) {
|
if( quantSpectrum[line] != 0 ) {
|
||||||
Word32 accu;
|
Word32 accu;
|
||||||
Word32 ex;
|
Word32 ex;
|
||||||
@@ -252,19 +252,19 @@ static void iquantizeLines(const Word16 gain,
|
|||||||
accu = accu << ex;
|
accu = accu << ex;
|
||||||
specExp = INT_BITS-1 - ex;
|
specExp = INT_BITS-1 - ex;
|
||||||
|
|
||||||
tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE);
|
tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE);
|
||||||
|
|
||||||
/* calculate "mantissa" ^4/3 */
|
/* calculate "mantissa" ^4/3 */
|
||||||
s = mTab_4_3[tabIndex];
|
s = mTab_4_3[tabIndex];
|
||||||
|
|
||||||
/* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */
|
/* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */
|
||||||
t = specExpMantTableComb_enc[iquantizermod][specExp];
|
t = specExpMantTableComb_enc[iquantizermod][specExp];
|
||||||
|
|
||||||
/* multiply "mantissa" ^4/3 with exponent multiplier */
|
/* multiply "mantissa" ^4/3 with exponent multiplier */
|
||||||
accu = MULHIGH(s, t);
|
accu = MULHIGH(s, t);
|
||||||
|
|
||||||
/* get approperiate exponent shifter */
|
/* get approperiate exponent shifter */
|
||||||
specExp = specExpTableComb_enc[iquantizermod][specExp];
|
specExp = specExpTableComb_enc[iquantizermod][specExp];
|
||||||
|
|
||||||
specExp += iquantizershift + 1;
|
specExp += iquantizershift + 1;
|
||||||
if(specExp >= 0)
|
if(specExp >= 0)
|
||||||
@@ -273,7 +273,7 @@ static void iquantizeLines(const Word16 gain,
|
|||||||
mdctSpectrum[line] = accu >> (-specExp);
|
mdctSpectrum[line] = accu >> (-specExp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mdctSpectrum[line] = 0;
|
mdctSpectrum[line] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -301,7 +301,7 @@ void QuantizeSpectrum(Word16 sfbCnt,
|
|||||||
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
|
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
|
||||||
Word32 sfbNext ;
|
Word32 sfbNext ;
|
||||||
for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) {
|
for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) {
|
||||||
Word16 scalefactor = scalefactors[sfbOffs+sfb];
|
Word16 scalefactor = scalefactors[sfbOffs+sfb];
|
||||||
/* coalesce sfbs with the same scalefactor */
|
/* coalesce sfbs with the same scalefactor */
|
||||||
for (sfbNext = sfb+1;
|
for (sfbNext = sfb+1;
|
||||||
sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext];
|
sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext];
|
||||||
@@ -318,7 +318,7 @@ void QuantizeSpectrum(Word16 sfbCnt,
|
|||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* function name:calcSfbDist
|
* function name:calcSfbDist
|
||||||
* description: quantizes and requantizes lines to calculate distortion
|
* description: quantizes and requantizes lines to calculate distortion
|
||||||
* input: number of lines to be quantized, ...
|
* input: number of lines to be quantized, ...
|
||||||
* output: distortion
|
* output: distortion
|
||||||
@@ -338,14 +338,14 @@ Word32 calcSfbDist(const Word32 *spec,
|
|||||||
|
|
||||||
pquat = quantBorders[m];
|
pquat = quantBorders[m];
|
||||||
repquat = quantRecon[m];
|
repquat = quantRecon[m];
|
||||||
|
|
||||||
dist = 0;
|
dist = 0;
|
||||||
g += 16;
|
g += 16;
|
||||||
if(g2 < 0 && g >= 0)
|
if(g2 < 0 && g >= 0)
|
||||||
{
|
{
|
||||||
g2 = -g2;
|
g2 = -g2;
|
||||||
for(line=0; line<sfbWidth; line++) {
|
for(line=0; line<sfbWidth; line++) {
|
||||||
if (spec[line]) {
|
if (spec[line]) {
|
||||||
Word32 diff;
|
Word32 diff;
|
||||||
Word32 distSingle;
|
Word32 distSingle;
|
||||||
Word32 sa;
|
Word32 sa;
|
||||||
@@ -359,19 +359,19 @@ Word32 calcSfbDist(const Word32 *spec,
|
|||||||
distSingle = (saShft * saShft) >> g2;
|
distSingle = (saShft * saShft) >> g2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[1]) {
|
if (saShft < pquat[1]) {
|
||||||
diff = saShft - repquat[0];
|
diff = saShft - repquat[0];
|
||||||
distSingle = (diff * diff) >> g2;
|
distSingle = (diff * diff) >> g2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[2]) {
|
if (saShft < pquat[2]) {
|
||||||
diff = saShft - repquat[1];
|
diff = saShft - repquat[1];
|
||||||
distSingle = (diff * diff) >> g2;
|
distSingle = (diff * diff) >> g2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[3]) {
|
if (saShft < pquat[3]) {
|
||||||
diff = saShft - repquat[2];
|
diff = saShft - repquat[2];
|
||||||
distSingle = (diff * diff) >> g2;
|
distSingle = (diff * diff) >> g2;
|
||||||
@@ -387,15 +387,15 @@ Word32 calcSfbDist(const Word32 *spec,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dist = L_add(dist, distSingle);
|
dist = L_add(dist, distSingle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(line=0; line<sfbWidth; line++) {
|
for(line=0; line<sfbWidth; line++) {
|
||||||
if (spec[line]) {
|
if (spec[line]) {
|
||||||
Word32 diff;
|
Word32 diff;
|
||||||
Word32 distSingle;
|
Word32 distSingle;
|
||||||
Word32 sa;
|
Word32 sa;
|
||||||
@@ -408,19 +408,19 @@ Word32 calcSfbDist(const Word32 *spec,
|
|||||||
distSingle = L_shl((saShft * saShft), g2);
|
distSingle = L_shl((saShft * saShft), g2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[1]) {
|
if (saShft < pquat[1]) {
|
||||||
diff = saShft - repquat[0];
|
diff = saShft - repquat[0];
|
||||||
distSingle = L_shl((diff * diff), g2);
|
distSingle = L_shl((diff * diff), g2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[2]) {
|
if (saShft < pquat[2]) {
|
||||||
diff = saShft - repquat[1];
|
diff = saShft - repquat[1];
|
||||||
distSingle = L_shl((diff * diff), g2);
|
distSingle = L_shl((diff * diff), g2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (saShft < pquat[3]) {
|
if (saShft < pquat[3]) {
|
||||||
diff = saShft - repquat[2];
|
diff = saShft - repquat[2];
|
||||||
distSingle = L_shl((diff * diff), g2);
|
distSingle = L_shl((diff * diff), g2);
|
||||||
@@ -438,7 +438,7 @@ Word32 calcSfbDist(const Word32 *spec,
|
|||||||
}
|
}
|
||||||
dist = L_add(dist, distSingle);
|
dist = L_add(dist, distSingle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return dist;
|
return dist;
|
||||||
|
|||||||
@@ -30,17 +30,17 @@
|
|||||||
static const Word16 MAX_SCF_DELTA = 60;
|
static const Word16 MAX_SCF_DELTA = 60;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
constants reference in comments
|
constants reference in comments
|
||||||
|
|
||||||
C0 = 6.75f;
|
C0 = 6.75f;
|
||||||
C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2)
|
C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2)
|
||||||
C2 = 4.0f;
|
C2 = 4.0f;
|
||||||
C3 = 2.66666666f;
|
C3 = 2.66666666f;
|
||||||
|
|
||||||
PE_C1 = 3.0f; log(8.0)/log(2)
|
PE_C1 = 3.0f; log(8.0)/log(2)
|
||||||
PE_C2 = 1.3219281f; log(2.5)/log(2)
|
PE_C2 = 1.3219281f; log(2.5)/log(2)
|
||||||
PE_C3 = 0.5593573f; 1-C2/C1
|
PE_C3 = 0.5593573f; 1-C2/C1
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FF_SQRT_BITS 7
|
#define FF_SQRT_BITS 7
|
||||||
@@ -55,15 +55,15 @@ constants reference in comments
|
|||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
*
|
*
|
||||||
* function name: formfac_sqrt
|
* function name: formfac_sqrt
|
||||||
* description: calculates sqrt(x)/256
|
* description: calculates sqrt(x)/256
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
__inline Word32 formfac_sqrt(Word32 x)
|
__inline Word32 formfac_sqrt(Word32 x)
|
||||||
{
|
{
|
||||||
Word32 y;
|
Word32 y;
|
||||||
Word32 preshift, postshift;
|
Word32 preshift, postshift;
|
||||||
|
|
||||||
|
|
||||||
if (x==0) return 0;
|
if (x==0) return 0;
|
||||||
preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS);
|
preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS);
|
||||||
postshift = preshift >> 1;
|
postshift = preshift >> 1;
|
||||||
@@ -74,12 +74,12 @@ __inline Word32 formfac_sqrt(Word32 x)
|
|||||||
else
|
else
|
||||||
y = x >> (-preshift);
|
y = x >> (-preshift);
|
||||||
y = formfac_sqrttable[y-32];
|
y = formfac_sqrttable[y-32];
|
||||||
|
|
||||||
if(postshift >= 0)
|
if(postshift >= 0)
|
||||||
y = y >> postshift;
|
y = y >> postshift;
|
||||||
else
|
else
|
||||||
y = y << (-postshift);
|
y = y << (-postshift);
|
||||||
|
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,19 +100,19 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
|
|||||||
Word32 sfbw, sfbw1;
|
Word32 sfbw, sfbw1;
|
||||||
Word32 i, j;
|
Word32 i, j;
|
||||||
Word32 sfbOffs, sfb, shift;
|
Word32 sfbOffs, sfb, shift;
|
||||||
|
|
||||||
sfbw = sfbw1 = 0;
|
sfbw = sfbw1 = 0;
|
||||||
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){
|
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){
|
||||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||||
i = sfbOffs+sfb;
|
i = sfbOffs+sfb;
|
||||||
|
|
||||||
if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) {
|
if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) {
|
||||||
Word32 accu, avgFormFactor,iSfbWidth;
|
Word32 accu, avgFormFactor,iSfbWidth;
|
||||||
Word32 *mdctSpec;
|
Word32 *mdctSpec;
|
||||||
sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];
|
sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];
|
||||||
iSfbWidth = invSBF[(sfbw >> 2) - 1];
|
iSfbWidth = invSBF[(sfbw >> 2) - 1];
|
||||||
mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i];
|
mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i];
|
||||||
accu = 0;
|
accu = 0;
|
||||||
/* calc sum of sqrt(spec) */
|
/* calc sum of sqrt(spec) */
|
||||||
for (j=sfbw; j; j--) {
|
for (j=sfbw; j; j--) {
|
||||||
accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
|
accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
|
||||||
@@ -129,7 +129,7 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* set number of lines to zero */
|
/* set number of lines to zero */
|
||||||
sfbNRelevantLines[i] = 0;
|
sfbNRelevantLines[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,68 +141,68 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
|
|||||||
* description: find better scalefactor with analysis by synthesis
|
* description: find better scalefactor with analysis by synthesis
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static Word16 improveScf(Word32 *spec,
|
static Word16 improveScf(Word32 *spec,
|
||||||
Word16 sfbWidth,
|
Word16 sfbWidth,
|
||||||
Word32 thresh,
|
Word32 thresh,
|
||||||
Word16 scf,
|
Word16 scf,
|
||||||
Word16 minScf,
|
Word16 minScf,
|
||||||
Word32 *dist,
|
Word32 *dist,
|
||||||
Word16 *minScfCalculated)
|
Word16 *minScfCalculated)
|
||||||
{
|
{
|
||||||
Word32 cnt;
|
Word32 cnt;
|
||||||
Word32 sfbDist;
|
Word32 sfbDist;
|
||||||
Word32 scfBest;
|
Word32 scfBest;
|
||||||
Word32 thresh125 = L_add(thresh, (thresh >> 2));
|
Word32 thresh125 = L_add(thresh, (thresh >> 2));
|
||||||
|
|
||||||
scfBest = scf;
|
scfBest = scf;
|
||||||
|
|
||||||
/* calc real distortion */
|
/* calc real distortion */
|
||||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||||
*minScfCalculated = scf;
|
*minScfCalculated = scf;
|
||||||
if(!sfbDist)
|
if(!sfbDist)
|
||||||
return scfBest;
|
return scfBest;
|
||||||
|
|
||||||
if (sfbDist > thresh125) {
|
if (sfbDist > thresh125) {
|
||||||
Word32 scfEstimated;
|
Word32 scfEstimated;
|
||||||
Word32 sfbDistBest;
|
Word32 sfbDistBest;
|
||||||
scfEstimated = scf;
|
scfEstimated = scf;
|
||||||
sfbDistBest = sfbDist;
|
sfbDistBest = sfbDist;
|
||||||
|
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
while (sfbDist > thresh125 && (cnt < 3)) {
|
while (sfbDist > thresh125 && (cnt < 3)) {
|
||||||
|
|
||||||
scf = scf + 1;
|
scf = scf + 1;
|
||||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||||
|
|
||||||
if (sfbDist < sfbDistBest) {
|
if (sfbDist < sfbDistBest) {
|
||||||
scfBest = scf;
|
scfBest = scf;
|
||||||
sfbDistBest = sfbDist;
|
sfbDistBest = sfbDist;
|
||||||
}
|
}
|
||||||
cnt = cnt + 1;
|
cnt = cnt + 1;
|
||||||
}
|
}
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
scf = scfEstimated;
|
scf = scfEstimated;
|
||||||
sfbDist = sfbDistBest;
|
sfbDist = sfbDistBest;
|
||||||
while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) {
|
while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) {
|
||||||
|
|
||||||
scf = scf - 1;
|
scf = scf - 1;
|
||||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||||
|
|
||||||
if (sfbDist < sfbDistBest) {
|
if (sfbDist < sfbDistBest) {
|
||||||
scfBest = scf;
|
scfBest = scf;
|
||||||
sfbDistBest = sfbDist;
|
sfbDistBest = sfbDist;
|
||||||
}
|
}
|
||||||
*minScfCalculated = scf;
|
*minScfCalculated = scf;
|
||||||
cnt = cnt + 1;
|
cnt = cnt + 1;
|
||||||
}
|
}
|
||||||
*dist = sfbDistBest;
|
*dist = sfbDistBest;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Word32 sfbDistBest;
|
Word32 sfbDistBest;
|
||||||
Word32 sfbDistAllowed;
|
Word32 sfbDistAllowed;
|
||||||
Word32 thresh08 = fixmul(COEF08_31, thresh);
|
Word32 thresh08 = fixmul(COEF08_31, thresh);
|
||||||
sfbDistBest = sfbDist;
|
sfbDistBest = sfbDist;
|
||||||
|
|
||||||
if (sfbDist < thresh08)
|
if (sfbDist < thresh08)
|
||||||
sfbDistAllowed = sfbDist;
|
sfbDistAllowed = sfbDist;
|
||||||
else
|
else
|
||||||
@@ -210,16 +210,16 @@ static Word16 improveScf(Word32 *spec,
|
|||||||
for (cnt=0; cnt<3; cnt++) {
|
for (cnt=0; cnt<3; cnt++) {
|
||||||
scf = scf + 1;
|
scf = scf + 1;
|
||||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||||
|
|
||||||
if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) {
|
if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) {
|
||||||
*minScfCalculated = scfBest + 1;
|
*minScfCalculated = scfBest + 1;
|
||||||
scfBest = scf;
|
scfBest = scf;
|
||||||
sfbDistBest = sfbDist;
|
sfbDistBest = sfbDist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*dist = sfbDistBest;
|
*dist = sfbDistBest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return best scalefactor */
|
/* return best scalefactor */
|
||||||
return scfBest;
|
return scfBest;
|
||||||
}
|
}
|
||||||
@@ -233,10 +233,10 @@ static Word16 improveScf(Word32 *spec,
|
|||||||
static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
|
static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
|
||||||
{
|
{
|
||||||
Word16 scfBits;
|
Word16 scfBits;
|
||||||
|
|
||||||
scfBits = bitCountScalefactorDelta(scfLeft - scf) +
|
scfBits = bitCountScalefactorDelta(scfLeft - scf) +
|
||||||
bitCountScalefactorDelta(scf - scfRight);
|
bitCountScalefactorDelta(scf - scfRight);
|
||||||
|
|
||||||
return scfBits;
|
return scfBits;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
|
|||||||
* function name: calcSingleSpecPe
|
* function name: calcSingleSpecPe
|
||||||
* description: ldRatio = log2(en(n)) - 0,375*scfGain(n)
|
* description: ldRatio = log2(en(n)) - 0,375*scfGain(n)
|
||||||
* nbits = 0.7*nLines*ldRation for ldRation >= c1
|
* nbits = 0.7*nLines*ldRation for ldRation >= c1
|
||||||
* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1
|
* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
|
static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
|
||||||
@@ -253,18 +253,18 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
|
|||||||
Word32 specPe;
|
Word32 specPe;
|
||||||
Word32 ldRatio;
|
Word32 ldRatio;
|
||||||
Word32 scf3;
|
Word32 scf3;
|
||||||
|
|
||||||
ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */
|
ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */
|
||||||
scf3 = scf + scf + scf;
|
scf3 = scf + scf + scf;
|
||||||
ldRatio = ldRatio - scf3;
|
ldRatio = ldRatio - scf3;
|
||||||
|
|
||||||
if (ldRatio < PE_C1_8) {
|
if (ldRatio < PE_C1_8) {
|
||||||
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
||||||
ldRatio = (ldRatio + PE_C2_16) >> 1;
|
ldRatio = (ldRatio + PE_C2_16) >> 1;
|
||||||
}
|
}
|
||||||
specPe = nLines * ldRatio;
|
specPe = nLines * ldRatio;
|
||||||
specPe = (specPe * PE_SCALE) >> 14;
|
specPe = (specPe * PE_SCALE) >> 14;
|
||||||
|
|
||||||
return saturate(specPe);
|
return saturate(specPe);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,53 +275,53 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
|
|||||||
* description: count different scf bits used
|
* description: count different scf bits used
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew,
|
static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew,
|
||||||
Word16 sfbCnt, Word16 startSfb, Word16 stopSfb)
|
Word16 sfbCnt, Word16 startSfb, Word16 stopSfb)
|
||||||
{
|
{
|
||||||
Word32 scfBitsDiff;
|
Word32 scfBitsDiff;
|
||||||
Word32 sfb, sfbLast;
|
Word32 sfb, sfbLast;
|
||||||
Word32 sfbPrev, sfbNext;
|
Word32 sfbPrev, sfbNext;
|
||||||
|
|
||||||
scfBitsDiff = 0;
|
scfBitsDiff = 0;
|
||||||
sfb = 0;
|
sfb = 0;
|
||||||
|
|
||||||
/* search for first relevant sfb */
|
/* search for first relevant sfb */
|
||||||
sfbLast = startSfb;
|
sfbLast = startSfb;
|
||||||
while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) {
|
while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) {
|
||||||
|
|
||||||
sfbLast = sfbLast + 1;
|
sfbLast = sfbLast + 1;
|
||||||
}
|
}
|
||||||
/* search for previous relevant sfb and count diff */
|
/* search for previous relevant sfb and count diff */
|
||||||
sfbPrev = startSfb - 1;
|
sfbPrev = startSfb - 1;
|
||||||
while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) {
|
while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) {
|
||||||
|
|
||||||
sfbPrev = sfbPrev - 1;
|
sfbPrev = sfbPrev - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sfbPrev>=0) {
|
if (sfbPrev>=0) {
|
||||||
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) -
|
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) -
|
||||||
bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]);
|
bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]);
|
||||||
}
|
}
|
||||||
/* now loop through all sfbs and count diffs of relevant sfbs */
|
/* now loop through all sfbs and count diffs of relevant sfbs */
|
||||||
for (sfb=sfbLast+1; sfb<stopSfb; sfb++) {
|
for (sfb=sfbLast+1; sfb<stopSfb; sfb++) {
|
||||||
|
|
||||||
if (scfOld[sfb] != VOAAC_SHRT_MIN) {
|
if (scfOld[sfb] != VOAAC_SHRT_MIN) {
|
||||||
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) -
|
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) -
|
||||||
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]);
|
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]);
|
||||||
sfbLast = sfb;
|
sfbLast = sfb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* search for next relevant sfb and count diff */
|
/* search for next relevant sfb and count diff */
|
||||||
sfbNext = stopSfb;
|
sfbNext = stopSfb;
|
||||||
while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) {
|
while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) {
|
||||||
|
|
||||||
sfbNext = sfbNext + 1;
|
sfbNext = sfbNext + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sfbNext < sfbCnt)
|
if (sfbNext < sfbCnt)
|
||||||
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) -
|
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) -
|
||||||
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]);
|
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]);
|
||||||
|
|
||||||
return saturate(scfBitsDiff);
|
return saturate(scfBitsDiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,52 +331,52 @@ static Word16 calcSpecPeDiff(Word16 *scfOld,
|
|||||||
Word16 *logSfbEnergy,
|
Word16 *logSfbEnergy,
|
||||||
Word16 *logSfbFormFactor,
|
Word16 *logSfbFormFactor,
|
||||||
Word16 *sfbNRelevantLines,
|
Word16 *sfbNRelevantLines,
|
||||||
Word16 startSfb,
|
Word16 startSfb,
|
||||||
Word16 stopSfb)
|
Word16 stopSfb)
|
||||||
{
|
{
|
||||||
Word32 specPeDiff;
|
Word32 specPeDiff;
|
||||||
Word32 sfb;
|
Word32 sfb;
|
||||||
|
|
||||||
specPeDiff = 0;
|
specPeDiff = 0;
|
||||||
|
|
||||||
/* loop through all sfbs and count pe difference */
|
/* loop through all sfbs and count pe difference */
|
||||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||||
|
|
||||||
|
|
||||||
if (scfOld[sfb] != VOAAC_SHRT_MIN) {
|
if (scfOld[sfb] != VOAAC_SHRT_MIN) {
|
||||||
Word32 ldRatioOld, ldRatioNew;
|
Word32 ldRatioOld, ldRatioNew;
|
||||||
Word32 scf3;
|
Word32 scf3;
|
||||||
|
|
||||||
|
|
||||||
if (sfbConstPePart[sfb] == MIN_16) {
|
if (sfbConstPePart[sfb] == MIN_16) {
|
||||||
sfbConstPePart[sfb] = ((logSfbEnergy[sfb] -
|
sfbConstPePart[sfb] = ((logSfbEnergy[sfb] -
|
||||||
logSfbFormFactor[sfb]) + 11-8*4+3) >> 2;
|
logSfbFormFactor[sfb]) + 11-8*4+3) >> 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ldRatioOld = sfbConstPePart[sfb] << 3;
|
ldRatioOld = sfbConstPePart[sfb] << 3;
|
||||||
scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb];
|
scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb];
|
||||||
ldRatioOld = ldRatioOld - scf3;
|
ldRatioOld = ldRatioOld - scf3;
|
||||||
ldRatioNew = sfbConstPePart[sfb] << 3;
|
ldRatioNew = sfbConstPePart[sfb] << 3;
|
||||||
scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb];
|
scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb];
|
||||||
ldRatioNew = ldRatioNew - scf3;
|
ldRatioNew = ldRatioNew - scf3;
|
||||||
|
|
||||||
if (ldRatioOld < PE_C1_8) {
|
if (ldRatioOld < PE_C1_8) {
|
||||||
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
||||||
ldRatioOld = (ldRatioOld + PE_C2_16) >> 1;
|
ldRatioOld = (ldRatioOld + PE_C2_16) >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ldRatioNew < PE_C1_8) {
|
if (ldRatioNew < PE_C1_8) {
|
||||||
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
||||||
ldRatioNew = (ldRatioNew + PE_C2_16) >> 1;
|
ldRatioNew = (ldRatioNew + PE_C2_16) >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld);
|
specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
specPeDiff = (specPeDiff * PE_SCALE) >> 14;
|
specPeDiff = (specPeDiff * PE_SCALE) >> 14;
|
||||||
|
|
||||||
return saturate(specPeDiff);
|
return saturate(specPeDiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -390,9 +390,9 @@ static Word16 calcSpecPeDiff(Word16 *scfOld,
|
|||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||||
Word16 *scf,
|
Word16 *scf,
|
||||||
Word16 *minScf,
|
Word16 *minScf,
|
||||||
Word32 *sfbDist,
|
Word32 *sfbDist,
|
||||||
Word16 *sfbConstPePart,
|
Word16 *sfbConstPePart,
|
||||||
Word16 *logSfbEnergy,
|
Word16 *logSfbEnergy,
|
||||||
Word16 *logSfbFormFactor,
|
Word16 *logSfbFormFactor,
|
||||||
@@ -411,94 +411,94 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
|||||||
Word16 *prevScfNext = psyOutChan->prevScfNext;
|
Word16 *prevScfNext = psyOutChan->prevScfNext;
|
||||||
Word16 *deltaPeLast = psyOutChan->deltaPeLast;
|
Word16 *deltaPeLast = psyOutChan->deltaPeLast;
|
||||||
Flag updateMinScfCalculated;
|
Flag updateMinScfCalculated;
|
||||||
|
|
||||||
success = 0;
|
success = 0;
|
||||||
deltaPe = 0;
|
deltaPe = 0;
|
||||||
|
|
||||||
for(j=0;j<psyOutChan->sfbCnt;j++){
|
for(j=0;j<psyOutChan->sfbCnt;j++){
|
||||||
prevScfLast[j] = MAX_16;
|
prevScfLast[j] = MAX_16;
|
||||||
prevScfNext[j] = MAX_16;
|
prevScfNext[j] = MAX_16;
|
||||||
deltaPeLast[j] = MAX_16;
|
deltaPeLast[j] = MAX_16;
|
||||||
}
|
}
|
||||||
|
|
||||||
sfbLast = -1;
|
sfbLast = -1;
|
||||||
sfbAct = -1;
|
sfbAct = -1;
|
||||||
sfbNext = -1;
|
sfbNext = -1;
|
||||||
scfLast = 0;
|
scfLast = 0;
|
||||||
scfNext = 0;
|
scfNext = 0;
|
||||||
scfMin = MAX_16;
|
scfMin = MAX_16;
|
||||||
do {
|
do {
|
||||||
/* search for new relevant sfb */
|
/* search for new relevant sfb */
|
||||||
sfbNext = sfbNext + 1;
|
sfbNext = sfbNext + 1;
|
||||||
while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) {
|
while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) {
|
||||||
|
|
||||||
sfbNext = sfbNext + 1;
|
sfbNext = sfbNext + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
|
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
|
||||||
/* relevant scfs to the left and to the right */
|
/* relevant scfs to the left and to the right */
|
||||||
scfAct = scf[sfbAct];
|
scfAct = scf[sfbAct];
|
||||||
scfLast = scf + sfbLast;
|
scfLast = scf + sfbLast;
|
||||||
scfNext = scf + sfbNext;
|
scfNext = scf + sfbNext;
|
||||||
scfMin = min(*scfLast, *scfNext);
|
scfMin = min(*scfLast, *scfNext);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
|
if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
|
||||||
/* first relevant scf */
|
/* first relevant scf */
|
||||||
scfAct = scf[sfbAct];
|
scfAct = scf[sfbAct];
|
||||||
scfLast = &scfAct;
|
scfLast = &scfAct;
|
||||||
scfNext = scf + sfbNext;
|
scfNext = scf + sfbNext;
|
||||||
scfMin = *scfNext;
|
scfMin = *scfNext;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) {
|
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) {
|
||||||
/* last relevant scf */
|
/* last relevant scf */
|
||||||
scfAct = scf[sfbAct];
|
scfAct = scf[sfbAct];
|
||||||
scfLast = scf + sfbLast;
|
scfLast = scf + sfbLast;
|
||||||
scfNext = &scfAct;
|
scfNext = &scfAct;
|
||||||
scfMin = *scfLast;
|
scfMin = *scfLast;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sfbAct>=0)
|
if (sfbAct>=0)
|
||||||
scfMin = max(scfMin, minScf[sfbAct]);
|
scfMin = max(scfMin, minScf[sfbAct]);
|
||||||
|
|
||||||
if ((sfbAct >= 0) &&
|
if ((sfbAct >= 0) &&
|
||||||
(sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) &&
|
(sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) &&
|
||||||
scfAct > scfMin &&
|
scfAct > scfMin &&
|
||||||
(*scfLast != prevScfLast[sfbAct] ||
|
(*scfLast != prevScfLast[sfbAct] ||
|
||||||
*scfNext != prevScfNext[sfbAct] ||
|
*scfNext != prevScfNext[sfbAct] ||
|
||||||
deltaPe < deltaPeLast[sfbAct])) {
|
deltaPe < deltaPeLast[sfbAct])) {
|
||||||
success = 0;
|
success = 0;
|
||||||
|
|
||||||
/* estimate required bits for actual scf */
|
/* estimate required bits for actual scf */
|
||||||
if (sfbConstPePart[sfbAct] == MIN_16) {
|
if (sfbConstPePart[sfbAct] == MIN_16) {
|
||||||
sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] -
|
sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] -
|
||||||
logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */
|
logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */
|
||||||
|
|
||||||
if (sfbConstPePart[sfbAct] < 0)
|
if (sfbConstPePart[sfbAct] < 0)
|
||||||
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3;
|
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3;
|
||||||
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2;
|
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
|
sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
|
||||||
countSingleScfBits(scfAct, *scfLast, *scfNext);
|
countSingleScfBits(scfAct, *scfLast, *scfNext);
|
||||||
deltaPeNew = deltaPe;
|
deltaPeNew = deltaPe;
|
||||||
updateMinScfCalculated = 1;
|
updateMinScfCalculated = 1;
|
||||||
do {
|
do {
|
||||||
scfAct = scfAct - 1;
|
scfAct = scfAct - 1;
|
||||||
/* check only if the same check was not done before */
|
/* check only if the same check was not done before */
|
||||||
|
|
||||||
if (scfAct < minScfCalculated[sfbAct]) {
|
if (scfAct < minScfCalculated[sfbAct]) {
|
||||||
sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
|
sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
|
||||||
countSingleScfBits(scfAct, *scfLast, *scfNext);
|
countSingleScfBits(scfAct, *scfLast, *scfNext);
|
||||||
/* use new scf if no increase in pe and
|
/* use new scf if no increase in pe and
|
||||||
quantization error is smaller */
|
quantization error is smaller */
|
||||||
deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld;
|
deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld;
|
||||||
|
|
||||||
if (deltaPeTmp < 10) {
|
if (deltaPeTmp < 10) {
|
||||||
sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+
|
sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+
|
||||||
psyOutChan->sfbOffsets[sfbAct],
|
psyOutChan->sfbOffsets[sfbAct],
|
||||||
@@ -506,46 +506,46 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
|||||||
scfAct);
|
scfAct);
|
||||||
if (sfbDistNew < sfbDist[sfbAct]) {
|
if (sfbDistNew < sfbDist[sfbAct]) {
|
||||||
/* success, replace scf by new one */
|
/* success, replace scf by new one */
|
||||||
scf[sfbAct] = scfAct;
|
scf[sfbAct] = scfAct;
|
||||||
sfbDist[sfbAct] = sfbDistNew;
|
sfbDist[sfbAct] = sfbDistNew;
|
||||||
deltaPeNew = deltaPeTmp;
|
deltaPeNew = deltaPeTmp;
|
||||||
success = 1;
|
success = 1;
|
||||||
}
|
}
|
||||||
/* mark as already checked */
|
/* mark as already checked */
|
||||||
|
|
||||||
if (updateMinScfCalculated) {
|
if (updateMinScfCalculated) {
|
||||||
minScfCalculated[sfbAct] = scfAct;
|
minScfCalculated[sfbAct] = scfAct;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
updateMinScfCalculated = 0;
|
updateMinScfCalculated = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (scfAct > scfMin);
|
} while (scfAct > scfMin);
|
||||||
deltaPe = deltaPeNew;
|
deltaPe = deltaPeNew;
|
||||||
/* save parameters to avoid multiple computations of the same sfb */
|
/* save parameters to avoid multiple computations of the same sfb */
|
||||||
prevScfLast[sfbAct] = *scfLast;
|
prevScfLast[sfbAct] = *scfLast;
|
||||||
prevScfNext[sfbAct] = *scfNext;
|
prevScfNext[sfbAct] = *scfNext;
|
||||||
deltaPeLast[sfbAct] = deltaPe;
|
deltaPeLast[sfbAct] = deltaPe;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success && restartOnSuccess) {
|
if (success && restartOnSuccess) {
|
||||||
/* start again at first sfb */
|
/* start again at first sfb */
|
||||||
sfbLast = -1;
|
sfbLast = -1;
|
||||||
sfbAct = -1;
|
sfbAct = -1;
|
||||||
sfbNext = -1;
|
sfbNext = -1;
|
||||||
scfLast = 0;
|
scfLast = 0;
|
||||||
scfNext = 0;
|
scfNext = 0;
|
||||||
scfMin = MAX_16;
|
scfMin = MAX_16;
|
||||||
success = 0;
|
success = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* shift sfbs for next band */
|
/* shift sfbs for next band */
|
||||||
sfbLast = sfbAct;
|
sfbLast = sfbAct;
|
||||||
sfbAct = sfbNext;
|
sfbAct = sfbNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (sfbNext < psyOutChan->sfbCnt);
|
} while (sfbNext < psyOutChan->sfbCnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,9 +557,9 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
|||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||||
Word16 *scf,
|
Word16 *scf,
|
||||||
Word16 *minScf,
|
Word16 *minScf,
|
||||||
Word32 *sfbDist,
|
Word32 *sfbDist,
|
||||||
Word16 *sfbConstPePart,
|
Word16 *sfbConstPePart,
|
||||||
Word16 *logSfbEnergy,
|
Word16 *logSfbEnergy,
|
||||||
Word16 *logSfbFormFactor,
|
Word16 *logSfbFormFactor,
|
||||||
@@ -574,95 +574,95 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
|||||||
Word32 *sfbDistNew = psyOutChan->sfbDistNew;
|
Word32 *sfbDistNew = psyOutChan->sfbDistNew;
|
||||||
Word16 *scfTmp = psyOutChan->prevScfLast;
|
Word16 *scfTmp = psyOutChan->prevScfLast;
|
||||||
|
|
||||||
deltaPe = 0;
|
deltaPe = 0;
|
||||||
sfbCnt = psyOutChan->sfbCnt;
|
sfbCnt = psyOutChan->sfbCnt;
|
||||||
|
|
||||||
/* calc min and max scalfactors */
|
/* calc min and max scalfactors */
|
||||||
scfMin = MAX_16;
|
scfMin = MAX_16;
|
||||||
scfMax = MIN_16;
|
scfMax = MIN_16;
|
||||||
for (sfb=0; sfb<sfbCnt; sfb++) {
|
for (sfb=0; sfb<sfbCnt; sfb++) {
|
||||||
|
|
||||||
if (scf[sfb] != MIN_16) {
|
if (scf[sfb] != MIN_16) {
|
||||||
scfMin = min(scfMin, scf[sfb]);
|
scfMin = min(scfMin, scf[sfb]);
|
||||||
scfMax = max(scfMax, scf[sfb]);
|
scfMax = max(scfMax, scf[sfb]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scfMax != MIN_16) {
|
if (scfMax != MIN_16) {
|
||||||
|
|
||||||
scfAct = scfMax;
|
scfAct = scfMax;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
scfAct = scfAct - 1;
|
scfAct = scfAct - 1;
|
||||||
for (sfb=0; sfb<sfbCnt; sfb++) {
|
for (sfb=0; sfb<sfbCnt; sfb++) {
|
||||||
scfTmp[sfb] = scf[sfb];
|
scfTmp[sfb] = scf[sfb];
|
||||||
}
|
}
|
||||||
stopSfb = 0;
|
stopSfb = 0;
|
||||||
do {
|
do {
|
||||||
sfb = stopSfb;
|
sfb = stopSfb;
|
||||||
|
|
||||||
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) {
|
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) {
|
||||||
sfb = sfb + 1;
|
sfb = sfb + 1;
|
||||||
}
|
}
|
||||||
startSfb = sfb;
|
startSfb = sfb;
|
||||||
sfb = sfb + 1;
|
sfb = sfb + 1;
|
||||||
|
|
||||||
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) {
|
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) {
|
||||||
sfb = sfb + 1;
|
sfb = sfb + 1;
|
||||||
}
|
}
|
||||||
stopSfb = sfb;
|
stopSfb = sfb;
|
||||||
|
|
||||||
possibleRegionFound = 0;
|
possibleRegionFound = 0;
|
||||||
|
|
||||||
if (startSfb < sfbCnt) {
|
if (startSfb < sfbCnt) {
|
||||||
possibleRegionFound = 1;
|
possibleRegionFound = 1;
|
||||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||||
|
|
||||||
if (scf[sfb]!=MIN_16) {
|
if (scf[sfb]!=MIN_16) {
|
||||||
|
|
||||||
if (scfAct < minScf[sfb]) {
|
if (scfAct < minScf[sfb]) {
|
||||||
possibleRegionFound = 0;
|
possibleRegionFound = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (possibleRegionFound) { /* region found */
|
if (possibleRegionFound) { /* region found */
|
||||||
|
|
||||||
/* replace scfs in region by scfAct */
|
/* replace scfs in region by scfAct */
|
||||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||||
|
|
||||||
if (scfTmp[sfb]!=MIN_16)
|
if (scfTmp[sfb]!=MIN_16)
|
||||||
scfTmp[sfb] = scfAct;
|
scfTmp[sfb] = scfAct;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* estimate change in bit demand for new scfs */
|
/* estimate change in bit demand for new scfs */
|
||||||
deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb);
|
deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb);
|
||||||
deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart,
|
deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart,
|
||||||
logSfbEnergy, logSfbFormFactor, sfbNRelevantLines,
|
logSfbEnergy, logSfbFormFactor, sfbNRelevantLines,
|
||||||
startSfb, stopSfb);
|
startSfb, stopSfb);
|
||||||
deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe;
|
deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe;
|
||||||
|
|
||||||
|
|
||||||
if (deltaPeNew < 10) {
|
if (deltaPeNew < 10) {
|
||||||
Word32 distOldSum, distNewSum;
|
Word32 distOldSum, distNewSum;
|
||||||
|
|
||||||
/* quantize and calc sum of new distortion */
|
/* quantize and calc sum of new distortion */
|
||||||
distOldSum = 0;
|
distOldSum = 0;
|
||||||
distNewSum = 0;
|
distNewSum = 0;
|
||||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||||
|
|
||||||
if (scfTmp[sfb] != MIN_16) {
|
if (scfTmp[sfb] != MIN_16) {
|
||||||
distOldSum = L_add(distOldSum, sfbDist[sfb]);
|
distOldSum = L_add(distOldSum, sfbDist[sfb]);
|
||||||
|
|
||||||
sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum +
|
sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum +
|
||||||
psyOutChan->sfbOffsets[sfb],
|
psyOutChan->sfbOffsets[sfb],
|
||||||
(psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]),
|
(psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]),
|
||||||
scfAct);
|
scfAct);
|
||||||
|
|
||||||
|
|
||||||
if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) {
|
if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) {
|
||||||
distNewSum = distOldSum << 1;
|
distNewSum = distOldSum << 1;
|
||||||
break;
|
break;
|
||||||
@@ -670,20 +670,20 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
|||||||
distNewSum = L_add(distNewSum, sfbDistNew[sfb]);
|
distNewSum = L_add(distNewSum, sfbDistNew[sfb]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (distNewSum < distOldSum) {
|
if (distNewSum < distOldSum) {
|
||||||
deltaPe = deltaPeNew;
|
deltaPe = deltaPeNew;
|
||||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||||
|
|
||||||
if (scf[sfb]!=MIN_16) {
|
if (scf[sfb]!=MIN_16) {
|
||||||
scf[sfb] = scfAct;
|
scf[sfb] = scfAct;
|
||||||
sfbDist[sfb] = sfbDistNew[sfb];
|
sfbDist[sfb] = sfbDistNew[sfb];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (stopSfb <= sfbCnt);
|
} while (stopSfb <= sfbCnt);
|
||||||
} while (scfAct > scfMin);
|
} while (scfAct > scfMin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -710,125 +710,125 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan,
|
|||||||
Word32 *sfbDist = psyOutChan->sfbDist;
|
Word32 *sfbDist = psyOutChan->sfbDist;
|
||||||
Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant;
|
Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant;
|
||||||
Word16 *minScfCalculated = psyOutChan->minScfCalculated;
|
Word16 *minScfCalculated = psyOutChan->minScfCalculated;
|
||||||
|
|
||||||
|
|
||||||
for (i=0; i<psyOutChan->sfbCnt; i++) {
|
for (i=0; i<psyOutChan->sfbCnt; i++) {
|
||||||
Word32 sbfwith, sbfStart;
|
Word32 sbfwith, sbfStart;
|
||||||
Word32 *mdctSpec;
|
Word32 *mdctSpec;
|
||||||
thresh = psyOutChan->sfbThreshold[i];
|
thresh = psyOutChan->sfbThreshold[i];
|
||||||
energy = psyOutChan->sfbEnergy[i];
|
energy = psyOutChan->sfbEnergy[i];
|
||||||
|
|
||||||
sbfStart = psyOutChan->sfbOffsets[i];
|
sbfStart = psyOutChan->sfbOffsets[i];
|
||||||
sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
|
sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
|
||||||
mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
|
mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
|
||||||
|
|
||||||
maxSpec = 0;
|
maxSpec = 0;
|
||||||
/* maximum of spectrum */
|
/* maximum of spectrum */
|
||||||
for (j=sbfwith; j; j-- ) {
|
for (j=sbfwith; j; j-- ) {
|
||||||
Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
|
Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
|
||||||
maxSpec |= absSpec;
|
maxSpec |= absSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* scfs without energy or with thresh>energy are marked with MIN_16 */
|
/* scfs without energy or with thresh>energy are marked with MIN_16 */
|
||||||
scf[i] = MIN_16;
|
scf[i] = MIN_16;
|
||||||
minSfMaxQuant[i] = MIN_16;
|
minSfMaxQuant[i] = MIN_16;
|
||||||
|
|
||||||
if ((maxSpec > 0) && (energy > thresh)) {
|
if ((maxSpec > 0) && (energy > thresh)) {
|
||||||
|
|
||||||
energyPart = logSfbFormFactor[i];
|
energyPart = logSfbFormFactor[i];
|
||||||
thresholdPart = iLog4(thresh);
|
thresholdPart = iLog4(thresh);
|
||||||
/* -20 = 4*log2(6.75) - 32 */
|
/* -20 = 4*log2(6.75) - 32 */
|
||||||
scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15;
|
scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15;
|
||||||
|
|
||||||
minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68 -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */
|
minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68 -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */
|
||||||
|
|
||||||
|
|
||||||
if (minSfMaxQuant[i] > scfInt) {
|
if (minSfMaxQuant[i] > scfInt) {
|
||||||
scfInt = minSfMaxQuant[i];
|
scfInt = minSfMaxQuant[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find better scalefactor with analysis by synthesis */
|
/* find better scalefactor with analysis by synthesis */
|
||||||
scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
|
scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
|
||||||
sbfwith,
|
sbfwith,
|
||||||
thresh, scfInt, minSfMaxQuant[i],
|
thresh, scfInt, minSfMaxQuant[i],
|
||||||
&sfbDist[i], &minScfCalculated[i]);
|
&sfbDist[i], &minScfCalculated[i]);
|
||||||
|
|
||||||
scf[i] = scfInt;
|
scf[i] = scfInt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* scalefactor differece reduction */
|
/* scalefactor differece reduction */
|
||||||
{
|
{
|
||||||
Word16 sfbConstPePart[MAX_GROUPED_SFB];
|
Word16 sfbConstPePart[MAX_GROUPED_SFB];
|
||||||
for(i=0;i<psyOutChan->sfbCnt;i++) {
|
for(i=0;i<psyOutChan->sfbCnt;i++) {
|
||||||
sfbConstPePart[i] = MIN_16;
|
sfbConstPePart[i] = MIN_16;
|
||||||
}
|
}
|
||||||
|
|
||||||
assimilateSingleScf(psyOutChan, scf,
|
assimilateSingleScf(psyOutChan, scf,
|
||||||
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
|
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
|
||||||
logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
|
logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
|
||||||
|
|
||||||
assimilateMultipleScf(psyOutChan, scf,
|
assimilateMultipleScf(psyOutChan, scf,
|
||||||
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
|
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
|
||||||
logSfbFormFactor, sfbNRelevantLines);
|
logSfbFormFactor, sfbNRelevantLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get max scalefac for global gain */
|
/* get max scalefac for global gain */
|
||||||
maxScf = MIN_16;
|
maxScf = MIN_16;
|
||||||
minScf = MAX_16;
|
minScf = MAX_16;
|
||||||
for (i=0; i<psyOutChan->sfbCnt; i++) {
|
for (i=0; i<psyOutChan->sfbCnt; i++) {
|
||||||
|
|
||||||
if (maxScf < scf[i]) {
|
if (maxScf < scf[i]) {
|
||||||
maxScf = scf[i];
|
maxScf = scf[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((scf[i] != MIN_16) && (minScf > scf[i])) {
|
if ((scf[i] != MIN_16) && (minScf > scf[i])) {
|
||||||
minScf = scf[i];
|
minScf = scf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* limit scf delta */
|
/* limit scf delta */
|
||||||
maxAllowedScf = minScf + MAX_SCF_DELTA;
|
maxAllowedScf = minScf + MAX_SCF_DELTA;
|
||||||
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
||||||
|
|
||||||
if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) {
|
if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) {
|
||||||
scf[i] = maxAllowedScf;
|
scf[i] = maxAllowedScf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* new maxScf if any scf has been limited */
|
/* new maxScf if any scf has been limited */
|
||||||
|
|
||||||
if (maxAllowedScf < maxScf) {
|
if (maxAllowedScf < maxScf) {
|
||||||
maxScf = maxAllowedScf;
|
maxScf = maxAllowedScf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calc loop scalefactors */
|
/* calc loop scalefactors */
|
||||||
|
|
||||||
if (maxScf > MIN_16) {
|
if (maxScf > MIN_16) {
|
||||||
*globalGain = maxScf;
|
*globalGain = maxScf;
|
||||||
lastSf = 0;
|
lastSf = 0;
|
||||||
|
|
||||||
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
||||||
|
|
||||||
if (scf[i] == MIN_16) {
|
if (scf[i] == MIN_16) {
|
||||||
scf[i] = lastSf;
|
scf[i] = lastSf;
|
||||||
/* set band explicitely to zero */
|
/* set band explicitely to zero */
|
||||||
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
|
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
|
||||||
psyOutChan->mdctSpectrum[j] = 0;
|
psyOutChan->mdctSpectrum[j] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
scf[i] = maxScf - scf[i];
|
scf[i] = maxScf - scf[i];
|
||||||
lastSf = scf[i];
|
lastSf = scf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
*globalGain = 0;
|
*globalGain = 0;
|
||||||
/* set spectrum explicitely to zero */
|
/* set spectrum explicitely to zero */
|
||||||
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
||||||
scf[i] = 0;
|
scf[i] = 0;
|
||||||
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
|
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
|
||||||
psyOutChan->mdctSpectrum[j] = 0;
|
psyOutChan->mdctSpectrum[j] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -848,7 +848,7 @@ CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
|
|||||||
const Word16 nChannels)
|
const Word16 nChannels)
|
||||||
{
|
{
|
||||||
Word16 j;
|
Word16 j;
|
||||||
|
|
||||||
for (j=0; j<nChannels; j++) {
|
for (j=0; j<nChannels; j++) {
|
||||||
CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]);
|
CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]);
|
||||||
}
|
}
|
||||||
@@ -869,7 +869,7 @@ EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
const Word16 nChannels)
|
const Word16 nChannels)
|
||||||
{
|
{
|
||||||
Word16 j;
|
Word16 j;
|
||||||
|
|
||||||
for (j=0; j<nChannels; j++) {
|
for (j=0; j<nChannels; j++) {
|
||||||
EstimateScaleFactorsChannel(&psyOutChannel[j],
|
EstimateScaleFactorsChannel(&psyOutChannel[j],
|
||||||
qcOutChannel[j].scf,
|
qcOutChannel[j].scf,
|
||||||
|
|||||||
@@ -52,9 +52,9 @@ static Word16 countMsMaskBits(Word16 sfbCnt,
|
|||||||
struct TOOLSINFO *toolsInfo)
|
struct TOOLSINFO *toolsInfo)
|
||||||
{
|
{
|
||||||
Word16 msBits, sfbOff, sfb;
|
Word16 msBits, sfbOff, sfb;
|
||||||
msBits = 0;
|
msBits = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch(toolsInfo->msDigest) {
|
switch(toolsInfo->msDigest) {
|
||||||
case MS_NONE:
|
case MS_NONE:
|
||||||
case MS_ALL:
|
case MS_ALL:
|
||||||
@@ -85,34 +85,34 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
|
|||||||
Word32 coefBits;
|
Word32 coefBits;
|
||||||
Word16 *ptcoef;
|
Word16 *ptcoef;
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
if (blockType == 2)
|
if (blockType == 2)
|
||||||
numOfWindows = 8;
|
numOfWindows = 8;
|
||||||
else
|
else
|
||||||
numOfWindows = 1;
|
numOfWindows = 1;
|
||||||
tnsPresent = 0;
|
tnsPresent = 0;
|
||||||
|
|
||||||
for (i=0; i<numOfWindows; i++) {
|
for (i=0; i<numOfWindows; i++) {
|
||||||
|
|
||||||
if (tnsInfo->tnsActive[i]!=0) {
|
if (tnsInfo->tnsActive[i]!=0) {
|
||||||
tnsPresent = 1;
|
tnsPresent = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tnsPresent) {
|
if (tnsPresent) {
|
||||||
/* there is data to be written*/
|
/* there is data to be written*/
|
||||||
/*count += 1; */
|
/*count += 1; */
|
||||||
for (i=0; i<numOfWindows; i++) {
|
for (i=0; i<numOfWindows; i++) {
|
||||||
|
|
||||||
if (blockType == 2)
|
if (blockType == 2)
|
||||||
count += 1;
|
count += 1;
|
||||||
else
|
else
|
||||||
count += 2;
|
count += 2;
|
||||||
|
|
||||||
if (tnsInfo->tnsActive[i]) {
|
if (tnsInfo->tnsActive[i]) {
|
||||||
count += 1;
|
count += 1;
|
||||||
|
|
||||||
if (blockType == 2) {
|
if (blockType == 2) {
|
||||||
count += 4;
|
count += 4;
|
||||||
count += 3;
|
count += 3;
|
||||||
@@ -121,29 +121,29 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
|
|||||||
count += 6;
|
count += 6;
|
||||||
count += 5;
|
count += 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tnsInfo->order[i]) {
|
if (tnsInfo->order[i]) {
|
||||||
count += 1; /*direction*/
|
count += 1; /*direction*/
|
||||||
count += 1; /*coef_compression */
|
count += 1; /*coef_compression */
|
||||||
|
|
||||||
if (tnsInfo->coefRes[i] == 4) {
|
if (tnsInfo->coefRes[i] == 4) {
|
||||||
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
|
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
|
||||||
coefBits = 3;
|
coefBits = 3;
|
||||||
for(k=0; k<tnsInfo->order[i]; k++) {
|
for(k=0; k<tnsInfo->order[i]; k++) {
|
||||||
|
|
||||||
if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) {
|
if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) {
|
||||||
coefBits = 4;
|
coefBits = 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
coefBits = 2;
|
coefBits = 2;
|
||||||
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
|
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
|
||||||
for(k=0; k<tnsInfo->order[i]; k++) {
|
for(k=0; k<tnsInfo->order[i]; k++) {
|
||||||
|
|
||||||
if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
|
if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
|
||||||
coefBits = 3;
|
coefBits = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,14 +155,14 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************
|
/**********************************************************************************
|
||||||
*
|
*
|
||||||
* function name: countTnsBits
|
* function name: countTnsBits
|
||||||
* description: count tns bit demand
|
* description: count tns bit demand
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
|
static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
|
||||||
@@ -173,29 +173,29 @@ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
|
|||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
*
|
*
|
||||||
* function name: countStaticBitdemand
|
* function name: countStaticBitdemand
|
||||||
* description: count static bit demand include tns
|
* description: count static bit demand include tns
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||||
PSY_OUT_ELEMENT *psyOutElement,
|
PSY_OUT_ELEMENT *psyOutElement,
|
||||||
Word16 channels,
|
Word16 channels,
|
||||||
Word16 adtsUsed)
|
Word16 adtsUsed)
|
||||||
{
|
{
|
||||||
Word32 statBits;
|
Word32 statBits;
|
||||||
Word32 ch;
|
Word32 ch;
|
||||||
|
|
||||||
statBits = 0;
|
statBits = 0;
|
||||||
|
|
||||||
/* if adts used, add 56 bits */
|
/* if adts used, add 56 bits */
|
||||||
if(adtsUsed) statBits += 56;
|
if(adtsUsed) statBits += 56;
|
||||||
|
|
||||||
|
|
||||||
switch (channels) {
|
switch (channels) {
|
||||||
case 1:
|
case 1:
|
||||||
statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS;
|
statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS;
|
||||||
statBits += countTnsBits(&(psyOutChannel[0].tnsInfo),
|
statBits += countTnsBits(&(psyOutChannel[0].tnsInfo),
|
||||||
psyOutChannel[0].windowSequence);
|
psyOutChannel[0].windowSequence);
|
||||||
|
|
||||||
switch(psyOutChannel[0].windowSequence){
|
switch(psyOutChannel[0].windowSequence){
|
||||||
case LONG_WINDOW:
|
case LONG_WINDOW:
|
||||||
case START_WINDOW:
|
case START_WINDOW:
|
||||||
@@ -215,7 +215,7 @@ Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
|||||||
psyOutChannel[0].sfbPerGroup,
|
psyOutChannel[0].sfbPerGroup,
|
||||||
psyOutChannel[0].maxSfbPerGroup,
|
psyOutChannel[0].maxSfbPerGroup,
|
||||||
&psyOutElement->toolsInfo);
|
&psyOutElement->toolsInfo);
|
||||||
|
|
||||||
switch (psyOutChannel[0].windowSequence) {
|
switch (psyOutChannel[0].windowSequence) {
|
||||||
case LONG_WINDOW:
|
case LONG_WINDOW:
|
||||||
case START_WINDOW:
|
case START_WINDOW:
|
||||||
|
|||||||
@@ -100,20 +100,20 @@ static Word16 FreqToBandWithRounding(Word32 freq, /*!< frequen
|
|||||||
/* assert(freq >= 0); */
|
/* assert(freq >= 0); */
|
||||||
shift = norm_l(fs);
|
shift = norm_l(fs);
|
||||||
lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1;
|
lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1;
|
||||||
|
|
||||||
/* freq > fs/2 */
|
/* freq > fs/2 */
|
||||||
temp = lineNumber - bandStartOffset[numOfBands] ;
|
temp = lineNumber - bandStartOffset[numOfBands] ;
|
||||||
if (temp >= 0)
|
if (temp >= 0)
|
||||||
return numOfBands;
|
return numOfBands;
|
||||||
|
|
||||||
/* find band the line number lies in */
|
/* find band the line number lies in */
|
||||||
for (band=0; band<numOfBands; band++) {
|
for (band=0; band<numOfBands; band++) {
|
||||||
temp = bandStartOffset[band + 1] - lineNumber;
|
temp = bandStartOffset[band + 1] - lineNumber;
|
||||||
if (temp > 0) break;
|
if (temp > 0) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
temp = (lineNumber - bandStartOffset[band]);
|
temp = (lineNumber - bandStartOffset[band]);
|
||||||
temp = (temp - (bandStartOffset[band + 1] - lineNumber));
|
temp = (temp - (bandStartOffset[band + 1] - lineNumber));
|
||||||
if ( temp > 0 )
|
if ( temp > 0 )
|
||||||
{
|
{
|
||||||
band = band + 1;
|
band = band + 1;
|
||||||
@@ -139,25 +139,25 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
|
|||||||
{
|
{
|
||||||
|
|
||||||
Word32 bitratePerChannel;
|
Word32 bitratePerChannel;
|
||||||
tC->maxOrder = TNS_MAX_ORDER;
|
tC->maxOrder = TNS_MAX_ORDER;
|
||||||
tC->tnsStartFreq = 1275;
|
tC->tnsStartFreq = 1275;
|
||||||
tC->coefRes = 4;
|
tC->coefRes = 4;
|
||||||
|
|
||||||
/* to avoid integer division */
|
/* to avoid integer division */
|
||||||
if ( sub(channels,2) == 0 ) {
|
if ( sub(channels,2) == 0 ) {
|
||||||
bitratePerChannel = bitRate >> 1;
|
bitratePerChannel = bitRate >> 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bitratePerChannel = bitRate;
|
bitratePerChannel = bitRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx];
|
tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx];
|
||||||
|
|
||||||
tC->tnsActive = active;
|
tC->tnsActive = active;
|
||||||
|
|
||||||
/* now calc band and line borders */
|
/* now calc band and line borders */
|
||||||
tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
|
tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
|
||||||
tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
|
tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
|
||||||
|
|
||||||
tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
|
tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
|
||||||
pC->sfbCnt, (const Word16*)pC->sfbOffset);
|
pC->sfbCnt, (const Word16*)pC->sfbOffset);
|
||||||
@@ -173,18 +173,18 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
|
|||||||
(const Word16*)pC->sfbOffset);
|
(const Word16*)pC->sfbOffset);
|
||||||
|
|
||||||
|
|
||||||
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
||||||
|
|
||||||
tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx];
|
tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx];
|
||||||
tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
|
tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
|
||||||
|
|
||||||
tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
|
tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
|
||||||
|
|
||||||
tC->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx];
|
tC->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx];
|
||||||
|
|
||||||
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
||||||
|
|
||||||
tC->threshold = TNS_GAIN_THRESH;
|
tC->threshold = TNS_GAIN_THRESH;
|
||||||
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
@@ -207,23 +207,23 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
|
|||||||
Word32 bitratePerChannel;
|
Word32 bitratePerChannel;
|
||||||
tC->maxOrder = TNS_MAX_ORDER_SHORT;
|
tC->maxOrder = TNS_MAX_ORDER_SHORT;
|
||||||
tC->tnsStartFreq = 2750;
|
tC->tnsStartFreq = 2750;
|
||||||
tC->coefRes = 3;
|
tC->coefRes = 3;
|
||||||
|
|
||||||
/* to avoid integer division */
|
/* to avoid integer division */
|
||||||
if ( sub(channels,2) == 0 ) {
|
if ( sub(channels,2) == 0 ) {
|
||||||
bitratePerChannel = L_shr(bitRate,1);
|
bitratePerChannel = L_shr(bitRate,1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bitratePerChannel = bitRate;
|
bitratePerChannel = bitRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx];
|
tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx];
|
||||||
|
|
||||||
tC->tnsActive = active;
|
tC->tnsActive = active;
|
||||||
|
|
||||||
/* now calc band and line borders */
|
/* now calc band and line borders */
|
||||||
tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
|
tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
|
||||||
tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
|
tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
|
||||||
|
|
||||||
tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
|
tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
|
||||||
pC->sfbCnt, (const Word16*)pC->sfbOffset);
|
pC->sfbCnt, (const Word16*)pC->sfbOffset);
|
||||||
@@ -239,19 +239,19 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
|
|||||||
(const Word16*)pC->sfbOffset);
|
(const Word16*)pC->sfbOffset);
|
||||||
|
|
||||||
|
|
||||||
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
||||||
|
|
||||||
tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];
|
tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];
|
||||||
|
|
||||||
tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
|
tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
|
||||||
|
|
||||||
tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
|
tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
|
||||||
|
|
||||||
tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];
|
tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];
|
||||||
|
|
||||||
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
||||||
|
|
||||||
tC->threshold = TNS_GAIN_THRESH;
|
tC->threshold = TNS_GAIN_THRESH;
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@@ -259,7 +259,7 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* function name: TnsDetect
|
* function name: TnsDetect
|
||||||
* description: Calculate TNS filter and decide on TNS usage
|
* description: Calculate TNS filter and decide on TNS usage
|
||||||
* returns: 0 if success
|
* returns: 0 if success
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -278,7 +278,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
|||||||
Word32* pWork32 = &pScratchTns[subBlockNumber >> 8];
|
Word32* pWork32 = &pScratchTns[subBlockNumber >> 8];
|
||||||
Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8];
|
Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8];
|
||||||
|
|
||||||
|
|
||||||
if (tC.tnsActive) {
|
if (tC.tnsActive) {
|
||||||
CalcWeightedSpectrum(spectrum,
|
CalcWeightedSpectrum(spectrum,
|
||||||
pWeightedSpectrum,
|
pWeightedSpectrum,
|
||||||
@@ -290,7 +290,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
|||||||
tC.lpcStopBand,
|
tC.lpcStopBand,
|
||||||
pWork32);
|
pWork32);
|
||||||
|
|
||||||
temp = blockType - SHORT_WINDOW;
|
temp = blockType - SHORT_WINDOW;
|
||||||
if ( temp != 0 ) {
|
if ( temp != 0 ) {
|
||||||
predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
|
predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
|
||||||
tC.acfWindow,
|
tC.acfWindow,
|
||||||
@@ -299,15 +299,15 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
|||||||
tnsData->dataRaw.tnsLong.subBlockInfo.parcor);
|
tnsData->dataRaw.tnsLong.subBlockInfo.parcor);
|
||||||
|
|
||||||
|
|
||||||
temp = predictionGain - tC.threshold;
|
temp = predictionGain - tC.threshold;
|
||||||
if ( temp > 0 ) {
|
if ( temp > 0 ) {
|
||||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
|
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
|
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain;
|
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
||||||
@@ -317,28 +317,28 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
|||||||
tC.maxOrder,
|
tC.maxOrder,
|
||||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor);
|
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor);
|
||||||
|
|
||||||
temp = predictionGain - tC.threshold;
|
temp = predictionGain - tC.threshold;
|
||||||
if ( temp > 0 ) {
|
if ( temp > 0 ) {
|
||||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
|
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
|
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain;
|
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
||||||
temp = blockType - SHORT_WINDOW;
|
temp = blockType - SHORT_WINDOW;
|
||||||
if ( temp != 0 ) {
|
if ( temp != 0 ) {
|
||||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
|
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
|
||||||
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0;
|
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
|
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
|
||||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0;
|
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,21 +362,21 @@ void TnsSync(TNS_DATA *tnsDataDest,
|
|||||||
const TNS_SUBBLOCK_INFO *sbInfoSrc;
|
const TNS_SUBBLOCK_INFO *sbInfoSrc;
|
||||||
Word32 i, temp;
|
Word32 i, temp;
|
||||||
|
|
||||||
temp = blockType - SHORT_WINDOW;
|
temp = blockType - SHORT_WINDOW;
|
||||||
if ( temp != 0 ) {
|
if ( temp != 0 ) {
|
||||||
sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
|
sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
|
||||||
sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
|
sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||||
sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) <
|
if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) <
|
||||||
(3 * sbInfoDest->predictionGain)) {
|
(3 * sbInfoDest->predictionGain)) {
|
||||||
sbInfoDest->tnsActive = sbInfoSrc->tnsActive;
|
sbInfoDest->tnsActive = sbInfoSrc->tnsActive;
|
||||||
for ( i=0; i< tC.maxOrder; i++) {
|
for ( i=0; i< tC.maxOrder; i++) {
|
||||||
sbInfoDest->parcor[i] = sbInfoSrc->parcor[i];
|
sbInfoDest->parcor[i] = sbInfoSrc->parcor[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -402,11 +402,11 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
|||||||
Word32 temp;
|
Word32 temp;
|
||||||
TNS_SUBBLOCK_INFO *psubBlockInfo;
|
TNS_SUBBLOCK_INFO *psubBlockInfo;
|
||||||
|
|
||||||
temp_s = blockType - SHORT_WINDOW;
|
temp_s = blockType - SHORT_WINDOW;
|
||||||
if ( temp_s != 0) {
|
if ( temp_s != 0) {
|
||||||
psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
|
psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
|
||||||
if (psubBlockInfo->tnsActive == 0) {
|
if (psubBlockInfo->tnsActive == 0) {
|
||||||
tnsInfo->tnsActive[subBlockNumber] = 0;
|
tnsInfo->tnsActive[subBlockNumber] = 0;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -422,22 +422,22 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
|||||||
tC.coefRes);
|
tC.coefRes);
|
||||||
|
|
||||||
for (i=tC.maxOrder - 1; i>=0; i--) {
|
for (i=tC.maxOrder - 1; i>=0; i--) {
|
||||||
temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
|
temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
|
||||||
if ( temp > 0 )
|
if ( temp > 0 )
|
||||||
break;
|
break;
|
||||||
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
||||||
if ( temp < 0 )
|
if ( temp < 0 )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tnsInfo->order[subBlockNumber] = i + 1;
|
tnsInfo->order[subBlockNumber] = i + 1;
|
||||||
|
|
||||||
|
|
||||||
tnsInfo->tnsActive[subBlockNumber] = 1;
|
tnsInfo->tnsActive[subBlockNumber] = 1;
|
||||||
for (i=subBlockNumber+1; i<TRANS_FAC; i++) {
|
for (i=subBlockNumber+1; i<TRANS_FAC; i++) {
|
||||||
tnsInfo->tnsActive[i] = 0;
|
tnsInfo->tnsActive[i] = 0;
|
||||||
}
|
}
|
||||||
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
||||||
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
||||||
|
|
||||||
|
|
||||||
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]),
|
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]),
|
||||||
@@ -448,10 +448,10 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
|||||||
|
|
||||||
}
|
}
|
||||||
} /* if (blockType!=SHORT_WINDOW) */
|
} /* if (blockType!=SHORT_WINDOW) */
|
||||||
else /*short block*/ {
|
else /*short block*/ {
|
||||||
psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||||
if (psubBlockInfo->tnsActive == 0) {
|
if (psubBlockInfo->tnsActive == 0) {
|
||||||
tnsInfo->tnsActive[subBlockNumber] = 0;
|
tnsInfo->tnsActive[subBlockNumber] = 0;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -466,19 +466,19 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
|||||||
tC.maxOrder,
|
tC.maxOrder,
|
||||||
tC.coefRes);
|
tC.coefRes);
|
||||||
for (i=(tC.maxOrder - 1); i>=0; i--) {
|
for (i=(tC.maxOrder - 1); i>=0; i--) {
|
||||||
temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
|
temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
|
||||||
if ( temp > 0 )
|
if ( temp > 0 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
||||||
if ( temp < 0 )
|
if ( temp < 0 )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tnsInfo->order[subBlockNumber] = i + 1;
|
tnsInfo->order[subBlockNumber] = i + 1;
|
||||||
|
|
||||||
tnsInfo->tnsActive[subBlockNumber] = 1;
|
tnsInfo->tnsActive[subBlockNumber] = 1;
|
||||||
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
||||||
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
||||||
|
|
||||||
|
|
||||||
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine),
|
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine),
|
||||||
@@ -507,14 +507,14 @@ static Word32 m_pow2_cordic(Word32 x, Word16 scale)
|
|||||||
{
|
{
|
||||||
Word32 k;
|
Word32 k;
|
||||||
|
|
||||||
Word32 accu_y = 0x40000000;
|
Word32 accu_y = 0x40000000;
|
||||||
accu_y = L_shr(accu_y,scale);
|
accu_y = L_shr(accu_y,scale);
|
||||||
|
|
||||||
for(k=1; k<INT_BITS; k++) {
|
for(k=1; k<INT_BITS; k++) {
|
||||||
const Word32 z = m_log2_table[k];
|
const Word32 z = m_log2_table[k];
|
||||||
|
|
||||||
while(L_sub(x,z) >= 0) {
|
while(L_sub(x,z) >= 0) {
|
||||||
|
|
||||||
x = L_sub(x, z);
|
x = L_sub(x, z);
|
||||||
accu_y = L_add(accu_y, (accu_y >> k));
|
accu_y = L_add(accu_y, (accu_y >> k));
|
||||||
}
|
}
|
||||||
@@ -548,43 +548,43 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp
|
|||||||
Word32 maxWS;
|
Word32 maxWS;
|
||||||
Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */
|
Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */
|
||||||
|
|
||||||
maxWS = 0;
|
maxWS = 0;
|
||||||
|
|
||||||
/* calc 1.0*2^-INT_BITS/2/sqrt(en) */
|
/* calc 1.0*2^-INT_BITS/2/sqrt(en) */
|
||||||
for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) {
|
for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) {
|
||||||
|
|
||||||
tmp2 = sfbEnergy[sfb] - 2;
|
tmp2 = sfbEnergy[sfb] - 2;
|
||||||
if( tmp2 > 0) {
|
if( tmp2 > 0) {
|
||||||
tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
|
tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
|
||||||
if(tmp > INT_BITS_SCAL)
|
if(tmp > INT_BITS_SCAL)
|
||||||
{
|
{
|
||||||
shift = norm_l(tmp);
|
shift = norm_l(tmp);
|
||||||
tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
|
tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tmp = 0x7fffffff;
|
tmp = 0x7fffffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tmp = 0x7fffffff;
|
tmp = 0x7fffffff;
|
||||||
}
|
}
|
||||||
tnsSfbMean[sfb] = tmp;
|
tnsSfbMean[sfb] = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* spread normalized values from sfbs to lines */
|
/* spread normalized values from sfbs to lines */
|
||||||
sfb = lpcStartBand;
|
sfb = lpcStartBand;
|
||||||
tmp = tnsSfbMean[sfb];
|
tmp = tnsSfbMean[sfb];
|
||||||
for ( i=lpcStartLine; i<lpcStopLine; i++){
|
for ( i=lpcStartLine; i<lpcStopLine; i++){
|
||||||
tmp_s = sfbOffset[sfb + 1] - i;
|
tmp_s = sfbOffset[sfb + 1] - i;
|
||||||
if ( tmp_s == 0 ) {
|
if ( tmp_s == 0 ) {
|
||||||
sfb = sfb + 1;
|
sfb = sfb + 1;
|
||||||
tmp2_s = sfb + 1 - lpcStopBand;
|
tmp2_s = sfb + 1 - lpcStopBand;
|
||||||
if (tmp2_s <= 0) {
|
if (tmp2_s <= 0) {
|
||||||
tmp = tnsSfbMean[sfb];
|
tmp = tnsSfbMean[sfb];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pWork32[i] = tmp;
|
pWork32[i] = tmp;
|
||||||
}
|
}
|
||||||
/*filter down*/
|
/*filter down*/
|
||||||
for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){
|
for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){
|
||||||
@@ -597,8 +597,8 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp
|
|||||||
|
|
||||||
/* weight and normalize */
|
/* weight and normalize */
|
||||||
for (i=lpcStartLine; i<lpcStopLine; i++){
|
for (i=lpcStartLine; i<lpcStopLine; i++){
|
||||||
pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
|
pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
|
||||||
maxWS |= L_abs(pWork32[i]);
|
maxWS |= L_abs(pWork32[i]);
|
||||||
}
|
}
|
||||||
maxShift = norm_l(maxWS);
|
maxShift = norm_l(maxWS);
|
||||||
|
|
||||||
@@ -646,7 +646,7 @@ static Word16 CalcTnsFilter(const Word16 *signal,
|
|||||||
assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */
|
assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */
|
||||||
|
|
||||||
for(i=0;i<tnsOrder;i++) {
|
for(i=0;i<tnsOrder;i++) {
|
||||||
parcor[i] = 0;
|
parcor[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1);
|
AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1);
|
||||||
@@ -678,15 +678,15 @@ void AutoCorrelation(const Word16 input[],
|
|||||||
Word32 accu;
|
Word32 accu;
|
||||||
Word32 scf;
|
Word32 scf;
|
||||||
|
|
||||||
scf = 10 - 1;
|
scf = 10 - 1;
|
||||||
|
|
||||||
isamples = samples;
|
isamples = samples;
|
||||||
/* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
|
/* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
|
||||||
accu = 0;
|
accu = 0;
|
||||||
for(j=0; j<isamples; j++) {
|
for(j=0; j<isamples; j++) {
|
||||||
accu = L_add(accu, ((input[j] * input[j]) >> scf));
|
accu = L_add(accu, ((input[j] * input[j]) >> scf));
|
||||||
}
|
}
|
||||||
corr[0] = accu;
|
corr[0] = accu;
|
||||||
|
|
||||||
/* early termination if all corr coeffs are likely going to be zero */
|
/* early termination if all corr coeffs are likely going to be zero */
|
||||||
if(corr[0] == 0) return ;
|
if(corr[0] == 0) return ;
|
||||||
@@ -694,13 +694,13 @@ void AutoCorrelation(const Word16 input[],
|
|||||||
/* calc all other corrCoef: R[j] = sum { t[i] * t[i+j] } ; i = 0..(N-j-1), j=1..p */
|
/* calc all other corrCoef: R[j] = sum { t[i] * t[i+j] } ; i = 0..(N-j-1), j=1..p */
|
||||||
for(i=1; i<corrCoeff; i++) {
|
for(i=1; i<corrCoeff; i++) {
|
||||||
isamples = isamples - 1;
|
isamples = isamples - 1;
|
||||||
accu = 0;
|
accu = 0;
|
||||||
for(j=0; j<isamples; j++) {
|
for(j=0; j<isamples; j++) {
|
||||||
accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
|
accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
|
||||||
}
|
}
|
||||||
corr[i] = accu;
|
corr[i] = accu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -720,20 +720,20 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf
|
|||||||
Word32 predictionGain = 0;
|
Word32 predictionGain = 0;
|
||||||
Word32 num, denom;
|
Word32 num, denom;
|
||||||
Word32 temp, workBuffer0;
|
Word32 temp, workBuffer0;
|
||||||
|
|
||||||
|
|
||||||
num = workBuffer[0];
|
|
||||||
temp = workBuffer[numOfCoeff];
|
num = workBuffer[0];
|
||||||
|
temp = workBuffer[numOfCoeff];
|
||||||
|
|
||||||
for(i=0; i<numOfCoeff-1; i++) {
|
for(i=0; i<numOfCoeff-1; i++) {
|
||||||
workBuffer[i + numOfCoeff] = workBuffer[i + 1];
|
workBuffer[i + numOfCoeff] = workBuffer[i + 1];
|
||||||
}
|
}
|
||||||
workBuffer[i + numOfCoeff] = temp;
|
workBuffer[i + numOfCoeff] = temp;
|
||||||
|
|
||||||
for(i=0; i<numOfCoeff; i++) {
|
for(i=0; i<numOfCoeff; i++) {
|
||||||
Word32 refc;
|
Word32 refc;
|
||||||
|
|
||||||
|
|
||||||
if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
|
if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
@@ -742,21 +742,21 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf
|
|||||||
/* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */
|
/* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */
|
||||||
refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0));
|
refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0));
|
||||||
|
|
||||||
reflCoeff[i] = refc;
|
reflCoeff[i] = refc;
|
||||||
|
|
||||||
pWorkBuffer = &(workBuffer[numOfCoeff]);
|
pWorkBuffer = &(workBuffer[numOfCoeff]);
|
||||||
|
|
||||||
for(j=i; j<numOfCoeff; j++) {
|
for(j=i; j<numOfCoeff; j++) {
|
||||||
Word32 accu1, accu2;
|
Word32 accu1, accu2;
|
||||||
accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i]));
|
accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i]));
|
||||||
accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j]));
|
accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j]));
|
||||||
pWorkBuffer[j] = accu1;
|
pWorkBuffer[j] = accu1;
|
||||||
workBuffer[j - i] = accu2;
|
workBuffer[j - i] = accu2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
denom = MULHIGH(workBuffer[0], NORM_COEF);
|
denom = MULHIGH(workBuffer[0], NORM_COEF);
|
||||||
|
|
||||||
if (denom != 0) {
|
if (denom != 0) {
|
||||||
Word32 temp;
|
Word32 temp;
|
||||||
shift = norm_l(denom);
|
shift = norm_l(denom);
|
||||||
@@ -774,11 +774,11 @@ static Word16 Search3(Word32 parcor)
|
|||||||
Word32 index = 0;
|
Word32 index = 0;
|
||||||
Word32 i;
|
Word32 i;
|
||||||
Word32 temp;
|
Word32 temp;
|
||||||
|
|
||||||
for (i=0;i<8;i++) {
|
for (i=0;i<8;i++) {
|
||||||
temp = L_sub( parcor, tnsCoeff3Borders[i]);
|
temp = L_sub( parcor, tnsCoeff3Borders[i]);
|
||||||
if (temp > 0)
|
if (temp > 0)
|
||||||
index=i;
|
index=i;
|
||||||
}
|
}
|
||||||
return extract_l(index - 4);
|
return extract_l(index - 4);
|
||||||
}
|
}
|
||||||
@@ -788,12 +788,12 @@ static Word16 Search4(Word32 parcor)
|
|||||||
Word32 index = 0;
|
Word32 index = 0;
|
||||||
Word32 i;
|
Word32 i;
|
||||||
Word32 temp;
|
Word32 temp;
|
||||||
|
|
||||||
|
|
||||||
for (i=0;i<16;i++) {
|
for (i=0;i<16;i++) {
|
||||||
temp = L_sub(parcor, tnsCoeff4Borders[i]);
|
temp = L_sub(parcor, tnsCoeff4Borders[i]);
|
||||||
if (temp > 0)
|
if (temp > 0)
|
||||||
index=i;
|
index=i;
|
||||||
}
|
}
|
||||||
return extract_l(index - 8);
|
return extract_l(index - 8);
|
||||||
}
|
}
|
||||||
@@ -814,12 +814,12 @@ static void Parcor2Index(const Word32 parcor[], /*!< parcor coefficients */
|
|||||||
Word32 temp;
|
Word32 temp;
|
||||||
|
|
||||||
for(i=0; i<order; i++) {
|
for(i=0; i<order; i++) {
|
||||||
temp = bitsPerCoeff - 3;
|
temp = bitsPerCoeff - 3;
|
||||||
if (temp == 0) {
|
if (temp == 0) {
|
||||||
index[i] = Search3(parcor[i]);
|
index[i] = Search3(parcor[i]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
index[i] = Search4(parcor[i]);
|
index[i] = Search4(parcor[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -839,12 +839,12 @@ static void Index2Parcor(const Word16 index[], /*!< quantized values */
|
|||||||
Word32 temp;
|
Word32 temp;
|
||||||
|
|
||||||
for (i=0; i<order; i++) {
|
for (i=0; i<order; i++) {
|
||||||
temp = bitsPerCoeff - 4;
|
temp = bitsPerCoeff - 4;
|
||||||
if ( temp == 0 ) {
|
if ( temp == 0 ) {
|
||||||
parcor[i] = tnsCoeff4[index[i] + 8];
|
parcor[i] = tnsCoeff4[index[i] + 8];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
parcor[i] = tnsCoeff3[index[i] + 4];
|
parcor[i] = tnsCoeff3[index[i] + 4];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -865,20 +865,20 @@ static Word32 FIRLattice(Word16 order, /*!< filter order */
|
|||||||
Word32 accu,tmp,tmpSave;
|
Word32 accu,tmp,tmpSave;
|
||||||
|
|
||||||
x = x >> 1;
|
x = x >> 1;
|
||||||
tmpSave = x;
|
tmpSave = x;
|
||||||
|
|
||||||
for (i=0; i<(order - 1); i++) {
|
for (i=0; i<(order - 1); i++) {
|
||||||
|
|
||||||
tmp = L_add(fixmul(coef_par[i], x), state_par[i]);
|
tmp = L_add(fixmul(coef_par[i], x), state_par[i]);
|
||||||
x = L_add(fixmul(coef_par[i], state_par[i]), x);
|
x = L_add(fixmul(coef_par[i], state_par[i]), x);
|
||||||
|
|
||||||
state_par[i] = tmpSave;
|
state_par[i] = tmpSave;
|
||||||
tmpSave = tmp;
|
tmpSave = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* last stage: only need half operations */
|
/* last stage: only need half operations */
|
||||||
accu = fixmul(state_par[order - 1], coef_par[(order - 1)]);
|
accu = fixmul(state_par[order - 1], coef_par[(order - 1)]);
|
||||||
state_par[(order - 1)] = tmpSave;
|
state_par[(order - 1)] = tmpSave;
|
||||||
|
|
||||||
x = L_add(accu, x);
|
x = L_add(accu, x);
|
||||||
x = L_add(x, x);
|
x = L_add(x, x);
|
||||||
@@ -903,11 +903,11 @@ static void AnalysisFilterLattice(const Word32 signal[], /*!< input spectrum *
|
|||||||
Word32 j;
|
Word32 j;
|
||||||
|
|
||||||
for ( j=0; j<TNS_MAX_ORDER; j++ ) {
|
for ( j=0; j<TNS_MAX_ORDER; j++ ) {
|
||||||
state_par[j] = 0;
|
state_par[j] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(j=0; j<numOfLines; j++) {
|
for(j=0; j<numOfLines; j++) {
|
||||||
output[j] = FIRLattice(order,signal[j],state_par,parCoeff);
|
output[j] = FIRLattice(order,signal[j],state_par,parCoeff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -922,11 +922,11 @@ void ApplyTnsMultTableToRatios(Word16 startCb,
|
|||||||
TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */
|
TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */
|
||||||
Word32 *thresholds) /*!< thresholds (modified) */
|
Word32 *thresholds) /*!< thresholds (modified) */
|
||||||
{
|
{
|
||||||
Word32 i;
|
Word32 i;
|
||||||
if (subInfo.tnsActive) {
|
if (subInfo.tnsActive) {
|
||||||
for(i=startCb; i<stopCb; i++) {
|
for(i=startCb; i<stopCb; i++) {
|
||||||
/* thresholds[i] * 0.25 */
|
/* thresholds[i] * 0.25 */
|
||||||
thresholds[i] = (thresholds[i] >> 2);
|
thresholds[i] = (thresholds[i] >> 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
#define swap2(p0,p1) \
|
#define swap2(p0,p1) \
|
||||||
t = p0; t1 = *(&(p0)+1); \
|
t = p0; t1 = *(&(p0)+1); \
|
||||||
p0 = p1; *(&(p0)+1) = *(&(p1)+1); \
|
p0 = p1; *(&(p0)+1) = *(&(p1)+1); \
|
||||||
p1 = t; *(&(p1)+1) = t1
|
p1 = t; *(&(p1)+1) = t1
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
*
|
*
|
||||||
@@ -47,18 +47,18 @@ static void Shuffle(int *buf, int num, const unsigned char* bitTab)
|
|||||||
|
|
||||||
part0 = buf;
|
part0 = buf;
|
||||||
part1 = buf + num;
|
part1 = buf + num;
|
||||||
|
|
||||||
while ((i = *bitTab++) != 0) {
|
while ((i = *bitTab++) != 0) {
|
||||||
j = *bitTab++;
|
j = *bitTab++;
|
||||||
|
|
||||||
swap2(part0[4*i+0], part0[4*j+0]);
|
swap2(part0[4*i+0], part0[4*j+0]);
|
||||||
swap2(part0[4*i+2], part1[4*j+0]);
|
swap2(part0[4*i+2], part1[4*j+0]);
|
||||||
swap2(part1[4*i+0], part0[4*j+2]);
|
swap2(part1[4*i+0], part0[4*j+2]);
|
||||||
swap2(part1[4*i+2], part1[4*j+2]);
|
swap2(part1[4*i+2], part1[4*j+2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
swap2(part0[4*i+2], part1[4*i+0]);
|
swap2(part0[4*i+2], part1[4*i+0]);
|
||||||
} while ((i = *bitTab++) != 0);
|
} while ((i = *bitTab++) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,8 +74,8 @@ static void Radix4First(int *buf, int num)
|
|||||||
{
|
{
|
||||||
int r0, r1, r2, r3;
|
int r0, r1, r2, r3;
|
||||||
int r4, r5, r6, r7;
|
int r4, r5, r6, r7;
|
||||||
|
|
||||||
for (; num != 0; num--)
|
for (; num != 0; num--)
|
||||||
{
|
{
|
||||||
r0 = buf[0] + buf[2];
|
r0 = buf[0] + buf[2];
|
||||||
r1 = buf[1] + buf[3];
|
r1 = buf[1] + buf[3];
|
||||||
@@ -113,7 +113,7 @@ static void Radix8First(int *buf, int num)
|
|||||||
int i4, i5, i6, i7;
|
int i4, i5, i6, i7;
|
||||||
int t0, t1, t2, t3;
|
int t0, t1, t2, t3;
|
||||||
|
|
||||||
for ( ; num != 0; num--)
|
for ( ; num != 0; num--)
|
||||||
{
|
{
|
||||||
r0 = buf[0] + buf[2];
|
r0 = buf[0] + buf[2];
|
||||||
i0 = buf[1] + buf[3];
|
i0 = buf[1] + buf[3];
|
||||||
@@ -194,23 +194,23 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
|
|||||||
int i, j, step;
|
int i, j, step;
|
||||||
int *xptr, *csptr;
|
int *xptr, *csptr;
|
||||||
|
|
||||||
for (num >>= 2; num != 0; num >>= 2)
|
for (num >>= 2; num != 0; num >>= 2)
|
||||||
{
|
{
|
||||||
step = 2*bgn;
|
step = 2*bgn;
|
||||||
xptr = buf;
|
xptr = buf;
|
||||||
|
|
||||||
for (i = num; i != 0; i--)
|
for (i = num; i != 0; i--)
|
||||||
{
|
{
|
||||||
csptr = twidTab;
|
csptr = twidTab;
|
||||||
|
|
||||||
for (j = bgn; j != 0; j--)
|
for (j = bgn; j != 0; j--)
|
||||||
{
|
{
|
||||||
r0 = xptr[0];
|
r0 = xptr[0];
|
||||||
r1 = xptr[1];
|
r1 = xptr[1];
|
||||||
xptr += step;
|
xptr += step;
|
||||||
|
|
||||||
t0 = xptr[0];
|
t0 = xptr[0];
|
||||||
t1 = xptr[1];
|
t1 = xptr[1];
|
||||||
cosx = csptr[0];
|
cosx = csptr[0];
|
||||||
sinx = csptr[1];
|
sinx = csptr[1];
|
||||||
r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */
|
r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */
|
||||||
@@ -223,7 +223,7 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
|
|||||||
r1 = t1 - r3;
|
r1 = t1 - r3;
|
||||||
r2 = t0 + r2;
|
r2 = t0 + r2;
|
||||||
r3 = t1 + r3;
|
r3 = t1 + r3;
|
||||||
|
|
||||||
t0 = xptr[0];
|
t0 = xptr[0];
|
||||||
t1 = xptr[1];
|
t1 = xptr[1];
|
||||||
cosx = csptr[2];
|
cosx = csptr[2];
|
||||||
@@ -231,7 +231,7 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
|
|||||||
r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
|
r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
|
||||||
r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
|
r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
|
||||||
xptr += step;
|
xptr += step;
|
||||||
|
|
||||||
t0 = xptr[0];
|
t0 = xptr[0];
|
||||||
t1 = xptr[1];
|
t1 = xptr[1];
|
||||||
cosx = csptr[4];
|
cosx = csptr[4];
|
||||||
@@ -282,25 +282,25 @@ static void PreMDCT(int *buf0, int num, const int *csptr)
|
|||||||
int tr1, ti1, tr2, ti2;
|
int tr1, ti1, tr2, ti2;
|
||||||
int cosa, sina, cosb, sinb;
|
int cosa, sina, cosb, sinb;
|
||||||
int *buf1;
|
int *buf1;
|
||||||
|
|
||||||
buf1 = buf0 + num - 1;
|
buf1 = buf0 + num - 1;
|
||||||
|
|
||||||
for(i = num >> 2; i != 0; i--)
|
for(i = num >> 2; i != 0; i--)
|
||||||
{
|
{
|
||||||
cosa = *csptr++;
|
cosa = *csptr++;
|
||||||
sina = *csptr++;
|
sina = *csptr++;
|
||||||
cosb = *csptr++;
|
cosb = *csptr++;
|
||||||
sinb = *csptr++;
|
sinb = *csptr++;
|
||||||
|
|
||||||
tr1 = *(buf0 + 0);
|
tr1 = *(buf0 + 0);
|
||||||
ti2 = *(buf0 + 1);
|
ti2 = *(buf0 + 1);
|
||||||
tr2 = *(buf1 - 1);
|
tr2 = *(buf1 - 1);
|
||||||
ti1 = *(buf1 + 0);
|
ti1 = *(buf1 + 0);
|
||||||
|
|
||||||
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
|
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
|
||||||
*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
|
*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
|
||||||
|
|
||||||
*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
|
*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
|
||||||
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -319,12 +319,12 @@ static void PostMDCT(int *buf0, int num, const int *csptr)
|
|||||||
int *buf1;
|
int *buf1;
|
||||||
|
|
||||||
buf1 = buf0 + num - 1;
|
buf1 = buf0 + num - 1;
|
||||||
|
|
||||||
for(i = num >> 2; i != 0; i--)
|
for(i = num >> 2; i != 0; i--)
|
||||||
{
|
{
|
||||||
cosa = *csptr++;
|
cosa = *csptr++;
|
||||||
sina = *csptr++;
|
sina = *csptr++;
|
||||||
cosb = *csptr++;
|
cosb = *csptr++;
|
||||||
sinb = *csptr++;
|
sinb = *csptr++;
|
||||||
|
|
||||||
tr1 = *(buf0 + 0);
|
tr1 = *(buf0 + 0);
|
||||||
@@ -333,10 +333,10 @@ static void PostMDCT(int *buf0, int num, const int *csptr)
|
|||||||
tr2 = *(buf1 - 1);
|
tr2 = *(buf1 - 1);
|
||||||
|
|
||||||
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
|
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
|
||||||
*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
|
*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
|
||||||
|
|
||||||
*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
|
*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
|
||||||
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -353,17 +353,17 @@ void Mdct_Long(int *buf)
|
|||||||
PreMDCT(buf, 1024, cossintab + 128);
|
PreMDCT(buf, 1024, cossintab + 128);
|
||||||
|
|
||||||
Shuffle(buf, 512, bitrevTab + 17);
|
Shuffle(buf, 512, bitrevTab + 17);
|
||||||
Radix8First(buf, 512 >> 3);
|
Radix8First(buf, 512 >> 3);
|
||||||
Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
|
Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
|
||||||
|
|
||||||
PostMDCT(buf, 1024, cossintab + 128);
|
PostMDCT(buf, 1024, cossintab + 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************************
|
/**********************************************************************************
|
||||||
*
|
*
|
||||||
* function name: Mdct_Short
|
* function name: Mdct_Short
|
||||||
* description: the short block mdct
|
* description: the short block mdct
|
||||||
*
|
*
|
||||||
**********************************************************************************/
|
**********************************************************************************/
|
||||||
void Mdct_Short(int *buf)
|
void Mdct_Short(int *buf)
|
||||||
@@ -371,10 +371,10 @@ void Mdct_Short(int *buf)
|
|||||||
PreMDCT(buf, 128, cossintab);
|
PreMDCT(buf, 128, cossintab);
|
||||||
|
|
||||||
Shuffle(buf, 64, bitrevTab);
|
Shuffle(buf, 64, bitrevTab);
|
||||||
Radix4First(buf, 64 >> 2);
|
Radix4First(buf, 64 >> 2);
|
||||||
Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
|
Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
|
||||||
|
|
||||||
PostMDCT(buf, 128, cossintab);
|
PostMDCT(buf, 128, cossintab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -382,7 +382,7 @@ void Mdct_Short(int *buf)
|
|||||||
*
|
*
|
||||||
* function name: shiftMdctDelayBuffer
|
* function name: shiftMdctDelayBuffer
|
||||||
* description: the mdct delay buffer has a size of 1600,
|
* description: the mdct delay buffer has a size of 1600,
|
||||||
* so the calculation of LONG,STOP must be spilt in two
|
* so the calculation of LONG,STOP must be spilt in two
|
||||||
* passes with 1024 samples and a mid shift,
|
* passes with 1024 samples and a mid shift,
|
||||||
* the SHORT transforms can be completed in the delay buffer,
|
* the SHORT transforms can be completed in the delay buffer,
|
||||||
* and afterwards a shift
|
* and afterwards a shift
|
||||||
@@ -409,7 +409,7 @@ static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct dela
|
|||||||
dsBuf = timeSignal;
|
dsBuf = timeSignal;
|
||||||
|
|
||||||
for(i=0; i<FRAME_LEN_LONG; i+=8)
|
for(i=0; i<FRAME_LEN_LONG; i+=8)
|
||||||
{
|
{
|
||||||
*srBuf++ = *dsBuf; dsBuf += chIncrement;
|
*srBuf++ = *dsBuf; dsBuf += chIncrement;
|
||||||
*srBuf++ = *dsBuf; dsBuf += chIncrement;
|
*srBuf++ = *dsBuf; dsBuf += chIncrement;
|
||||||
*srBuf++ = *dsBuf; dsBuf += chIncrement;
|
*srBuf++ = *dsBuf; dsBuf += chIncrement;
|
||||||
@@ -470,10 +470,10 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
|
|
||||||
Word32 delayBufferSf,timeSignalSf,minSf;
|
Word32 delayBufferSf,timeSignalSf,minSf;
|
||||||
Word32 headRoom=0;
|
Word32 headRoom=0;
|
||||||
|
|
||||||
switch(blockType){
|
switch(blockType){
|
||||||
|
|
||||||
|
|
||||||
case LONG_WINDOW:
|
case LONG_WINDOW:
|
||||||
/*
|
/*
|
||||||
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples
|
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples
|
||||||
@@ -483,15 +483,15 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
|
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
|
||||||
minSf = min(delayBufferSf,timeSignalSf);
|
minSf = min(delayBufferSf,timeSignalSf);
|
||||||
minSf = min(minSf,14);
|
minSf = min(minSf,14);
|
||||||
|
|
||||||
dctIn0 = mdctDelayBuffer;
|
dctIn0 = mdctDelayBuffer;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||||
|
|
||||||
/* add windows and pre add for mdct to last buffer*/
|
/* add windows and pre add for mdct to last buffer*/
|
||||||
winPtr = (int *)LongWindowKBD;
|
winPtr = (int *)LongWindowKBD;
|
||||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||||
timeSignalSample = (*dctIn0++) << minSf;
|
timeSignalSample = (*dctIn0++) << minSf;
|
||||||
ws1 = timeSignalSample * (*winPtr >> 16);
|
ws1 = timeSignalSample * (*winPtr >> 16);
|
||||||
timeSignalSample = (*dctIn1--) << minSf;
|
timeSignalSample = (*dctIn1--) << minSf;
|
||||||
ws2 = timeSignalSample * (*winPtr & 0xffff);
|
ws2 = timeSignalSample * (*winPtr & 0xffff);
|
||||||
@@ -499,30 +499,30 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
/* shift 2 to avoid overflow next */
|
/* shift 2 to avoid overflow next */
|
||||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2);
|
*outData0++ = (ws1 >> 2) - (ws2 >> 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||||
|
|
||||||
/* add windows and pre add for mdct to new buffer*/
|
/* add windows and pre add for mdct to new buffer*/
|
||||||
dctIn0 = mdctDelayBuffer;
|
dctIn0 = mdctDelayBuffer;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||||
winPtr = (int *)LongWindowKBD;
|
winPtr = (int *)LongWindowKBD;
|
||||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||||
timeSignalSample = (*dctIn0++) << minSf;
|
timeSignalSample = (*dctIn0++) << minSf;
|
||||||
ws1 = timeSignalSample * (*winPtr & 0xffff);
|
ws1 = timeSignalSample * (*winPtr & 0xffff);
|
||||||
timeSignalSample = (*dctIn1--) << minSf;
|
timeSignalSample = (*dctIn1--) << minSf;
|
||||||
ws2 = timeSignalSample * (*winPtr >> 16);
|
ws2 = timeSignalSample * (*winPtr >> 16);
|
||||||
winPtr++;
|
winPtr++;
|
||||||
/* shift 2 to avoid overflow next */
|
/* shift 2 to avoid overflow next */
|
||||||
*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
|
*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
Mdct_Long(realOut);
|
Mdct_Long(realOut);
|
||||||
/* update scale factor */
|
/* update scale factor */
|
||||||
minSf = 14 - minSf;
|
minSf = 14 - minSf;
|
||||||
*mdctScale=minSf;
|
*mdctScale=minSf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case START_WINDOW:
|
case START_WINDOW:
|
||||||
/*
|
/*
|
||||||
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
|
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
|
||||||
@@ -533,7 +533,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
|
|
||||||
dctIn0 = mdctDelayBuffer;
|
dctIn0 = mdctDelayBuffer;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||||
winPtr = (int *)LongWindowKBD;
|
winPtr = (int *)LongWindowKBD;
|
||||||
|
|
||||||
/* add windows and pre add for mdct to last buffer*/
|
/* add windows and pre add for mdct to last buffer*/
|
||||||
@@ -545,18 +545,18 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
winPtr ++;
|
winPtr ++;
|
||||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
||||||
}
|
}
|
||||||
|
|
||||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||||
|
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||||
for(i=0;i<LS_TRANS;i++){
|
for(i=0;i<LS_TRANS;i++){
|
||||||
*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
|
*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add windows and pre add for mdct to new buffer*/
|
/* add windows and pre add for mdct to new buffer*/
|
||||||
dctIn0 = mdctDelayBuffer + LS_TRANS;
|
dctIn0 = mdctDelayBuffer + LS_TRANS;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS;
|
outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS;
|
||||||
winPtr = (int *)ShortWindowSine;
|
winPtr = (int *)ShortWindowSine;
|
||||||
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
||||||
timeSignalSample= (*dctIn0++) << minSf;
|
timeSignalSample= (*dctIn0++) << minSf;
|
||||||
@@ -572,7 +572,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
minSf = 14 - minSf;
|
minSf = 14 - minSf;
|
||||||
*mdctScale= minSf;
|
*mdctScale= minSf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STOP_WINDOW:
|
case STOP_WINDOW:
|
||||||
/*
|
/*
|
||||||
we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples
|
we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples
|
||||||
@@ -580,19 +580,19 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
*/
|
*/
|
||||||
delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1);
|
delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1);
|
||||||
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
|
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
|
||||||
minSf = min(delayBufferSf,timeSignalSf);
|
minSf = min(delayBufferSf,timeSignalSf);
|
||||||
minSf = min(minSf,13);
|
minSf = min(minSf,13);
|
||||||
|
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||||
for(i=0;i<LS_TRANS;i++){
|
for(i=0;i<LS_TRANS;i++){
|
||||||
*outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
|
*outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add windows and pre add for mdct to last buffer*/
|
/* add windows and pre add for mdct to last buffer*/
|
||||||
dctIn0 = mdctDelayBuffer + LS_TRANS;
|
dctIn0 = mdctDelayBuffer + LS_TRANS;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS;
|
outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS;
|
||||||
winPtr = (int *)ShortWindowSine;
|
winPtr = (int *)ShortWindowSine;
|
||||||
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
||||||
timeSignalSample = (*dctIn0++) << minSf;
|
timeSignalSample = (*dctIn0++) << minSf;
|
||||||
@@ -602,13 +602,13 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
winPtr++;
|
winPtr++;
|
||||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
||||||
}
|
}
|
||||||
|
|
||||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||||
|
|
||||||
/* add windows and pre add for mdct to new buffer*/
|
/* add windows and pre add for mdct to new buffer*/
|
||||||
dctIn0 = mdctDelayBuffer;
|
dctIn0 = mdctDelayBuffer;
|
||||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||||
winPtr = (int *)LongWindowKBD;
|
winPtr = (int *)LongWindowKBD;
|
||||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||||
timeSignalSample= (*dctIn0++) << minSf;
|
timeSignalSample= (*dctIn0++) << minSf;
|
||||||
@@ -618,26 +618,26 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
*outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
|
*outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
|
||||||
winPtr++;
|
winPtr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mdct_Long(realOut);
|
Mdct_Long(realOut);
|
||||||
minSf = 14 - minSf;
|
minSf = 14 - minSf;
|
||||||
*mdctScale= minSf; /* update scale factor */
|
*mdctScale= minSf; /* update scale factor */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHORT_WINDOW:
|
case SHORT_WINDOW:
|
||||||
/*
|
/*
|
||||||
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
|
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
|
||||||
and get the biggest scale factor for next calculate more precise
|
and get the biggest scale factor for next calculate more precise
|
||||||
*/
|
*/
|
||||||
minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
|
minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
|
||||||
minSf = min(minSf,10);
|
minSf = min(minSf,10);
|
||||||
|
|
||||||
|
|
||||||
for(w=0;w<TRANS_FAC;w++){
|
for(w=0;w<TRANS_FAC;w++){
|
||||||
dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
|
dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
|
||||||
dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
|
dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
|
||||||
outData0 = realOut + FRAME_LEN_SHORT/2;
|
outData0 = realOut + FRAME_LEN_SHORT/2;
|
||||||
outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
|
outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
|
||||||
|
|
||||||
winPtr = (int *)ShortWindowSine;
|
winPtr = (int *)ShortWindowSine;
|
||||||
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
||||||
@@ -646,7 +646,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
timeSignalSample= *dctIn1 << minSf;
|
timeSignalSample= *dctIn1 << minSf;
|
||||||
ws2 = timeSignalSample * (*winPtr & 0xffff);
|
ws2 = timeSignalSample * (*winPtr & 0xffff);
|
||||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
||||||
|
|
||||||
timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
|
timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
|
||||||
ws1 = timeSignalSample * (*winPtr & 0xffff);
|
ws1 = timeSignalSample * (*winPtr & 0xffff);
|
||||||
timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
|
timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
|
||||||
@@ -661,10 +661,10 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
|||||||
Mdct_Short(realOut);
|
Mdct_Short(realOut);
|
||||||
realOut += FRAME_LEN_SHORT;
|
realOut += FRAME_LEN_SHORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
minSf = 11 - minSf;
|
minSf = 11 - minSf;
|
||||||
*mdctScale = minSf; /* update scale factor */
|
*mdctScale = minSf; /* update scale factor */
|
||||||
|
|
||||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
|
|||||||
include frameworks/base/media/libstagefright/codecs/common/Config.mk
|
include frameworks/base/media/libstagefright/codecs/common/Config.mk
|
||||||
|
|
||||||
LOCAL_PRELINK_MODULE := false
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
AMRWBEncoder.cpp \
|
AMRWBEncoder.cpp \
|
||||||
src/autocorr.c \
|
src/autocorr.c \
|
||||||
@@ -91,7 +91,7 @@ LOCAL_MODULE := libstagefright_amrwbenc
|
|||||||
|
|
||||||
LOCAL_ARM_MODE := arm
|
LOCAL_ARM_MODE := arm
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES :=
|
LOCAL_STATIC_LIBRARIES :=
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES :=
|
LOCAL_SHARED_LIBRARIES :=
|
||||||
|
|
||||||
|
|||||||
@@ -70,10 +70,10 @@ int GetNextBuf(FILE* inFile,unsigned char* dst,int size)
|
|||||||
typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
|
typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
|
||||||
|
|
||||||
int encode(
|
int encode(
|
||||||
int mode,
|
int mode,
|
||||||
short allow_dtx,
|
short allow_dtx,
|
||||||
VOAMRWBFRAMETYPE frameType,
|
VOAMRWBFRAMETYPE frameType,
|
||||||
const char* srcfile,
|
const char* srcfile,
|
||||||
const char* dstfile
|
const char* dstfile
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -136,7 +136,7 @@ int encode(
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pfunc = dlsym(handle, "voGetAMRWBEncAPI");
|
pfunc = dlsym(handle, "voGetAMRWBEncAPI");
|
||||||
if(pfunc == 0)
|
if(pfunc == 0)
|
||||||
{
|
{
|
||||||
printf("open function error......");
|
printf("open function error......");
|
||||||
@@ -159,7 +159,7 @@ int encode(
|
|||||||
printf("get APIs error......");
|
printf("get APIs error......");
|
||||||
goto safe_exit;
|
goto safe_exit;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//####################################### Init Encoding Section #########################################
|
//####################################### Init Encoding Section #########################################
|
||||||
ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
|
ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
|
||||||
@@ -214,7 +214,7 @@ int encode(
|
|||||||
if(framenum == 1)
|
if(framenum == 1)
|
||||||
{
|
{
|
||||||
fwrite(OutputBuf, 1, outData.Length + size1, fdst);
|
fwrite(OutputBuf, 1, outData.Length + size1, fdst);
|
||||||
fflush(fdst);
|
fflush(fdst);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -323,7 +323,7 @@ int main(int argc, char **argv) // for gcc compiler;
|
|||||||
case '1': frameType = VOAMRWB_ITU;
|
case '1': frameType = VOAMRWB_ITU;
|
||||||
break;
|
break;
|
||||||
case '2': frameType = VOAMRWB_RFC3267 ;
|
case '2': frameType = VOAMRWB_RFC3267 ;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
printf ("Invalid parameter '%s'.\n", argv [arg]);
|
printf ("Invalid parameter '%s'.\n", argv [arg]);
|
||||||
@@ -338,11 +338,11 @@ int main(int argc, char **argv) // for gcc compiler;
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
switch (filename) {
|
switch (filename) {
|
||||||
case 0:
|
case 0:
|
||||||
inFileName = argv[arg];
|
inFileName = argv[arg];
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
outFileName = argv[arg];
|
outFileName = argv[arg];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage ();
|
usage ();
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_SRC_FILES := AMRWB_E_SAMPLE.c
|
LOCAL_SRC_FILES := AMRWB_E_SAMPLE.c
|
||||||
|
|
||||||
LOCAL_SRC_FILES += \
|
LOCAL_SRC_FILES += \
|
||||||
../../../Common/cmnMemory.c
|
../../../Common/cmnMemory.c
|
||||||
|
|
||||||
LOCAL_MODULE := TestvoAMRWBEnc
|
LOCAL_MODULE := TestvoAMRWBEnc
|
||||||
|
|
||||||
LOCAL_ARM_MODE := arm
|
LOCAL_ARM_MODE := arm
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES :=
|
LOCAL_STATIC_LIBRARIES :=
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := libvoAMRWBEnc
|
LOCAL_SHARED_LIBRARIES := libvoAMRWBEnc
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ LOCAL_C_INCLUDES := \
|
|||||||
$(LOCAL_PATH)/../../../Include \
|
$(LOCAL_PATH)/../../../Include \
|
||||||
|
|
||||||
LOCAL_CFLAGS := $(VO_CFLAGS)
|
LOCAL_CFLAGS := $(VO_CFLAGS)
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ VOMT:= exe
|
|||||||
|
|
||||||
|
|
||||||
# module macros
|
# module macros
|
||||||
# please append the additional macro definitions here for your module if necessary.
|
# please append the additional macro definitions here for your module if necessary.
|
||||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||||
VOMM:= #ARMV5E
|
VOMM:= #ARMV5E
|
||||||
|
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ VOTARGET:= voAMRWBEnc_Test
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the g1.mk
|
# please modify here to be sure to see the g1.mk
|
||||||
include ../../../../Tools/eclair.mk
|
include ../../../../Tools/eclair.mk
|
||||||
|
|
||||||
# dependent libraries.
|
# dependent libraries.
|
||||||
VODEPLIBS:=-ldl
|
VODEPLIBS:=-ldl
|
||||||
@@ -52,5 +52,5 @@ VORELDIR:=../
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the doit.mk
|
# please modify here to be sure to see the doit.mk
|
||||||
include ../../../../Tools/doit.mk
|
include ../../../../Tools/doit.mk
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
# */
|
# */
|
||||||
# please list all objects needed by your target here
|
# please list all objects needed by your target here
|
||||||
OBJS:=AMRWB_E_SAMPLE.o cmnMemory.o
|
OBJS:=AMRWB_E_SAMPLE.o cmnMemory.o
|
||||||
|
|
||||||
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
||||||
VOSRCDIR:=../ \
|
VOSRCDIR:=../ \
|
||||||
../../../../Common \
|
../../../../Common \
|
||||||
../../../../Include
|
../../../../Include
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ VOMT:= lib
|
|||||||
|
|
||||||
|
|
||||||
# module macros
|
# module macros
|
||||||
# please append the additional macro definitions here for your module if necessary.
|
# please append the additional macro definitions here for your module if necessary.
|
||||||
ifeq ($(VOTT), v5)
|
ifeq ($(VOTT), v5)
|
||||||
VOMM:=-DARM -DASM_OPT
|
VOMM:=-DARM -DASM_OPT
|
||||||
endif
|
endif
|
||||||
@@ -35,7 +35,7 @@ VOTARGET:= libvoAMRWBEncv5
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the g1.mk
|
# please modify here to be sure to see the g1.mk
|
||||||
include ../../../../../Tools/eclair.mk
|
include ../../../../../Tools/eclair.mk
|
||||||
|
|
||||||
# dependent libraries.
|
# dependent libraries.
|
||||||
VODEPLIBS:=-ldl -lstdc++ -lcutils
|
VODEPLIBS:=-ldl -lstdc++ -lcutils
|
||||||
@@ -49,5 +49,5 @@ include ../ms.mk
|
|||||||
VORELDIR:=../../../../../../Release
|
VORELDIR:=../../../../../../Release
|
||||||
|
|
||||||
# please modify here to be sure to see the doit.mk
|
# please modify here to be sure to see the doit.mk
|
||||||
include ../../../../../Tools/doit.mk
|
include ../../../../../Tools/doit.mk
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ VOMT:= lib
|
|||||||
|
|
||||||
|
|
||||||
# module macros
|
# module macros
|
||||||
# please append the additional macro definitions here for your module if necessary.
|
# please append the additional macro definitions here for your module if necessary.
|
||||||
ifeq ($(VOTT), v7)
|
ifeq ($(VOTT), v7)
|
||||||
VOMM:=-DARM -DARMV7 -DASM_OPT
|
VOMM:=-DARM -DARMV7 -DASM_OPT
|
||||||
endif
|
endif
|
||||||
@@ -35,7 +35,7 @@ VOTARGET:= libvoAMRWBEncv7
|
|||||||
|
|
||||||
|
|
||||||
# please modify here to be sure to see the g1.mk
|
# please modify here to be sure to see the g1.mk
|
||||||
include ../../../../../Tools/eclair.mk
|
include ../../../../../Tools/eclair.mk
|
||||||
|
|
||||||
# dependent libraries.
|
# dependent libraries.
|
||||||
VODEPLIBS:=-ldl -lstdc++ -lcutils
|
VODEPLIBS:=-ldl -lstdc++ -lcutils
|
||||||
@@ -49,5 +49,5 @@ include ../ms.mk
|
|||||||
VORELDIR:=../../../../../../Release
|
VORELDIR:=../../../../../../Release
|
||||||
|
|
||||||
# please modify here to be sure to see the doit.mk
|
# please modify here to be sure to see the doit.mk
|
||||||
include ../../../../../Tools/doit.mk
|
include ../../../../../Tools/doit.mk
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
# */
|
# */
|
||||||
# Just acting as Father Makefile of Modules
|
# Just acting as Father Makefile of Modules
|
||||||
# please keep the name 'makefile' unchanged
|
# please keep the name 'makefile' unchanged
|
||||||
|
|
||||||
# Module Subdirs
|
# Module Subdirs
|
||||||
VOMSD:=$(dir $(shell find . -name 'Makefile'))
|
VOMSD:=$(dir $(shell find . -name 'Makefile'))
|
||||||
|
|
||||||
|
|||||||
@@ -13,10 +13,10 @@
|
|||||||
# ** See the License for the specific language governing permissions and
|
# ** See the License for the specific language governing permissions and
|
||||||
# ** limitations under the License.
|
# ** limitations under the License.
|
||||||
# */
|
# */
|
||||||
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
# please list all directories that all source files relative with your module(.h .c .cpp) locate
|
||||||
VOSRCDIR:=../../../inc \
|
VOSRCDIR:=../../../inc \
|
||||||
../../../src \
|
../../../src \
|
||||||
../../../../../Include
|
../../../../../Include
|
||||||
|
|
||||||
# please list all objects needed by your target here
|
# please list all objects needed by your target here
|
||||||
OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim54.o \
|
OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim54.o \
|
||||||
@@ -25,7 +25,7 @@ OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim
|
|||||||
oper_32b.o p_med_ol.o pit_shrp.o pitch_f4.o pred_lt4.o preemph.o q_gain2.o q_pulse.o \
|
oper_32b.o p_med_ol.o pit_shrp.o pitch_f4.o pred_lt4.o preemph.o q_gain2.o q_pulse.o \
|
||||||
qisf_ns.o qpisf_2s.o random.o residu.o scale.o stream.o syn_filt.o updt_tar.o util.o \
|
qisf_ns.o qpisf_2s.o random.o residu.o scale.o stream.o syn_filt.o updt_tar.o util.o \
|
||||||
voAMRWBEnc.o voicefac.o wb_vad.o weight_a.o
|
voAMRWBEnc.o voicefac.o wb_vad.o weight_a.o
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(VOTT), v5)
|
ifeq ($(VOTT), v5)
|
||||||
OBJS += cor_h_vec_opt.o Deemph_32_opt.o Dot_p_opt.o Filt_6k_7k_opt.o residu_asm_opt.o \
|
OBJS += cor_h_vec_opt.o Deemph_32_opt.o Dot_p_opt.o Filt_6k_7k_opt.o residu_asm_opt.o \
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#define static_vo static __inline__
|
#define static_vo static __inline__
|
||||||
#else
|
#else
|
||||||
#define static_vo static __inline
|
#define static_vo static __inline
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff)))
|
#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff)))
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right
|
|||||||
static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */
|
static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */
|
||||||
static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */
|
static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */
|
||||||
static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */
|
static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */
|
||||||
static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */
|
static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */
|
||||||
|
|
||||||
/*___________________________________________________________________________
|
/*___________________________________________________________________________
|
||||||
| |
|
| |
|
||||||
@@ -1030,8 +1030,8 @@ static_vo Word16 div_s (Word16 var1, Word16 var2)
|
|||||||
L_num <<= 1;
|
L_num <<= 1;
|
||||||
if (L_num >= L_denom)
|
if (L_num >= L_denom)
|
||||||
{
|
{
|
||||||
L_num -= L_denom;
|
L_num -= L_denom;
|
||||||
var_out += 1;
|
var_out += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,89 +33,89 @@
|
|||||||
|
|
||||||
static const Word16 dfh_M7k[PRMN_7k] =
|
static const Word16 dfh_M7k[PRMN_7k] =
|
||||||
{
|
{
|
||||||
3168, 29954, 29213, 16121,
|
3168, 29954, 29213, 16121,
|
||||||
64, 13440, 30624, 16430,
|
64, 13440, 30624, 16430,
|
||||||
19008
|
19008
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M9k[PRMN_9k] =
|
static const Word16 dfh_M9k[PRMN_9k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9123,
|
3168, 31665, 9943, 9123,
|
||||||
15599, 4358, 20248, 2048,
|
15599, 4358, 20248, 2048,
|
||||||
17040, 27787, 16816, 13888
|
17040, 27787, 16816, 13888
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M12k[PRMN_12k] =
|
static const Word16 dfh_M12k[PRMN_12k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9128,
|
3168, 31665, 9943, 9128,
|
||||||
3647, 8129, 30930, 27926,
|
3647, 8129, 30930, 27926,
|
||||||
18880, 12319, 496, 1042,
|
18880, 12319, 496, 1042,
|
||||||
4061, 20446, 25629, 28069,
|
4061, 20446, 25629, 28069,
|
||||||
13948
|
13948
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M14k[PRMN_14k] =
|
static const Word16 dfh_M14k[PRMN_14k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9131,
|
3168, 31665, 9943, 9131,
|
||||||
24815, 655, 26616, 26764,
|
24815, 655, 26616, 26764,
|
||||||
7238, 19136, 6144, 88,
|
7238, 19136, 6144, 88,
|
||||||
4158, 25733, 30567, 30494,
|
4158, 25733, 30567, 30494,
|
||||||
221, 20321, 17823
|
221, 20321, 17823
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M16k[PRMN_16k] =
|
static const Word16 dfh_M16k[PRMN_16k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9131,
|
3168, 31665, 9943, 9131,
|
||||||
24815, 700, 3824, 7271,
|
24815, 700, 3824, 7271,
|
||||||
26400, 9528, 6594, 26112,
|
26400, 9528, 6594, 26112,
|
||||||
108, 2068, 12867, 16317,
|
108, 2068, 12867, 16317,
|
||||||
23035, 24632, 7528, 1752,
|
23035, 24632, 7528, 1752,
|
||||||
6759, 24576
|
6759, 24576
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M18k[PRMN_18k] =
|
static const Word16 dfh_M18k[PRMN_18k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9135,
|
3168, 31665, 9943, 9135,
|
||||||
14787, 14423, 30477, 24927,
|
14787, 14423, 30477, 24927,
|
||||||
25345, 30154, 916, 5728,
|
25345, 30154, 916, 5728,
|
||||||
18978, 2048, 528, 16449,
|
18978, 2048, 528, 16449,
|
||||||
2436, 3581, 23527, 29479,
|
2436, 3581, 23527, 29479,
|
||||||
8237, 16810, 27091, 19052,
|
8237, 16810, 27091, 19052,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M20k[PRMN_20k] =
|
static const Word16 dfh_M20k[PRMN_20k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9129,
|
3168, 31665, 9943, 9129,
|
||||||
8637, 31807, 24646, 736,
|
8637, 31807, 24646, 736,
|
||||||
28643, 2977, 2566, 25564,
|
28643, 2977, 2566, 25564,
|
||||||
12930, 13960, 2048, 834,
|
12930, 13960, 2048, 834,
|
||||||
3270, 4100, 26920, 16237,
|
3270, 4100, 26920, 16237,
|
||||||
31227, 17667, 15059, 20589,
|
31227, 17667, 15059, 20589,
|
||||||
30249, 29123, 0
|
30249, 29123, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M23k[PRMN_23k] =
|
static const Word16 dfh_M23k[PRMN_23k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9132,
|
3168, 31665, 9943, 9132,
|
||||||
16748, 3202, 28179, 16317,
|
16748, 3202, 28179, 16317,
|
||||||
30590, 15857, 19960, 8818,
|
30590, 15857, 19960, 8818,
|
||||||
21711, 21538, 4260, 16690,
|
21711, 21538, 4260, 16690,
|
||||||
20224, 3666, 4194, 9497,
|
20224, 3666, 4194, 9497,
|
||||||
16320, 15388, 5755, 31551,
|
16320, 15388, 5755, 31551,
|
||||||
14080, 3574, 15932, 50,
|
14080, 3574, 15932, 50,
|
||||||
23392, 26053, 31216
|
23392, 26053, 31216
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Word16 dfh_M24k[PRMN_24k] =
|
static const Word16 dfh_M24k[PRMN_24k] =
|
||||||
{
|
{
|
||||||
3168, 31665, 9943, 9134,
|
3168, 31665, 9943, 9134,
|
||||||
24776, 5857, 18475, 28535,
|
24776, 5857, 18475, 28535,
|
||||||
29662, 14321, 16725, 4396,
|
29662, 14321, 16725, 4396,
|
||||||
29353, 10003, 17068, 20504,
|
29353, 10003, 17068, 20504,
|
||||||
720, 0, 8465, 12581,
|
720, 0, 8465, 12581,
|
||||||
28863, 24774, 9709, 26043,
|
28863, 24774, 9709, 26043,
|
||||||
7941, 27649, 13965, 15236,
|
7941, 27649, 13965, 15236,
|
||||||
18026, 22047, 16681, 3968
|
18026, 22047, 16681, 3968
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ const static Word16 table[129] = {
|
|||||||
|
|
||||||
/* slope in Q11 used to compute y = acos(x) */
|
/* slope in Q11 used to compute y = acos(x) */
|
||||||
|
|
||||||
const static Word16 slope[128] = {
|
const static Word16 slope[128] = {
|
||||||
-26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771,
|
-26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771,
|
||||||
-1579, -1409, -1279, -1170, -1079, -1004, -933, -880,
|
-1579, -1409, -1279, -1170, -1079, -1004, -933, -880,
|
||||||
-827, -783, -743, -708, -676, -647, -621, -599,
|
-827, -783, -743, -708, -676, -647, -621, -599,
|
||||||
|
|||||||
@@ -25,20 +25,20 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef __LOG2_H__
|
#ifndef __LOG2_H__
|
||||||
#define __LOG2_H__
|
#define __LOG2_H__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* INCLUDE FILES
|
* INCLUDE FILES
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
#include "typedef.h"
|
#include "typedef.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* DEFINITION OF DATA TYPES
|
* DEFINITION OF DATA TYPES
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* DECLARATION OF PROTOTYPES
|
* DECLARATION OF PROTOTYPES
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ static Word16 sort_1265[253] = {
|
|||||||
244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
|
244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
|
||||||
120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
|
120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
|
||||||
232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
|
232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
|
||||||
142, 195, 245
|
142, 195, 245
|
||||||
};
|
};
|
||||||
|
|
||||||
static Word16 sort_1425[285] = {
|
static Word16 sort_1425[285] = {
|
||||||
@@ -205,7 +205,7 @@ static Word16 sort_1825[365] = {
|
|||||||
257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
|
257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
|
||||||
240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
|
240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
|
||||||
105, 91, 346, 318, 183, 250, 197, 328, 95, 155,
|
105, 91, 346, 318, 183, 250, 197, 328, 95, 155,
|
||||||
169, 268, 226, 236, 264
|
169, 268, 226, 236, 264
|
||||||
};
|
};
|
||||||
|
|
||||||
static Word16 sort_1985[397] = {
|
static Word16 sort_1985[397] = {
|
||||||
@@ -248,7 +248,7 @@ static Word16 sort_1985[397] = {
|
|||||||
128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
|
128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
|
||||||
293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
|
293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
|
||||||
261, 186, 176, 271, 90, 100, 147, 322, 275, 361,
|
261, 186, 176, 271, 90, 100, 147, 322, 275, 361,
|
||||||
71, 332, 61, 265, 157, 246, 236
|
71, 332, 61, 265, 157, 246, 236
|
||||||
};
|
};
|
||||||
|
|
||||||
static Word16 sort_2305[461] = {
|
static Word16 sort_2305[461] = {
|
||||||
@@ -349,7 +349,7 @@ static Word16 sort_2385[477] = {
|
|||||||
132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
|
132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
|
||||||
352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
|
352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
|
||||||
465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
|
465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
|
||||||
239, 250, 133, 144, 432, 337, 326
|
239, 250, 133, 144, 432, 337, 326
|
||||||
};
|
};
|
||||||
|
|
||||||
static Word16 sort_SID[35] = {
|
static Word16 sort_SID[35] = {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ Contains: VOME API Buffer Operator Implement Header
|
|||||||
#define __STREAM_H__
|
#define __STREAM_H__
|
||||||
|
|
||||||
#include "voMem.h"
|
#include "voMem.h"
|
||||||
#define Frame_Maxsize 1024 * 2 //Work Buffer 10K
|
#define Frame_Maxsize 1024 * 2 //Work Buffer 10K
|
||||||
#define Frame_MaxByte 640 //AMR_WB Encoder one frame 320 samples = 640 Bytes
|
#define Frame_MaxByte 640 //AMR_WB Encoder one frame 320 samples = 640 Bytes
|
||||||
#define MIN(a,b) ((a) < (b)? (a) : (b))
|
#define MIN(a,b) ((a) < (b)? (a) : (b))
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ typedef struct{
|
|||||||
unsigned char *frame_ptr;
|
unsigned char *frame_ptr;
|
||||||
unsigned char *frame_ptr_bk;
|
unsigned char *frame_ptr_bk;
|
||||||
int set_len;
|
int set_len;
|
||||||
int framebuffer_len;
|
int framebuffer_len;
|
||||||
int frame_storelen;
|
int frame_storelen;
|
||||||
int used_len;
|
int used_len;
|
||||||
}FrameStream;
|
}FrameStream;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
/*
|
/*
|
||||||
* this is the original code from the ETSI file typedef.h
|
* this is the original code from the ETSI file typedef.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
|
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
|
||||||
typedef signed char Word8;
|
typedef signed char Word8;
|
||||||
typedef short Word16;
|
typedef short Word16;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
* OSF only defined if the current platform is an Alpha
|
* OSF only defined if the current platform is an Alpha
|
||||||
* PC only defined if the current platform is a PC
|
* PC only defined if the current platform is a PC
|
||||||
* SUN only defined if the current platform is a Sun
|
* SUN only defined if the current platform is a Sun
|
||||||
*
|
*
|
||||||
* LSBFIRST is defined if the byte order on this platform is
|
* LSBFIRST is defined if the byte order on this platform is
|
||||||
* "least significant byte first" -> defined on DEC Alpha
|
* "least significant byte first" -> defined on DEC Alpha
|
||||||
* and PC, undefined on Sun
|
* and PC, undefined on Sun
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* DEFINITION OF CONSTANTS
|
* DEFINITION OF CONSTANTS
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
@@ -197,7 +197,7 @@ typedef int Bool;
|
|||||||
#define Syn_filt_32 voAWB_Syn_filt_32
|
#define Syn_filt_32 voAWB_Syn_filt_32
|
||||||
#define Isf_isp voAWB_Isf_isp
|
#define Isf_isp voAWB_Isf_isp
|
||||||
#define Levinson voAWB_Levinson
|
#define Levinson voAWB_Levinson
|
||||||
#define median5 voAWB_median5
|
#define median5 voAWB_median5
|
||||||
#define Pred_lt4 voAWB_Pred_lt4
|
#define Pred_lt4 voAWB_Pred_lt4
|
||||||
#define Reorder_isf voAWB_Reorder_isf
|
#define Reorder_isf voAWB_Reorder_isf
|
||||||
#define Dpisf_2s_36b voAWB_Dpisf_2s_36b
|
#define Dpisf_2s_36b voAWB_Dpisf_2s_36b
|
||||||
|
|||||||
@@ -30,10 +30,10 @@
|
|||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Deemph_32_asm
|
.global Deemph_32_asm
|
||||||
|
|
||||||
Deemph_32_asm:
|
Deemph_32_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
MOV r4, #2 @i=0
|
MOV r4, #2 @i=0
|
||||||
LDRSH r6, [r0], #2 @load x_hi[0]
|
LDRSH r6, [r0], #2 @load x_hi[0]
|
||||||
LDRSH r7, [r1], #2 @load x_lo[0]
|
LDRSH r7, [r1], #2 @load x_lo[0]
|
||||||
@@ -47,9 +47,9 @@ Deemph_32_asm:
|
|||||||
ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
|
ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
|
||||||
MOV r10, r12, LSL #3 @L_tmp <<= 3
|
MOV r10, r12, LSL #3 @L_tmp <<= 3
|
||||||
MUL r9, r5, r8
|
MUL r9, r5, r8
|
||||||
LDRSH r6, [r0], #2 @load x_hi[1]
|
LDRSH r6, [r0], #2 @load x_hi[1]
|
||||||
QDADD r10, r10, r9
|
QDADD r10, r10, r9
|
||||||
LDRSH r7, [r1], #2 @load x_lo[1]
|
LDRSH r7, [r1], #2 @load x_lo[1]
|
||||||
MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
|
MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
|
||||||
QADD r10, r12, r11
|
QADD r10, r12, r11
|
||||||
MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
|
MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
|
||||||
@@ -94,9 +94,9 @@ LOOP:
|
|||||||
|
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
STR r14, [r3]
|
STR r14, [r3]
|
||||||
STRH r14, [r2]
|
STRH r14, [r2]
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
@ENDP
|
@ENDP
|
||||||
.END
|
.END
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
Dot_product12_asm:
|
Dot_product12_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
MOV r4, #0 @ L_sum = 0
|
MOV r4, #0 @ L_sum = 0
|
||||||
MOV r5, #0 @ i = 0
|
MOV r5, #0 @ i = 0
|
||||||
|
|
||||||
@@ -41,13 +41,13 @@ LOOP:
|
|||||||
LDR r8, [r0], #4
|
LDR r8, [r0], #4
|
||||||
SMLABB r4, r6, r7, r4
|
SMLABB r4, r6, r7, r4
|
||||||
LDR r9, [r1], #4
|
LDR r9, [r1], #4
|
||||||
SMLATT r4, r6, r7, r4
|
SMLATT r4, r6, r7, r4
|
||||||
|
|
||||||
LDR r6, [r0], #4
|
LDR r6, [r0], #4
|
||||||
SMLABB r4, r8, r9, r4
|
SMLABB r4, r8, r9, r4
|
||||||
|
|
||||||
LDR r7, [r1], #4
|
LDR r7, [r1], #4
|
||||||
SMLATT r4, r8, r9, r4
|
SMLATT r4, r8, r9, r4
|
||||||
LDR r8, [r0], #4
|
LDR r8, [r0], #4
|
||||||
|
|
||||||
SMLABB r4, r6, r7, r4
|
SMLABB r4, r6, r7, r4
|
||||||
@@ -58,7 +58,7 @@ LOOP:
|
|||||||
CMP r5, r2
|
CMP r5, r2
|
||||||
SMLATT r4, r8, r9, r4
|
SMLATT r4, r8, r9, r4
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
|
|
||||||
MOV r12, r4, LSL #1
|
MOV r12, r4, LSL #1
|
||||||
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
|
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
|
||||||
MOV r4, r12
|
MOV r4, r12
|
||||||
@@ -69,12 +69,12 @@ LOOP:
|
|||||||
SUB r10, r10, #1 @ sft = norm_l(L_sum)
|
SUB r10, r10, #1 @ sft = norm_l(L_sum)
|
||||||
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
|
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
|
||||||
RSB r11, r10, #30 @ *exp = 30 - sft
|
RSB r11, r10, #30 @ *exp = 30 - sft
|
||||||
STRH r11, [r3]
|
STRH r11, [r3]
|
||||||
|
|
||||||
Dot_product12_end:
|
Dot_product12_end:
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
@******************************************************************
|
@******************************************************************
|
||||||
@ r0 --- signal[]
|
@ r0 --- signal[]
|
||||||
@ r1 --- lg
|
@ r1 --- lg
|
||||||
@ r2 --- mem[]
|
@ r2 --- mem[]
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Filt_6k_7k_asm
|
.global Filt_6k_7k_asm
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
Filt_6k_7k_asm:
|
Filt_6k_7k_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
|
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
|
||||||
MOV r8, r0 @ copy signal[] address
|
MOV r8, r0 @ copy signal[] address
|
||||||
MOV r4, r1 @ copy lg address
|
MOV r4, r1 @ copy lg address
|
||||||
@@ -43,9 +43,9 @@ Filt_6k_7k_asm:
|
|||||||
MOV r2, #30 @ L_FIR - 1
|
MOV r2, #30 @ L_FIR - 1
|
||||||
BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1)
|
BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1)
|
||||||
|
|
||||||
LDR r10, Lable1 @ get fir_7k address
|
LDR r10, Lable1 @ get fir_7k address
|
||||||
|
|
||||||
MOV r14, #0
|
MOV r14, #0
|
||||||
MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
|
MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
|
||||||
ADD r6, r13, #60 @ get x[L_FIR - 1] address
|
ADD r6, r13, #60 @ get x[L_FIR - 1] address
|
||||||
MOV r7, r3 @ get signal[i]
|
MOV r7, r3 @ get signal[i]
|
||||||
@@ -76,14 +76,14 @@ LOOP1:
|
|||||||
STRH r12, [r6], #2
|
STRH r12, [r6], #2
|
||||||
ADD r14, r14, #8
|
ADD r14, r14, #8
|
||||||
CMP r14, #80
|
CMP r14, #80
|
||||||
BLT LOOP1
|
BLT LOOP1
|
||||||
|
|
||||||
|
|
||||||
STR r5, [sp, #-4] @ PUSH r5 to stack
|
STR r5, [sp, #-4] @ PUSH r5 to stack
|
||||||
|
|
||||||
@ not use registers: r4, r10, r12, r14, r5
|
@ not use registers: r4, r10, r12, r14, r5
|
||||||
MOV r4, r13
|
MOV r4, r13
|
||||||
MOV r5, #0 @ i = 0
|
MOV r5, #0 @ i = 0
|
||||||
LOOP2:
|
LOOP2:
|
||||||
LDR r0, [r10]
|
LDR r0, [r10]
|
||||||
|
|
||||||
@@ -111,13 +111,13 @@ LOOP2:
|
|||||||
LDRSH r8, [r4, #10] @ load x[i+5]
|
LDRSH r8, [r4, #10] @ load x[i+5]
|
||||||
LDRSH r9, [r4, #50] @ load x[i+25]
|
LDRSH r9, [r4, #50] @ load x[i+25]
|
||||||
SMLABT r14, r1, r0, r14 @ (x[i+3] + x[i+27]) * fir_7k[3]
|
SMLABT r14, r1, r0, r14 @ (x[i+3] + x[i+27]) * fir_7k[3]
|
||||||
ADD r8, r8, r9 @ x[i+5] + x[i+25]
|
ADD r8, r8, r9 @ x[i+5] + x[i+25]
|
||||||
|
|
||||||
LDR r0, [r10, #8]
|
LDR r0, [r10, #8]
|
||||||
LDRSH r1, [r4, #12] @ x[i+6]
|
LDRSH r1, [r4, #12] @ x[i+6]
|
||||||
LDRSH r2, [r4, #48] @ x[i+24]
|
LDRSH r2, [r4, #48] @ x[i+24]
|
||||||
SMLABB r14, r6, r0, r14 @ (x[i+4] + x[i+26]) * fir_7k[4]
|
SMLABB r14, r6, r0, r14 @ (x[i+4] + x[i+26]) * fir_7k[4]
|
||||||
LDRSH r6, [r4, #14] @ x[i+7]
|
LDRSH r6, [r4, #14] @ x[i+7]
|
||||||
LDRSH r7, [r4, #46] @ x[i+23]
|
LDRSH r7, [r4, #46] @ x[i+23]
|
||||||
SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5]
|
SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5]
|
||||||
LDR r0, [r10, #12]
|
LDR r0, [r10, #12]
|
||||||
@@ -125,8 +125,8 @@ LOOP2:
|
|||||||
ADD r6, r6, r7 @ (x[i+7] + x[i+23])
|
ADD r6, r6, r7 @ (x[i+7] + x[i+23])
|
||||||
SMLABB r14, r1, r0, r14 @ (x[i+6] + x[i+24]) * fir_7k[6]
|
SMLABB r14, r1, r0, r14 @ (x[i+6] + x[i+24]) * fir_7k[6]
|
||||||
LDRSH r8, [r4, #16] @ x[i+8]
|
LDRSH r8, [r4, #16] @ x[i+8]
|
||||||
LDRSH r9, [r4, #44] @ x[i+22]
|
LDRSH r9, [r4, #44] @ x[i+22]
|
||||||
SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7]
|
SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7]
|
||||||
LDR r0, [r10, #16]
|
LDR r0, [r10, #16]
|
||||||
LDRSH r1, [r4, #18] @ x[i+9]
|
LDRSH r1, [r4, #18] @ x[i+9]
|
||||||
LDRSH r2, [r4, #42] @ x[i+21]
|
LDRSH r2, [r4, #42] @ x[i+21]
|
||||||
@@ -144,7 +144,7 @@ LOOP2:
|
|||||||
LDRSH r2, [r4, #36] @ x[i+18]
|
LDRSH r2, [r4, #36] @ x[i+18]
|
||||||
SMLABB r14, r6, r0, r14 @ (x[i+10] + x[i+20]) * fir_7k[10]
|
SMLABB r14, r6, r0, r14 @ (x[i+10] + x[i+20]) * fir_7k[10]
|
||||||
LDRSH r6, [r4, #26] @ x[i+13]
|
LDRSH r6, [r4, #26] @ x[i+13]
|
||||||
ADD r8, r8, r9 @ (x[i+11] + x[i+19])
|
ADD r8, r8, r9 @ (x[i+11] + x[i+19])
|
||||||
LDRSH r7, [r4, #34] @ x[i+17]
|
LDRSH r7, [r4, #34] @ x[i+17]
|
||||||
SMLABT r14, r8, r0, r14 @ (x[i+11] + x[i+19]) * fir_7k[11]
|
SMLABT r14, r8, r0, r14 @ (x[i+11] + x[i+19]) * fir_7k[11]
|
||||||
LDR r0, [r10, #24]
|
LDR r0, [r10, #24]
|
||||||
@@ -152,31 +152,31 @@ LOOP2:
|
|||||||
LDRSH r8, [r4, #28] @ x[i+14]
|
LDRSH r8, [r4, #28] @ x[i+14]
|
||||||
SMLABB r14, r1, r0, r14 @ (x[i+12] + x[i+18]) * fir_7k[12]
|
SMLABB r14, r1, r0, r14 @ (x[i+12] + x[i+18]) * fir_7k[12]
|
||||||
ADD r6, r6, r7 @ (x[i+13] + x[i+17])
|
ADD r6, r6, r7 @ (x[i+13] + x[i+17])
|
||||||
LDRSH r9, [r4, #32] @ x[i+16]
|
LDRSH r9, [r4, #32] @ x[i+16]
|
||||||
SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13]
|
SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13]
|
||||||
LDR r0, [r10, #28]
|
LDR r0, [r10, #28]
|
||||||
ADD r8, r8, r9 @ (x[i+14] + x[i+16])
|
ADD r8, r8, r9 @ (x[i+14] + x[i+16])
|
||||||
LDRSH r1, [r4, #30] @ x[i+15]
|
LDRSH r1, [r4, #30] @ x[i+15]
|
||||||
SMLABB r14, r8, r0, r14 @ (x[i+14] + x[i+16]) * fir_7k[14]
|
SMLABB r14, r8, r0, r14 @ (x[i+14] + x[i+16]) * fir_7k[14]
|
||||||
SMLABT r14, r1, r0, r14 @ x[i+15] * fir_7k[15]
|
SMLABT r14, r1, r0, r14 @ x[i+15] * fir_7k[15]
|
||||||
|
|
||||||
ADD r5, r5, #1
|
ADD r5, r5, #1
|
||||||
ADD r14, r14, #0x4000
|
ADD r14, r14, #0x4000
|
||||||
ADD r4, r4, #2
|
ADD r4, r4, #2
|
||||||
MOV r1, r14, ASR #15
|
MOV r1, r14, ASR #15
|
||||||
CMP r5, #80
|
CMP r5, #80
|
||||||
STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15
|
STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15
|
||||||
BLT LOOP2
|
BLT LOOP2
|
||||||
|
|
||||||
LDR r1, [sp, #-4] @mem address
|
LDR r1, [sp, #-4] @mem address
|
||||||
ADD r0, r13, #160 @x + lg
|
ADD r0, r13, #160 @x + lg
|
||||||
MOV r2, #30
|
MOV r2, #30
|
||||||
BL voAWB_Copy
|
BL voAWB_Copy
|
||||||
|
|
||||||
Filt_6k_7k_end:
|
Filt_6k_7k_end:
|
||||||
ADD r13, r13, #240
|
ADD r13, r13, #240
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
Lable1:
|
Lable1:
|
||||||
.word fir_6k_7k
|
.word fir_6k_7k
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
|
|||||||
@@ -32,8 +32,8 @@
|
|||||||
@ r6 --- corr_norm[]
|
@ r6 --- corr_norm[]
|
||||||
|
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Norm_corr_asm
|
.global Norm_corr_asm
|
||||||
.extern Convolve_asm
|
.extern Convolve_asm
|
||||||
.extern Isqrt_n
|
.extern Isqrt_n
|
||||||
@******************************
|
@******************************
|
||||||
@@ -47,17 +47,17 @@
|
|||||||
.equ T_MIN , 212
|
.equ T_MIN , 212
|
||||||
.equ T_MAX , 216
|
.equ T_MAX , 216
|
||||||
.equ CORR_NORM , 220
|
.equ CORR_NORM , 220
|
||||||
|
|
||||||
Norm_corr_asm:
|
Norm_corr_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
SUB r13, r13, #voSTACK
|
SUB r13, r13, #voSTACK
|
||||||
|
|
||||||
ADD r8, r13, #20 @get the excf[L_SUBFR]
|
ADD r8, r13, #20 @get the excf[L_SUBFR]
|
||||||
LDR r4, [r13, #T_MIN] @get t_min
|
LDR r4, [r13, #T_MIN] @get t_min
|
||||||
RSB r11, r4, #0 @k = -t_min
|
RSB r11, r4, #0 @k = -t_min
|
||||||
ADD r5, r0, r11, LSL #1 @get the &exc[k]
|
ADD r5, r0, r11, LSL #1 @get the &exc[k]
|
||||||
|
|
||||||
@transfer Convolve function
|
@transfer Convolve function
|
||||||
STMFD sp!, {r0 - r3}
|
STMFD sp!, {r0 - r3}
|
||||||
MOV r0, r5
|
MOV r0, r5
|
||||||
@@ -68,7 +68,7 @@ Norm_corr_asm:
|
|||||||
|
|
||||||
@ r8 --- excf[]
|
@ r8 --- excf[]
|
||||||
|
|
||||||
MOV r14, r1 @copy xn[] address
|
MOV r14, r1 @copy xn[] address
|
||||||
MOV r5, #64
|
MOV r5, #64
|
||||||
MOV r6, #0 @L_tmp = 0
|
MOV r6, #0 @L_tmp = 0
|
||||||
MOV r7, #1
|
MOV r7, #1
|
||||||
@@ -93,21 +93,21 @@ LOOP1:
|
|||||||
CLZ r7, r9
|
CLZ r7, r9
|
||||||
SUB r6, r7, #1 @exp = norm_l(L_tmp)
|
SUB r6, r7, #1 @exp = norm_l(L_tmp)
|
||||||
RSB r7, r6, #32 @exp = 32 - exp
|
RSB r7, r6, #32 @exp = 32 - exp
|
||||||
MOV r6, r7, ASR #1
|
MOV r6, r7, ASR #1
|
||||||
RSB r7, r6, #0 @scale = -(exp >> 1)
|
RSB r7, r6, #0 @scale = -(exp >> 1)
|
||||||
|
|
||||||
@loop for every possible period
|
@loop for every possible period
|
||||||
@for(t = t_min@ t <= t_max@ t++)
|
@for(t = t_min@ t <= t_max@ t++)
|
||||||
@r7 --- scale r4 --- t_min r8 --- excf[]
|
@r7 --- scale r4 --- t_min r8 --- excf[]
|
||||||
|
|
||||||
LOOPFOR:
|
LOOPFOR:
|
||||||
MOV r5, #0 @L_tmp = 0
|
MOV r5, #0 @L_tmp = 0
|
||||||
MOV r6, #0 @L_tmp1 = 0
|
MOV r6, #0 @L_tmp1 = 0
|
||||||
MOV r9, #64
|
MOV r9, #64
|
||||||
MOV r12, r1 @copy of xn[]
|
MOV r12, r1 @copy of xn[]
|
||||||
ADD r14, r13, #20 @copy of excf[]
|
ADD r14, r13, #20 @copy of excf[]
|
||||||
MOV r8, #0x8000
|
MOV r8, #0x8000
|
||||||
|
|
||||||
LOOPi:
|
LOOPi:
|
||||||
LDR r11, [r14], #4 @load excf[i], excf[i+1]
|
LDR r11, [r14], #4 @load excf[i], excf[i+1]
|
||||||
LDR r10, [r12], #4 @load xn[i], xn[i+1]
|
LDR r10, [r12], #4 @load xn[i], xn[i+1]
|
||||||
@@ -128,13 +128,13 @@ LOOPi:
|
|||||||
MOV r10, #1
|
MOV r10, #1
|
||||||
ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1
|
ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1
|
||||||
ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1
|
ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1
|
||||||
|
|
||||||
CLZ r10, r5
|
CLZ r10, r5
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
RSBLT r11, r5, #0
|
RSBLT r11, r5, #0
|
||||||
CLZLT r10, r11
|
CLZLT r10, r11
|
||||||
SUB r10, r10, #1 @exp = norm_l(L_tmp)
|
SUB r10, r10, #1 @exp = norm_l(L_tmp)
|
||||||
|
|
||||||
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
|
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
|
||||||
RSB r10, r10, #30 @exp_corr = 30 - exp
|
RSB r10, r10, #30 @exp_corr = 30 - exp
|
||||||
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
|
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
|
||||||
@@ -150,7 +150,7 @@ LOOPi:
|
|||||||
@Isqrt_n(&L_tmp, &exp_norm)
|
@Isqrt_n(&L_tmp, &exp_norm)
|
||||||
|
|
||||||
MOV r14, r0
|
MOV r14, r0
|
||||||
MOV r12, r1
|
MOV r12, r1
|
||||||
|
|
||||||
STMFD sp!, {r0 - r4, r7 - r12, r14}
|
STMFD sp!, {r0 - r4, r7 - r12, r14}
|
||||||
ADD r1, sp, #4
|
ADD r1, sp, #4
|
||||||
@@ -168,7 +168,7 @@ LOOPi:
|
|||||||
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
|
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
|
||||||
MUL r12, r6, r11
|
MUL r12, r6, r11
|
||||||
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
|
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
|
||||||
|
|
||||||
ADD r6, r10, r5
|
ADD r6, r10, r5
|
||||||
ADD r6, r6, r7 @exp_corr + exp_norm + scale
|
ADD r6, r6, r7 @exp_corr + exp_norm + scale
|
||||||
|
|
||||||
@@ -187,9 +187,9 @@ LOOPi:
|
|||||||
|
|
||||||
CMP r4, r6
|
CMP r4, r6
|
||||||
BEQ Norm_corr_asm_end
|
BEQ Norm_corr_asm_end
|
||||||
|
|
||||||
ADD r4, r4, #1 @ t_min ++
|
ADD r4, r4, #1 @ t_min ++
|
||||||
|
|
||||||
RSB r5, r4, #0 @ k
|
RSB r5, r4, #0 @ k
|
||||||
|
|
||||||
MOV r6, #63 @ i = 63
|
MOV r6, #63 @ i = 63
|
||||||
@@ -216,16 +216,16 @@ LOOPK:
|
|||||||
MUL r14, r11, r8
|
MUL r14, r11, r8
|
||||||
LDR r6, [r13, #T_MAX] @ get t_max
|
LDR r6, [r13, #T_MAX] @ get t_max
|
||||||
MOV r8, r14, ASR #15
|
MOV r8, r14, ASR #15
|
||||||
STRH r8, [r10]
|
STRH r8, [r10]
|
||||||
|
|
||||||
CMP r4, r6
|
CMP r4, r6
|
||||||
BLE LOOPFOR
|
BLE LOOPFOR
|
||||||
|
|
||||||
Norm_corr_asm_end:
|
Norm_corr_asm_end:
|
||||||
|
|
||||||
ADD r13, r13, #voSTACK
|
ADD r13, r13, #voSTACK
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
Syn_filt_32_asm:
|
Syn_filt_32_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
LDR r4, [r13, #40] @ get sig_hi[] address
|
LDR r4, [r13, #40] @ get sig_hi[] address
|
||||||
LDR r5, [r13, #44] @ get sig_lo[] address
|
LDR r5, [r13, #44] @ get sig_lo[] address
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ Syn_filt_32_asm:
|
|||||||
AND r8, r8, r14
|
AND r8, r8, r14
|
||||||
ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1]
|
ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1]
|
||||||
ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3]
|
ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3]
|
||||||
STR r10, [r13, #-4]
|
STR r10, [r13, #-4]
|
||||||
STR r11, [r13, #-8]
|
STR r11, [r13, #-8]
|
||||||
|
|
||||||
LDRSH r6, [r0, #10] @ load Aq[5]
|
LDRSH r6, [r0, #10] @ load Aq[5]
|
||||||
@@ -73,12 +73,12 @@ Syn_filt_32_asm:
|
|||||||
LDRSH r7, [r0, #20] @ load Aq[10]
|
LDRSH r7, [r0, #20] @ load Aq[10]
|
||||||
LDRSH r8, [r0, #22] @ load Aq[11]
|
LDRSH r8, [r0, #22] @ load Aq[11]
|
||||||
LDRSH r9, [r0, #24] @ load Aq[12]
|
LDRSH r9, [r0, #24] @ load Aq[12]
|
||||||
AND r6, r6, r14
|
AND r6, r6, r14
|
||||||
AND r8, r8, r14
|
AND r8, r8, r14
|
||||||
ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9]
|
ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9]
|
||||||
ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11]
|
ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11]
|
||||||
STR r10, [r13, #-20]
|
STR r10, [r13, #-20]
|
||||||
STR r11, [r13, #-24]
|
STR r11, [r13, #-24]
|
||||||
|
|
||||||
LDRSH r6, [r0, #26] @ load Aq[13]
|
LDRSH r6, [r0, #26] @ load Aq[13]
|
||||||
LDRSH r7, [r0, #28] @ load Aq[14]
|
LDRSH r7, [r0, #28] @ load Aq[14]
|
||||||
@@ -90,14 +90,14 @@ Syn_filt_32_asm:
|
|||||||
ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15]
|
ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15]
|
||||||
STR r10, [r13, #-28]
|
STR r10, [r13, #-28]
|
||||||
STR r11, [r13, #-32]
|
STR r11, [r13, #-32]
|
||||||
|
|
||||||
MOV r8, #0 @ i = 0
|
MOV r8, #0 @ i = 0
|
||||||
|
|
||||||
LOOP:
|
LOOP:
|
||||||
LDRSH r6, [r5, #-2] @ load sig_lo[i-1]
|
LDRSH r6, [r5, #-2] @ load sig_lo[i-1]
|
||||||
LDRSH r7, [r5, #-4] @ load sig_lo[i-2]
|
LDRSH r7, [r5, #-4] @ load sig_lo[i-2]
|
||||||
|
|
||||||
LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
|
LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
|
||||||
LDRSH r9, [r5, #-6] @ load sig_lo[i-3]
|
LDRSH r9, [r5, #-6] @ load sig_lo[i-3]
|
||||||
LDRSH r10, [r5, #-8] @ load sig_lo[i-4]
|
LDRSH r10, [r5, #-8] @ load sig_lo[i-4]
|
||||||
|
|
||||||
@@ -135,12 +135,12 @@ LOOP:
|
|||||||
LDRSH r10, [r5, #-32] @ load sig_lo[i-16]
|
LDRSH r10, [r5, #-32] @ load sig_lo[i-16]
|
||||||
SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13]
|
SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13]
|
||||||
SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14]
|
SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14]
|
||||||
|
|
||||||
LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
|
LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
|
||||||
LDRSH r6, [r2],#2 @ load exc[i]
|
LDRSH r6, [r2],#2 @ load exc[i]
|
||||||
SMLABB r12, r9, r11, r12 @ sig_lo[i-15] * Aq[15]
|
SMLABB r12, r9, r11, r12 @ sig_lo[i-15] * Aq[15]
|
||||||
SMLABT r12, r10, r11, r12 @ sig_lo[i-16] * Aq[16]
|
SMLABT r12, r10, r11, r12 @ sig_lo[i-16] * Aq[16]
|
||||||
MUL r7, r6, r3 @ exc[i] * a0
|
MUL r7, r6, r3 @ exc[i] * a0
|
||||||
RSB r14, r12, #0 @ L_tmp
|
RSB r14, r12, #0 @ L_tmp
|
||||||
MOV r14, r14, ASR #11 @ L_tmp >>= 11
|
MOV r14, r14, ASR #11 @ L_tmp >>= 11
|
||||||
ADD r14, r14, r7, LSL #1 @ L_tmp += (exc[i] * a0) << 1
|
ADD r14, r14, r7, LSL #1 @ L_tmp += (exc[i] * a0) << 1
|
||||||
@@ -149,7 +149,7 @@ LOOP:
|
|||||||
LDRSH r6, [r4, #-2] @ load sig_hi[i-1]
|
LDRSH r6, [r4, #-2] @ load sig_hi[i-1]
|
||||||
LDRSH r7, [r4, #-4] @ load sig_hi[i-2]
|
LDRSH r7, [r4, #-4] @ load sig_hi[i-2]
|
||||||
|
|
||||||
LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
|
LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
|
||||||
LDRSH r9, [r4, #-6] @ load sig_hi[i-3]
|
LDRSH r9, [r4, #-6] @ load sig_hi[i-3]
|
||||||
LDRSH r10, [r4, #-8] @ load sig_hi[i-4]
|
LDRSH r10, [r4, #-8] @ load sig_hi[i-4]
|
||||||
SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1]
|
SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1]
|
||||||
@@ -198,14 +198,14 @@ LOOP:
|
|||||||
LDRSH r10, [r4, #-32] @ load sig_hi[i-16]
|
LDRSH r10, [r4, #-32] @ load sig_hi[i-16]
|
||||||
SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13]
|
SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13]
|
||||||
SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14]
|
SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14]
|
||||||
|
|
||||||
LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
|
LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
|
||||||
SMLABB r12, r9, r11, r12 @ sig_hi[i-15] * Aq[15]
|
SMLABB r12, r9, r11, r12 @ sig_hi[i-15] * Aq[15]
|
||||||
SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16]
|
SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16]
|
||||||
ADD r6, r12, r12 @ r12 << 1
|
ADD r6, r12, r12 @ r12 << 1
|
||||||
SUB r14, r14, r6
|
SUB r14, r14, r6
|
||||||
MOV r14, r14, LSL #3 @ L_tmp <<=3
|
MOV r14, r14, LSL #3 @ L_tmp <<=3
|
||||||
|
|
||||||
MOV r7, r14, ASR #16 @ L_tmp >> 16
|
MOV r7, r14, ASR #16 @ L_tmp >> 16
|
||||||
|
|
||||||
MOV r14, r14, ASR #4 @ L_tmp >>=4
|
MOV r14, r14, ASR #4 @ L_tmp >>=4
|
||||||
@@ -213,14 +213,14 @@ LOOP:
|
|||||||
SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)
|
SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)
|
||||||
|
|
||||||
ADD r8, r8, #1
|
ADD r8, r8, #1
|
||||||
STRH r9, [r5], #2
|
STRH r9, [r5], #2
|
||||||
CMP r8, #64
|
CMP r8, #64
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
|
|
||||||
Syn_filt_32_end:
|
Syn_filt_32_end:
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,24 +27,24 @@
|
|||||||
@ r3 --- L
|
@ r3 --- L
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Convolve_asm
|
.global Convolve_asm
|
||||||
|
|
||||||
Convolve_asm:
|
Convolve_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
MOV r3, #0 @ n
|
MOV r3, #0 @ n
|
||||||
MOV r11, #0x8000
|
MOV r11, #0x8000
|
||||||
|
|
||||||
LOOP:
|
LOOP:
|
||||||
ADD r4, r1, r3, LSL #1 @ tmpH address
|
ADD r4, r1, r3, LSL #1 @ tmpH address
|
||||||
ADD r5, r3, #1 @ i = n + 1
|
ADD r5, r3, #1 @ i = n + 1
|
||||||
MOV r6, r0 @ tmpX = x
|
MOV r6, r0 @ tmpX = x
|
||||||
LDRSH r9, [r6], #2 @ *tmpX++
|
LDRSH r9, [r6], #2 @ *tmpX++
|
||||||
LDRSH r10, [r4], #-2 @ *tmpH--
|
LDRSH r10, [r4], #-2 @ *tmpH--
|
||||||
SUB r5, r5, #1
|
SUB r5, r5, #1
|
||||||
MUL r8, r9, r10
|
MUL r8, r9, r10
|
||||||
|
|
||||||
LOOP1:
|
LOOP1:
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
BLE L1
|
BLE L1
|
||||||
LDRSH r9, [r6], #2 @ *tmpX++
|
LDRSH r9, [r6], #2 @ *tmpX++
|
||||||
@@ -58,12 +58,12 @@ LOOP1:
|
|||||||
LDRSH r12, [r6], #2 @ *tmpX++
|
LDRSH r12, [r6], #2 @ *tmpX++
|
||||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||||
MLA r8, r9, r10, r8
|
MLA r8, r9, r10, r8
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
|
|
||||||
B LOOP1
|
|
||||||
|
|
||||||
L1:
|
B LOOP1
|
||||||
|
|
||||||
|
L1:
|
||||||
|
|
||||||
ADD r5, r11, r8, LSL #1
|
ADD r5, r11, r8, LSL #1
|
||||||
MOV r5, r5, LSR #16 @extract_h(s)
|
MOV r5, r5, LSR #16 @extract_h(s)
|
||||||
@@ -75,14 +75,14 @@ L1:
|
|||||||
ADD r5, r3, #1
|
ADD r5, r3, #1
|
||||||
MOV r6, r0
|
MOV r6, r0
|
||||||
LDRSH r9, [r6], #2 @ *tmpX++
|
LDRSH r9, [r6], #2 @ *tmpX++
|
||||||
LDRSH r10, [r4], #-2
|
LDRSH r10, [r4], #-2
|
||||||
LDRSH r12, [r6], #2
|
LDRSH r12, [r6], #2
|
||||||
LDRSH r14, [r4], #-2
|
LDRSH r14, [r4], #-2
|
||||||
|
|
||||||
MUL r8, r9, r10
|
MUL r8, r9, r10
|
||||||
SUB r5, r5, #2
|
SUB r5, r5, #2
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
|
|
||||||
LOOP2:
|
LOOP2:
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
BLE L2
|
BLE L2
|
||||||
@@ -97,14 +97,14 @@ LOOP2:
|
|||||||
LDRSH r12, [r6], #2 @ *tmpX++
|
LDRSH r12, [r6], #2 @ *tmpX++
|
||||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||||
MLA r8, r9, r10, r8
|
MLA r8, r9, r10, r8
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
B LOOP2
|
B LOOP2
|
||||||
|
|
||||||
L2:
|
L2:
|
||||||
ADD r8, r11, r8, LSL #1
|
ADD r8, r11, r8, LSL #1
|
||||||
MOV r8, r8, LSR #16 @extract_h(s)
|
MOV r8, r8, LSR #16 @extract_h(s)
|
||||||
ADD r3, r3, #1
|
ADD r3, r3, #1
|
||||||
STRH r8, [r2], #2 @y[n]
|
STRH r8, [r2], #2 @y[n]
|
||||||
|
|
||||||
ADD r4, r1, r3, LSL #1
|
ADD r4, r1, r3, LSL #1
|
||||||
@@ -117,7 +117,7 @@ L2:
|
|||||||
MUL r8, r9, r10
|
MUL r8, r9, r10
|
||||||
LDRSH r9, [r6], #2
|
LDRSH r9, [r6], #2
|
||||||
LDRSH r10, [r4], #-2
|
LDRSH r10, [r4], #-2
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
SUB r5, r5, #3
|
SUB r5, r5, #3
|
||||||
MLA r8, r9, r10, r8
|
MLA r8, r9, r10, r8
|
||||||
|
|
||||||
@@ -135,9 +135,9 @@ LOOP3:
|
|||||||
LDRSH r12, [r6], #2 @ *tmpX++
|
LDRSH r12, [r6], #2 @ *tmpX++
|
||||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||||
MLA r8, r9, r10, r8
|
MLA r8, r9, r10, r8
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
B LOOP3
|
B LOOP3
|
||||||
|
|
||||||
L3:
|
L3:
|
||||||
ADD r8, r11, r8, LSL #1
|
ADD r8, r11, r8, LSL #1
|
||||||
@@ -150,7 +150,7 @@ L3:
|
|||||||
MOV r6, r0
|
MOV r6, r0
|
||||||
MOV r8, #0
|
MOV r8, #0
|
||||||
|
|
||||||
LOOP4:
|
LOOP4:
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
BLE L4
|
BLE L4
|
||||||
LDRSH r9, [r6], #2 @ *tmpX++
|
LDRSH r9, [r6], #2 @ *tmpX++
|
||||||
@@ -164,22 +164,22 @@ LOOP4:
|
|||||||
LDRSH r12, [r6], #2 @ *tmpX++
|
LDRSH r12, [r6], #2 @ *tmpX++
|
||||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||||
MLA r8, r9, r10, r8
|
MLA r8, r9, r10, r8
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
B LOOP4
|
B LOOP4
|
||||||
L4:
|
L4:
|
||||||
ADD r5, r11, r8, LSL #1
|
ADD r5, r11, r8, LSL #1
|
||||||
MOV r5, r5, LSR #16 @extract_h(s)
|
MOV r5, r5, LSR #16 @extract_h(s)
|
||||||
ADD r3, r3, #1
|
ADD r3, r3, #1
|
||||||
STRH r5, [r2], #2 @y[n]
|
STRH r5, [r2], #2 @y[n]
|
||||||
|
|
||||||
CMP r3, #64
|
CMP r3, #64
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
|
|
||||||
Convolve_asm_end:
|
Convolve_asm_end:
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|||||||
@@ -51,12 +51,12 @@ LOOPi:
|
|||||||
RSB r11, r2, #62 @j=62-pos
|
RSB r11, r2, #62 @j=62-pos
|
||||||
|
|
||||||
LOOPj1:
|
LOOPj1:
|
||||||
LDRSH r12, [r10], #2
|
LDRSH r12, [r10], #2
|
||||||
LDRSH r8, [r9], #2
|
LDRSH r8, [r9], #2
|
||||||
LDRSH r14, [r9]
|
LDRSH r14, [r9]
|
||||||
SUBS r11, r11, #1
|
SUBS r11, r11, #1
|
||||||
MLA r5, r12, r8, r5
|
MLA r5, r12, r8, r5
|
||||||
MLA r6, r12, r14, r6
|
MLA r6, r12, r14, r6
|
||||||
BGE LOOPj1
|
BGE LOOPj1
|
||||||
|
|
||||||
LDRSH r12, [r10], #2 @*p1++
|
LDRSH r12, [r10], #2 @*p1++
|
||||||
@@ -64,7 +64,7 @@ LOOPj1:
|
|||||||
MLA r5, r12, r14, r5
|
MLA r5, r12, r14, r5
|
||||||
MOV r14, #0x8000
|
MOV r14, #0x8000
|
||||||
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
|
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
|
||||||
ADD r10, r6, r14
|
ADD r10, r6, r14
|
||||||
ADD r9, r5, r14
|
ADD r9, r5, r14
|
||||||
MOV r5, r9, ASR #16
|
MOV r5, r9, ASR #16
|
||||||
MOV r6, r10, ASR #16
|
MOV r6, r10, ASR #16
|
||||||
@@ -76,7 +76,7 @@ LOOPj1:
|
|||||||
MUL r14, r6, r11
|
MUL r14, r6, r11
|
||||||
MOV r5, r12, ASR #15
|
MOV r5, r12, ASR #15
|
||||||
MOV r6, r14, ASR #15
|
MOV r6, r14, ASR #15
|
||||||
LDR r9, [r13, #44]
|
LDR r9, [r13, #44]
|
||||||
LDR r12, [r13, #48]
|
LDR r12, [r13, #48]
|
||||||
LDRSH r10, [r7], #2 @*p0++
|
LDRSH r10, [r7], #2 @*p0++
|
||||||
LDRSH r11, [r8] @*p3++
|
LDRSH r11, [r8] @*p3++
|
||||||
@@ -88,7 +88,7 @@ LOOPj1:
|
|||||||
STRH r6, [r12]
|
STRH r6, [r12]
|
||||||
|
|
||||||
ADD r2, r2, #4
|
ADD r2, r2, #4
|
||||||
|
|
||||||
MOV r5, #0 @L_sum1 = 0
|
MOV r5, #0 @L_sum1 = 0
|
||||||
MOV r6, #0 @L_sum2 = 0
|
MOV r6, #0 @L_sum2 = 0
|
||||||
ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
|
ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
|
||||||
@@ -97,12 +97,12 @@ LOOPj1:
|
|||||||
ADD r4, r4, #1 @i++
|
ADD r4, r4, #1 @i++
|
||||||
|
|
||||||
LOOPj2:
|
LOOPj2:
|
||||||
LDRSH r12, [r10], #2
|
LDRSH r12, [r10], #2
|
||||||
LDRSH r8, [r9], #2
|
LDRSH r8, [r9], #2
|
||||||
LDRSH r14, [r9]
|
LDRSH r14, [r9]
|
||||||
SUBS r11, r11, #1
|
SUBS r11, r11, #1
|
||||||
MLA r5, r12, r8, r5
|
MLA r5, r12, r8, r5
|
||||||
MLA r6, r12, r14, r6
|
MLA r6, r12, r14, r6
|
||||||
BGE LOOPj2
|
BGE LOOPj2
|
||||||
|
|
||||||
LDRSH r12, [r10], #2 @*p1++
|
LDRSH r12, [r10], #2 @*p1++
|
||||||
@@ -110,7 +110,7 @@ LOOPj2:
|
|||||||
MLA r5, r12, r14, r5
|
MLA r5, r12, r14, r5
|
||||||
MOV r14, #0x8000
|
MOV r14, #0x8000
|
||||||
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
|
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
|
||||||
ADD r10, r6, r14
|
ADD r10, r6, r14
|
||||||
ADD r9, r5, r14
|
ADD r9, r5, r14
|
||||||
|
|
||||||
MOV r5, r9, ASR #16
|
MOV r5, r9, ASR #16
|
||||||
@@ -123,7 +123,7 @@ LOOPj2:
|
|||||||
MUL r14, r6, r11
|
MUL r14, r6, r11
|
||||||
MOV r5, r12, ASR #15
|
MOV r5, r12, ASR #15
|
||||||
MOV r6, r14, ASR #15
|
MOV r6, r14, ASR #15
|
||||||
LDR r9, [r13, #44]
|
LDR r9, [r13, #44]
|
||||||
LDR r12, [r13, #48]
|
LDR r12, [r13, #48]
|
||||||
LDRSH r10, [r7], #2 @*p0++
|
LDRSH r10, [r7], #2 @*p0++
|
||||||
LDRSH r11, [r8] @*p3++
|
LDRSH r11, [r8] @*p3++
|
||||||
@@ -136,16 +136,16 @@ LOOPj2:
|
|||||||
ADD r4, r4, #1 @i+1
|
ADD r4, r4, #1 @i+1
|
||||||
ADD r2, r2, #4 @pos += STEP
|
ADD r2, r2, #4 @pos += STEP
|
||||||
CMP r4, #16
|
CMP r4, #16
|
||||||
|
|
||||||
BLT LOOPi
|
BLT LOOPi
|
||||||
|
|
||||||
the_end:
|
the_end:
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
pred_lt4_asm:
|
pred_lt4_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
RSB r4, r1, #0 @-T0
|
RSB r4, r1, #0 @-T0
|
||||||
RSB r2, r2, #0 @frac = -frac
|
RSB r2, r2, #0 @frac = -frac
|
||||||
ADD r5, r0, r4, LSL #1 @x = exc - T0
|
ADD r5, r0, r4, LSL #1 @x = exc - T0
|
||||||
@@ -45,7 +45,7 @@ pred_lt4_asm:
|
|||||||
SUB r5, r5, #30 @x -= 15
|
SUB r5, r5, #30 @x -= 15
|
||||||
RSB r4, r2, #3 @k = 3 - frac
|
RSB r4, r2, #3 @k = 3 - frac
|
||||||
LDR r6, Table
|
LDR r6, Table
|
||||||
MOV r8, r4, LSL #6
|
MOV r8, r4, LSL #6
|
||||||
@MOV r7, #0 @j = 0
|
@MOV r7, #0 @j = 0
|
||||||
ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0])
|
ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0])
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ THREE_LOOP:
|
|||||||
LDRSH r6, [r1], #2 @x[1]
|
LDRSH r6, [r1], #2 @x[1]
|
||||||
LDRSH r9, [r1], #2 @x[2]
|
LDRSH r9, [r1], #2 @x[2]
|
||||||
|
|
||||||
SMULBB r10, r4, r3 @x[0] * h[0]
|
SMULBB r10, r4, r3 @x[0] * h[0]
|
||||||
SMULBB r11, r6, r3 @x[1] * h[0]
|
SMULBB r11, r6, r3 @x[1] * h[0]
|
||||||
SMULBB r12, r9, r3 @x[2] * h[0]
|
SMULBB r12, r9, r3 @x[2] * h[0]
|
||||||
|
|
||||||
@@ -285,7 +285,7 @@ Last2LOOP:
|
|||||||
|
|
||||||
SMLABB r10, r9, r3, r10 @x[2] * h[2]
|
SMLABB r10, r9, r3, r10 @x[2] * h[2]
|
||||||
SMLABB r11, r4, r3, r11 @x[3] * h[2]
|
SMLABB r11, r4, r3, r11 @x[3] * h[2]
|
||||||
|
|
||||||
SMLABT r10, r4, r3, r10 @x[3] * h[3]
|
SMLABT r10, r4, r3, r10 @x[3] * h[3]
|
||||||
SMLABT r11, r6, r3, r11 @x[4] * h[3]
|
SMLABT r11, r6, r3, r11 @x[4] * h[3]
|
||||||
|
|
||||||
@@ -435,7 +435,7 @@ Last2LOOP:
|
|||||||
MOV r11, r11, LSL #1
|
MOV r11, r11, LSL #1
|
||||||
|
|
||||||
QADD r10, r10, r10
|
QADD r10, r10, r10
|
||||||
QADD r11, r11, r11
|
QADD r11, r11, r11
|
||||||
|
|
||||||
QADD r10, r10, r5
|
QADD r10, r10, r5
|
||||||
QADD r11, r11, r5
|
QADD r11, r11, r5
|
||||||
|
|||||||
@@ -34,12 +34,12 @@ Residu_opt:
|
|||||||
|
|
||||||
LDRH r5, [r0], #2
|
LDRH r5, [r0], #2
|
||||||
LDRH r6, [r0], #2
|
LDRH r6, [r0], #2
|
||||||
ORR r5, r6, r5, LSL #16 @r5 --- a0, a1
|
ORR r5, r6, r5, LSL #16 @r5 --- a0, a1
|
||||||
|
|
||||||
LDRH r6, [r0], #2
|
LDRH r6, [r0], #2
|
||||||
LDRH r7, [r0], #2
|
LDRH r7, [r0], #2
|
||||||
ORR r6, r7, r6, LSL #16 @r6 --- a2, a3
|
ORR r6, r7, r6, LSL #16 @r6 --- a2, a3
|
||||||
|
|
||||||
LDRH r7, [r0], #2
|
LDRH r7, [r0], #2
|
||||||
LDRH r8, [r0], #2
|
LDRH r8, [r0], #2
|
||||||
ORR r7, r8, r7, LSL #16 @r7 --- a4, a5
|
ORR r7, r8, r7, LSL #16 @r7 --- a4, a5
|
||||||
@@ -59,13 +59,13 @@ Residu_opt:
|
|||||||
LDRH r11, [r0], #2
|
LDRH r11, [r0], #2
|
||||||
LDRH r12, [r0], #2
|
LDRH r12, [r0], #2
|
||||||
ORR r11, r12, r11, LSL #16 @r11 --- a12, a13
|
ORR r11, r12, r11, LSL #16 @r11 --- a12, a13
|
||||||
|
|
||||||
LDRH r12, [r0], #2
|
LDRH r12, [r0], #2
|
||||||
LDRH r4, [r0], #2
|
LDRH r4, [r0], #2
|
||||||
ORR r12, r4, r12, LSL #16 @r12 --- a14, a15
|
ORR r12, r4, r12, LSL #16 @r12 --- a14, a15
|
||||||
|
|
||||||
|
|
||||||
STMFD r13!, {r8 - r12} @store r8-r12
|
|
||||||
|
STMFD r13!, {r8 - r12} @store r8-r12
|
||||||
LDRH r4, [r0], #2 @load a16
|
LDRH r4, [r0], #2 @load a16
|
||||||
MOV r14, r3, ASR #2 @one loop get 4 outputs
|
MOV r14, r3, ASR #2 @one loop get 4 outputs
|
||||||
ADD r1, r1, #4
|
ADD r1, r1, #4
|
||||||
@@ -78,7 +78,7 @@ residu_loop:
|
|||||||
LDR r2, [r1], #-4 @r2 --- x[1], x[0]
|
LDR r2, [r1], #-4 @r2 --- x[1], x[0]
|
||||||
|
|
||||||
SMULTB r3, r5, r2 @i1(0) --- r3 = x[0] * a0
|
SMULTB r3, r5, r2 @i1(0) --- r3 = x[0] * a0
|
||||||
SMULTT r4, r5, r2 @i2(0) --- r4 = x[1] * a0
|
SMULTT r4, r5, r2 @i2(0) --- r4 = x[1] * a0
|
||||||
SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0
|
SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0
|
||||||
SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0
|
SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0
|
||||||
|
|
||||||
@@ -88,20 +88,20 @@ residu_loop:
|
|||||||
|
|
||||||
SMLATB r11, r6, r2, r11 @i3(2) --- r11 += x[0] * a2
|
SMLATB r11, r6, r2, r11 @i3(2) --- r11 += x[0] * a2
|
||||||
SMLATT r12, r6, r2, r12 @i4(2) --- r12 += x[1] * a2
|
SMLATT r12, r6, r2, r12 @i4(2) --- r12 += x[1] * a2
|
||||||
SMLABB r12, r6, r2, r12 @i4(3) --- r12 += x[0] * a3
|
SMLABB r12, r6, r2, r12 @i4(3) --- r12 += x[0] * a3
|
||||||
|
|
||||||
LDR r2, [r1], #-4 @r2 ---- x[-1], x[-2]
|
LDR r2, [r1], #-4 @r2 ---- x[-1], x[-2]
|
||||||
|
|
||||||
SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1
|
SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1
|
||||||
SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2
|
SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2
|
||||||
SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3
|
SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3
|
||||||
SMLATT r12, r7, r2, r12 @i4(4) --- r12 += x[-1] * a4
|
SMLATT r12, r7, r2, r12 @i4(4) --- r12 += x[-1] * a4
|
||||||
SMLATB r3, r6, r2, r3 @i1(2) --- r3 += x[-2] * a2
|
SMLATB r3, r6, r2, r3 @i1(2) --- r3 += x[-2] * a2
|
||||||
|
|
||||||
SMLABB r4, r6, r2, r4 @ i2 (3)
|
SMLABB r4, r6, r2, r4 @ i2 (3)
|
||||||
SMLATB r11,r7, r2, r11 @ i3 (4)
|
SMLATB r11,r7, r2, r11 @ i3 (4)
|
||||||
SMLABB r12,r7, r2, r12 @ i4 (5)
|
SMLABB r12,r7, r2, r12 @ i4 (5)
|
||||||
|
|
||||||
LDR r2,[r1],#-4
|
LDR r2,[r1],#-4
|
||||||
SMLABT r3, r6, r2, r3 @ i1 (3)
|
SMLABT r3, r6, r2, r3 @ i1 (3)
|
||||||
SMLATT r4, r7, r2, r4 @ i2 (4)
|
SMLATT r4, r7, r2, r4 @ i2 (4)
|
||||||
@@ -111,7 +111,7 @@ residu_loop:
|
|||||||
SMLABB r4, r7, r2, r4 @ i2 (5)
|
SMLABB r4, r7, r2, r4 @ i2 (5)
|
||||||
SMLATB r11,r8, r2, r11 @ i3 (6)
|
SMLATB r11,r8, r2, r11 @ i3 (6)
|
||||||
SMLABB r12,r8, r2, r12 @ i4 (7)
|
SMLABB r12,r8, r2, r12 @ i4 (7)
|
||||||
|
|
||||||
LDR r2,[r1],#-4
|
LDR r2,[r1],#-4
|
||||||
SMLABT r3, r7, r2, r3 @ i1 (5)
|
SMLABT r3, r7, r2, r3 @ i1 (5)
|
||||||
SMLATT r4, r8, r2, r4 @ i2 (6)
|
SMLATT r4, r8, r2, r4 @ i2 (6)
|
||||||
@@ -122,7 +122,7 @@ residu_loop:
|
|||||||
SMLATB r11,r9, r2, r11 @ i3 (8)
|
SMLATB r11,r9, r2, r11 @ i3 (8)
|
||||||
SMLABB r12,r9, r2, r12 @ i4 (9)
|
SMLABB r12,r9, r2, r12 @ i4 (9)
|
||||||
LDR r10, [r13, #8] @ [ a10 | a11]
|
LDR r10, [r13, #8] @ [ a10 | a11]
|
||||||
|
|
||||||
LDR r2,[r1],#-4
|
LDR r2,[r1],#-4
|
||||||
SMLABT r3, r8, r2, r3 @ i1 (7)
|
SMLABT r3, r8, r2, r3 @ i1 (7)
|
||||||
SMLATT r4, r9, r2, r4 @ i2 (8)
|
SMLATT r4, r9, r2, r4 @ i2 (8)
|
||||||
@@ -133,7 +133,7 @@ residu_loop:
|
|||||||
SMLATB r11,r10, r2, r11 @ i3 (10)
|
SMLATB r11,r10, r2, r11 @ i3 (10)
|
||||||
SMLABB r12,r10, r2, r12 @ i4 (11)
|
SMLABB r12,r10, r2, r12 @ i4 (11)
|
||||||
LDR r8, [r13, #12] @ [ a12 | a13 ]
|
LDR r8, [r13, #12] @ [ a12 | a13 ]
|
||||||
|
|
||||||
LDR r2,[r1],#-4
|
LDR r2,[r1],#-4
|
||||||
SMLABT r3, r9, r2, r3 @ i1 (9)
|
SMLABT r3, r9, r2, r3 @ i1 (9)
|
||||||
SMLATT r4, r10, r2, r4 @ i2 (10)
|
SMLATT r4, r10, r2, r4 @ i2 (10)
|
||||||
@@ -144,7 +144,7 @@ residu_loop:
|
|||||||
SMLATB r11,r8, r2, r11 @ i3 (12)
|
SMLATB r11,r8, r2, r11 @ i3 (12)
|
||||||
SMLABB r12,r8, r2, r12 @ i4 (13)
|
SMLABB r12,r8, r2, r12 @ i4 (13)
|
||||||
LDR r9, [r13, #16] @ [ a14 | a15 ]
|
LDR r9, [r13, #16] @ [ a14 | a15 ]
|
||||||
|
|
||||||
LDR r2,[r1],#-4
|
LDR r2,[r1],#-4
|
||||||
SMLABT r3, r10, r2, r3 @ i1 (11)
|
SMLABT r3, r10, r2, r3 @ i1 (11)
|
||||||
SMLATT r4, r8, r2, r4 @ i2 (12)
|
SMLATT r4, r8, r2, r4 @ i2 (12)
|
||||||
@@ -154,7 +154,7 @@ residu_loop:
|
|||||||
SMLABB r4, r8, r2, r4 @ i2 (13)
|
SMLABB r4, r8, r2, r4 @ i2 (13)
|
||||||
SMLATB r11,r9, r2, r11 @ i3 (14)
|
SMLATB r11,r9, r2, r11 @ i3 (14)
|
||||||
SMLABB r12,r9, r2, r12 @ i4 (15)
|
SMLABB r12,r9, r2, r12 @ i4 (15)
|
||||||
|
|
||||||
|
|
||||||
LDR r2,[r1],#-4
|
LDR r2,[r1],#-4
|
||||||
SMLABT r3, r8, r2, r3 @ i1 (13)
|
SMLABT r3, r8, r2, r3 @ i1 (13)
|
||||||
@@ -165,64 +165,64 @@ residu_loop:
|
|||||||
SMLABB r4, r9, r2, r4 @ i2 (15)
|
SMLABB r4, r9, r2, r4 @ i2 (15)
|
||||||
SMLABB r11,r14, r2, r11 @ i3 (16)
|
SMLABB r11,r14, r2, r11 @ i3 (16)
|
||||||
LDR r8, [r13] @ [ a6 | a7 ]
|
LDR r8, [r13] @ [ a6 | a7 ]
|
||||||
|
|
||||||
LDR r2,[r1],#44 @ Change
|
LDR r2,[r1],#44 @ Change
|
||||||
SMLABT r3, r9, r2, r3
|
SMLABT r3, r9, r2, r3
|
||||||
SMLABB r3, r14, r2, r3
|
SMLABB r3, r14, r2, r3
|
||||||
SMLABT r4, r14, r2, r4
|
SMLABT r4, r14, r2, r4
|
||||||
LDR r9, [r13, #4] @ [ a8 | a9 ]
|
LDR r9, [r13, #4] @ [ a8 | a9 ]
|
||||||
|
|
||||||
|
|
||||||
QADD r3,r3,r3
|
|
||||||
QADD r4,r4,r4
|
QADD r3,r3,r3
|
||||||
QADD r11,r11,r11
|
QADD r4,r4,r4
|
||||||
QADD r12,r12,r12
|
QADD r11,r11,r11
|
||||||
|
QADD r12,r12,r12
|
||||||
QADD r3,r3,r3
|
|
||||||
QADD r4,r4,r4
|
QADD r3,r3,r3
|
||||||
QADD r11,r11,r11
|
QADD r4,r4,r4
|
||||||
QADD r12,r12,r12
|
QADD r11,r11,r11
|
||||||
|
QADD r12,r12,r12
|
||||||
QADD r3,r3,r3
|
|
||||||
QADD r4,r4,r4
|
QADD r3,r3,r3
|
||||||
QADD r11,r11,r11
|
QADD r4,r4,r4
|
||||||
QADD r12,r12,r12
|
QADD r11,r11,r11
|
||||||
|
QADD r12,r12,r12
|
||||||
QADD r3,r3,r3
|
|
||||||
QADD r4,r4,r4
|
QADD r3,r3,r3
|
||||||
QADD r11,r11,r11
|
QADD r4,r4,r4
|
||||||
QADD r12,r12,r12
|
QADD r11,r11,r11
|
||||||
|
QADD r12,r12,r12
|
||||||
MOV r2,#32768
|
|
||||||
|
MOV r2,#32768
|
||||||
QDADD r3,r2,r3
|
|
||||||
QDADD r4,r2,r4
|
QDADD r3,r2,r3
|
||||||
QDADD r11,r2,r11
|
QDADD r4,r2,r4
|
||||||
QDADD r12,r2,r12
|
QDADD r11,r2,r11
|
||||||
|
QDADD r12,r2,r12
|
||||||
|
|
||||||
|
|
||||||
MOV r3,r3,asr #16
|
MOV r3,r3,asr #16
|
||||||
MOV r4,r4,asr #16
|
MOV r4,r4,asr #16
|
||||||
MOV r11,r11,asr #16
|
MOV r11,r11,asr #16
|
||||||
MOV r12,r12,asr #16
|
MOV r12,r12,asr #16
|
||||||
|
|
||||||
STRH r3,[r0],#2
|
STRH r3,[r0],#2
|
||||||
STRH r4,[r0],#2
|
STRH r4,[r0],#2
|
||||||
STRH r11,[r0],#2
|
STRH r11,[r0],#2
|
||||||
STRH r12,[r0],#2
|
STRH r12,[r0],#2
|
||||||
|
|
||||||
MOV r2,r14,asr #16
|
MOV r2,r14,asr #16
|
||||||
SUB r14, r14, #0x10000
|
SUB r14, r14, #0x10000
|
||||||
SUBS r2,r2,#1
|
SUBS r2,r2,#1
|
||||||
BNE residu_loop
|
BNE residu_loop
|
||||||
end:
|
end:
|
||||||
LDMFD r13!, {r8 -r12}
|
LDMFD r13!, {r8 -r12}
|
||||||
LDMFD r13!, {r4 -r12,pc}
|
LDMFD r13!, {r4 -r12,pc}
|
||||||
|
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Scale_sig_opt:
|
|||||||
MOV r8, #0x7fffffff
|
MOV r8, #0x7fffffff
|
||||||
MOV r9, #0x8000
|
MOV r9, #0x8000
|
||||||
BLE LOOP2
|
BLE LOOP2
|
||||||
|
|
||||||
LOOP1:
|
LOOP1:
|
||||||
|
|
||||||
LDRSH r5, [r4] @load x[i]
|
LDRSH r5, [r4] @load x[i]
|
||||||
@@ -65,11 +65,11 @@ LOOP2:
|
|||||||
|
|
||||||
The_end:
|
The_end:
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,18 +33,18 @@
|
|||||||
|
|
||||||
Syn_filt_asm:
|
Syn_filt_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
|
SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
|
||||||
|
|
||||||
MOV r4, r3 @ copy mem[] address
|
MOV r4, r3 @ copy mem[] address
|
||||||
MOV r5, r13 @ copy yy = y_buf address
|
MOV r5, r13 @ copy yy = y_buf address
|
||||||
|
|
||||||
@ for(i = 0@ i < m@ i++)
|
@ for(i = 0@ i < m@ i++)
|
||||||
@{
|
@{
|
||||||
@ *yy++ = mem[i]@
|
@ *yy++ = mem[i]@
|
||||||
@}
|
@}
|
||||||
|
|
||||||
LDRH r6, [r4], #2
|
LDRH r6, [r4], #2
|
||||||
LDRH r7, [r4], #2
|
LDRH r7, [r4], #2
|
||||||
LDRH r8, [r4], #2
|
LDRH r8, [r4], #2
|
||||||
LDRH r9, [r4], #2
|
LDRH r9, [r4], #2
|
||||||
@@ -62,7 +62,7 @@ Syn_filt_asm:
|
|||||||
STRH r12, [r5], #2
|
STRH r12, [r5], #2
|
||||||
STRH r14, [r5], #2
|
STRH r14, [r5], #2
|
||||||
|
|
||||||
LDRH r6, [r4], #2
|
LDRH r6, [r4], #2
|
||||||
LDRH r7, [r4], #2
|
LDRH r7, [r4], #2
|
||||||
LDRH r8, [r4], #2
|
LDRH r8, [r4], #2
|
||||||
LDRH r9, [r4], #2
|
LDRH r9, [r4], #2
|
||||||
@@ -92,45 +92,45 @@ Syn_filt_asm:
|
|||||||
LDRSH r9, [r0, #6] @ load a[3]
|
LDRSH r9, [r0, #6] @ load a[3]
|
||||||
LDRSH r11,[r0, #8] @ load a[4]
|
LDRSH r11,[r0, #8] @ load a[4]
|
||||||
AND r6, r6, r14
|
AND r6, r6, r14
|
||||||
AND r9, r9, r14
|
AND r9, r9, r14
|
||||||
ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1]
|
ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1]
|
||||||
ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3]
|
ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3]
|
||||||
STR r10, [r13, #-4]
|
STR r10, [r13, #-4]
|
||||||
STR r12, [r13, #-8]
|
STR r12, [r13, #-8]
|
||||||
|
|
||||||
LDRSH r6, [r0, #10] @ load a[5]
|
LDRSH r6, [r0, #10] @ load a[5]
|
||||||
LDRSH r7, [r0, #12] @ load a[6]
|
LDRSH r7, [r0, #12] @ load a[6]
|
||||||
LDRSH r9, [r0, #14] @ load a[7]
|
LDRSH r9, [r0, #14] @ load a[7]
|
||||||
LDRSH r11,[r0, #16] @ load a[8]
|
LDRSH r11,[r0, #16] @ load a[8]
|
||||||
AND r6, r6, r14
|
AND r6, r6, r14
|
||||||
AND r9, r9, r14
|
AND r9, r9, r14
|
||||||
ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5]
|
ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5]
|
||||||
ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7]
|
ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7]
|
||||||
STR r10, [r13, #-12]
|
STR r10, [r13, #-12]
|
||||||
STR r12, [r13, #-16]
|
STR r12, [r13, #-16]
|
||||||
|
|
||||||
LDRSH r6, [r0, #18] @ load a[9]
|
LDRSH r6, [r0, #18] @ load a[9]
|
||||||
LDRSH r7, [r0, #20] @ load a[10]
|
LDRSH r7, [r0, #20] @ load a[10]
|
||||||
LDRSH r9, [r0, #22] @ load a[11]
|
LDRSH r9, [r0, #22] @ load a[11]
|
||||||
LDRSH r11,[r0, #24] @ load a[12]
|
LDRSH r11,[r0, #24] @ load a[12]
|
||||||
AND r6, r6, r14
|
AND r6, r6, r14
|
||||||
AND r9, r9, r14
|
AND r9, r9, r14
|
||||||
ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9]
|
ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9]
|
||||||
ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11]
|
ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11]
|
||||||
STR r10, [r13, #-20]
|
STR r10, [r13, #-20]
|
||||||
STR r12, [r13, #-24]
|
STR r12, [r13, #-24]
|
||||||
|
|
||||||
LDRSH r6, [r0, #26] @ load a[13]
|
LDRSH r6, [r0, #26] @ load a[13]
|
||||||
LDRSH r7, [r0, #28] @ load a[14]
|
LDRSH r7, [r0, #28] @ load a[14]
|
||||||
LDRSH r9, [r0, #30] @ load a[15]
|
LDRSH r9, [r0, #30] @ load a[15]
|
||||||
LDRSH r11,[r0, #32] @ load a[16]
|
LDRSH r11,[r0, #32] @ load a[16]
|
||||||
AND r6, r6, r14
|
AND r6, r6, r14
|
||||||
AND r9, r9, r14
|
AND r9, r9, r14
|
||||||
ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13]
|
ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13]
|
||||||
ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15]
|
ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15]
|
||||||
STR r10, [r13, #-28]
|
STR r10, [r13, #-28]
|
||||||
STR r12, [r13, #-32]
|
STR r12, [r13, #-32]
|
||||||
|
|
||||||
ADD r4, r13, #32
|
ADD r4, r13, #32
|
||||||
LOOP:
|
LOOP:
|
||||||
LDRSH r6, [r1], #2 @ load x[i]
|
LDRSH r6, [r1], #2 @ load x[i]
|
||||||
@@ -155,8 +155,8 @@ LOOP:
|
|||||||
SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3))
|
SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3))
|
||||||
|
|
||||||
LDRSH r9, [r10, #-10] @ *(temp_p - 5)
|
LDRSH r9, [r10, #-10] @ *(temp_p - 5)
|
||||||
|
|
||||||
SMLABT r14, r11, r7, r14 @ -a[4] * (*(temp_p -4))
|
SMLABT r14, r11, r7, r14 @ -a[4] * (*(temp_p -4))
|
||||||
|
|
||||||
LDR r7, [r13, #-12] @ -a[6] -a[5]
|
LDR r7, [r13, #-12] @ -a[6] -a[5]
|
||||||
LDRSH r12, [r10, #-12] @ *(temp_p - 6)
|
LDRSH r12, [r10, #-12] @ *(temp_p - 6)
|
||||||
@@ -169,13 +169,13 @@ LOOP:
|
|||||||
|
|
||||||
LDR r7, [r13, #-16] @ -a[8] -a[7]
|
LDR r7, [r13, #-16] @ -a[8] -a[7]
|
||||||
LDRSH r11, [r10, #-16] @ *(temp_p - 8)
|
LDRSH r11, [r10, #-16] @ *(temp_p - 8)
|
||||||
|
|
||||||
SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7))
|
SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7))
|
||||||
|
|
||||||
LDRSH r9, [r10, #-18] @ *(temp_p - 9)
|
LDRSH r9, [r10, #-18] @ *(temp_p - 9)
|
||||||
|
|
||||||
SMLABT r14, r11, r7, r14 @ -a[8] * (*(temp_p -8))
|
SMLABT r14, r11, r7, r14 @ -a[8] * (*(temp_p -8))
|
||||||
|
|
||||||
LDR r7, [r13, #-20] @ -a[10] -a[9]
|
LDR r7, [r13, #-20] @ -a[10] -a[9]
|
||||||
LDRSH r12, [r10, #-20] @ *(temp_p - 10)
|
LDRSH r12, [r10, #-20] @ *(temp_p - 10)
|
||||||
|
|
||||||
@@ -192,11 +192,11 @@ LOOP:
|
|||||||
|
|
||||||
LDRSH r9, [r10, #-26] @ *(temp_p - 13)
|
LDRSH r9, [r10, #-26] @ *(temp_p - 13)
|
||||||
|
|
||||||
SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12))
|
SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12))
|
||||||
|
|
||||||
LDR r7, [r13, #-28] @ -a[14] -a[13]
|
LDR r7, [r13, #-28] @ -a[14] -a[13]
|
||||||
LDRSH r12, [r10, #-28] @ *(temp_p - 14)
|
LDRSH r12, [r10, #-28] @ *(temp_p - 14)
|
||||||
|
|
||||||
SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13))
|
SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13))
|
||||||
|
|
||||||
LDRSH r6, [r10, #-30] @ *(temp_p - 15)
|
LDRSH r6, [r10, #-30] @ *(temp_p - 15)
|
||||||
@@ -211,28 +211,28 @@ LOOP:
|
|||||||
SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16))
|
SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16))
|
||||||
|
|
||||||
RSB r14, r14, r0
|
RSB r14, r14, r0
|
||||||
|
|
||||||
MOV r7, r14, LSL #4 @ L_tmp <<=4
|
MOV r7, r14, LSL #4 @ L_tmp <<=4
|
||||||
ADD r8, r8, #1
|
ADD r8, r8, #1
|
||||||
ADD r14, r7, #0x8000
|
ADD r14, r7, #0x8000
|
||||||
MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16
|
MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16
|
||||||
CMP r8, #80
|
CMP r8, #80
|
||||||
STRH r7, [r10] @ yy[i]
|
STRH r7, [r10] @ yy[i]
|
||||||
STRH r7, [r2], #2 @ y[i]
|
STRH r7, [r2], #2 @ y[i]
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
|
|
||||||
@ update mem[]
|
@ update mem[]
|
||||||
ADD r5, r13, #160 @ yy[64] address
|
ADD r5, r13, #160 @ yy[64] address
|
||||||
MOV r1, r3
|
MOV r1, r3
|
||||||
MOV r0, r5
|
MOV r0, r5
|
||||||
MOV r2, #16
|
MOV r2, #16
|
||||||
BL voAWB_Copy
|
BL voAWB_Copy
|
||||||
|
|
||||||
Syn_filt_asm_end:
|
Syn_filt_asm_end:
|
||||||
|
|
||||||
ADD r13, r13, #700
|
ADD r13, r13, #700
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,10 +30,10 @@
|
|||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Deemph_32_asm
|
.global Deemph_32_asm
|
||||||
|
|
||||||
Deemph_32_asm:
|
Deemph_32_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
MOV r4, #2 @i=0
|
MOV r4, #2 @i=0
|
||||||
LDRSH r6, [r0], #2 @load x_hi[0]
|
LDRSH r6, [r0], #2 @load x_hi[0]
|
||||||
LDRSH r7, [r1], #2 @load x_lo[0]
|
LDRSH r7, [r1], #2 @load x_lo[0]
|
||||||
@@ -47,9 +47,9 @@ Deemph_32_asm:
|
|||||||
ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
|
ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
|
||||||
MOV r10, r12, LSL #3 @L_tmp <<= 3
|
MOV r10, r12, LSL #3 @L_tmp <<= 3
|
||||||
MUL r9, r5, r8
|
MUL r9, r5, r8
|
||||||
LDRSH r6, [r0], #2 @load x_hi[1]
|
LDRSH r6, [r0], #2 @load x_hi[1]
|
||||||
QDADD r10, r10, r9
|
QDADD r10, r10, r9
|
||||||
LDRSH r7, [r1], #2 @load x_lo[1]
|
LDRSH r7, [r1], #2 @load x_lo[1]
|
||||||
MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
|
MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
|
||||||
QADD r10, r12, r11
|
QADD r10, r12, r11
|
||||||
MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
|
MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
|
||||||
@@ -94,9 +94,9 @@ LOOP:
|
|||||||
|
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
STR r14, [r3]
|
STR r14, [r3]
|
||||||
STRH r14, [r2]
|
STRH r14, [r2]
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|||||||
@@ -45,14 +45,14 @@ Dot_product12_asm:
|
|||||||
VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[]
|
VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[]
|
||||||
|
|
||||||
VMULL.S16 Q15, D16, D0
|
VMULL.S16 Q15, D16, D0
|
||||||
VMLAL.S16 Q15, D17, D1
|
VMLAL.S16 Q15, D17, D1
|
||||||
VMLAL.S16 Q15, D18, D2
|
VMLAL.S16 Q15, D18, D2
|
||||||
VMLAL.S16 Q15, D19, D3
|
VMLAL.S16 Q15, D19, D3
|
||||||
VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[]
|
VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[]
|
||||||
VMLAL.S16 Q15, D20, D4
|
VMLAL.S16 Q15, D20, D4
|
||||||
VMLAL.S16 Q15, D21, D5
|
VMLAL.S16 Q15, D21, D5
|
||||||
VMLAL.S16 Q15, D22, D6
|
VMLAL.S16 Q15, D22, D6
|
||||||
VMLAL.S16 Q15, D23, D7
|
VMLAL.S16 Q15, D23, D7
|
||||||
VMLAL.S16 Q15, D24, D8
|
VMLAL.S16 Q15, D24, D8
|
||||||
VMLAL.S16 Q15, D25, D9
|
VMLAL.S16 Q15, D25, D9
|
||||||
VMLAL.S16 Q15, D26, D10
|
VMLAL.S16 Q15, D26, D10
|
||||||
@@ -64,9 +64,9 @@ Dot_product12_asm:
|
|||||||
|
|
||||||
CMP r2, #64
|
CMP r2, #64
|
||||||
BEQ Lable1
|
BEQ Lable1
|
||||||
VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
|
VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
|
||||||
VLD1.S16 {Q2, Q3}, [r1]!
|
VLD1.S16 {Q2, Q3}, [r1]!
|
||||||
VMLAL.S16 Q15, D4, D0
|
VMLAL.S16 Q15, D4, D0
|
||||||
VMLAL.S16 Q15, D5, D1
|
VMLAL.S16 Q15, D5, D1
|
||||||
VMLAL.S16 Q15, D6, D2
|
VMLAL.S16 Q15, D6, D2
|
||||||
VMLAL.S16 Q15, D7, D3
|
VMLAL.S16 Q15, D7, D3
|
||||||
@@ -102,11 +102,11 @@ LOOP_EQ:
|
|||||||
VMLAL.S16 Q15, D2, D2
|
VMLAL.S16 Q15, D2, D2
|
||||||
VMLAL.S16 Q15, D3, D3
|
VMLAL.S16 Q15, D3, D3
|
||||||
|
|
||||||
Lable1:
|
Lable1:
|
||||||
|
|
||||||
VQADD.S32 D30, D30, D31
|
VQADD.S32 D30, D30, D31
|
||||||
VPADD.S32 D30, D30, D30
|
VPADD.S32 D30, D30, D30
|
||||||
VMOV.S32 r12, D30[0]
|
VMOV.S32 r12, D30[0]
|
||||||
|
|
||||||
ADD r12, r12, r12
|
ADD r12, r12, r12
|
||||||
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
|
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
|
||||||
@@ -117,11 +117,11 @@ Lable1:
|
|||||||
SUB r10, r10, #1 @ sft = norm_l(L_sum)
|
SUB r10, r10, #1 @ sft = norm_l(L_sum)
|
||||||
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
|
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
|
||||||
RSB r11, r10, #30 @ *exp = 30 - sft
|
RSB r11, r10, #30 @ *exp = 30 - sft
|
||||||
STRH r11, [r3]
|
STRH r11, [r3]
|
||||||
|
|
||||||
Dot_product12_end:
|
Dot_product12_end:
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
@ ** See the License for the specific language governing permissions and
|
@ ** See the License for the specific language governing permissions and
|
||||||
@ ** limitations under the License.
|
@ ** limitations under the License.
|
||||||
@ */
|
@ */
|
||||||
@
|
@
|
||||||
@**********************************************************************/
|
@**********************************************************************/
|
||||||
@void Filt_6k_7k(
|
@void Filt_6k_7k(
|
||||||
@ Word16 signal[], /* input: signal */
|
@ Word16 signal[], /* input: signal */
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
@***********************************************************************
|
@***********************************************************************
|
||||||
@ r0 --- signal[]
|
@ r0 --- signal[]
|
||||||
@ r1 --- lg
|
@ r1 --- lg
|
||||||
@ r2 --- mem[]
|
@ r2 --- mem[]
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Filt_6k_7k_asm
|
.global Filt_6k_7k_asm
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
Filt_6k_7k_asm:
|
Filt_6k_7k_asm:
|
||||||
|
|
||||||
STMFD r13!, {r0 - r12, r14}
|
STMFD r13!, {r0 - r12, r14}
|
||||||
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
|
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
|
||||||
MOV r8, r0 @ copy signal[] address
|
MOV r8, r0 @ copy signal[] address
|
||||||
MOV r5, r2 @ copy mem[] address
|
MOV r5, r2 @ copy mem[] address
|
||||||
@@ -49,7 +49,7 @@ Filt_6k_7k_asm:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
LDR r10, Lable1 @ get fir_7k address
|
LDR r10, Lable1 @ get fir_7k address
|
||||||
MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
|
MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
|
||||||
ADD r6, r13, #60 @ get x[L_FIR - 1] address
|
ADD r6, r13, #60 @ get x[L_FIR - 1] address
|
||||||
MOV r7, r3 @ get signal[i]
|
MOV r7, r3 @ get signal[i]
|
||||||
@@ -81,9 +81,9 @@ Filt_6k_7k_asm:
|
|||||||
MOV r12, r5
|
MOV r12, r5
|
||||||
@STR r5, [sp, #-4] @ PUSH r5 to stack
|
@STR r5, [sp, #-4] @ PUSH r5 to stack
|
||||||
@ not use registers: r4, r10, r12, r14, r5
|
@ not use registers: r4, r10, r12, r14, r5
|
||||||
MOV r4, r13
|
MOV r4, r13
|
||||||
MOV r5, #0 @ i = 0
|
MOV r5, #0 @ i = 0
|
||||||
|
|
||||||
@ r4 --- x[i], r10 ---- fir_6k_7k
|
@ r4 --- x[i], r10 ---- fir_6k_7k
|
||||||
VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15]
|
VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15]
|
||||||
VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31]
|
VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31]
|
||||||
@@ -91,20 +91,20 @@ Filt_6k_7k_asm:
|
|||||||
|
|
||||||
VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15]
|
VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15]
|
||||||
VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31]
|
VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31]
|
||||||
VLD1.S16 {Q8}, [r4]!
|
VLD1.S16 {Q8}, [r4]!
|
||||||
VMOV.S16 Q15, #0
|
VMOV.S16 Q15, #0
|
||||||
|
|
||||||
LOOP_6K7K:
|
LOOP_6K7K:
|
||||||
|
|
||||||
VMULL.S16 Q9,D8,D0[0]
|
VMULL.S16 Q9,D8,D0[0]
|
||||||
VMULL.S16 Q10,D9,D1[0]
|
VMULL.S16 Q10,D9,D1[0]
|
||||||
VMULL.S16 Q11,D9,D0[0]
|
VMULL.S16 Q11,D9,D0[0]
|
||||||
VMULL.S16 Q12,D10,D1[0]
|
VMULL.S16 Q12,D10,D1[0]
|
||||||
VEXT.8 Q4,Q4,Q5,#2
|
VEXT.8 Q4,Q4,Q5,#2
|
||||||
VMLAL.S16 Q9,D10,D2[0]
|
VMLAL.S16 Q9,D10,D2[0]
|
||||||
VMLAL.S16 Q10,D11,D3[0]
|
VMLAL.S16 Q10,D11,D3[0]
|
||||||
VMLAL.S16 Q11,D11,D2[0]
|
VMLAL.S16 Q11,D11,D2[0]
|
||||||
VMLAL.S16 Q12,D12,D3[0]
|
VMLAL.S16 Q12,D12,D3[0]
|
||||||
VEXT.8 Q5,Q5,Q6,#2
|
VEXT.8 Q5,Q5,Q6,#2
|
||||||
VMLAL.S16 Q9,D12,D4[0]
|
VMLAL.S16 Q9,D12,D4[0]
|
||||||
VMLAL.S16 Q10,D13,D5[0]
|
VMLAL.S16 Q10,D13,D5[0]
|
||||||
@@ -115,18 +115,18 @@ LOOP_6K7K:
|
|||||||
VMLAL.S16 Q10,D15,D7[0]
|
VMLAL.S16 Q10,D15,D7[0]
|
||||||
VMLAL.S16 Q11,D15,D6[0]
|
VMLAL.S16 Q11,D15,D6[0]
|
||||||
VMLAL.S16 Q12,D16,D7[0]
|
VMLAL.S16 Q12,D16,D7[0]
|
||||||
VEXT.8 Q7,Q7,Q8,#2
|
VEXT.8 Q7,Q7,Q8,#2
|
||||||
|
|
||||||
VMLAL.S16 Q9,D8,D0[1]
|
VMLAL.S16 Q9,D8,D0[1]
|
||||||
VMLAL.S16 Q10,D9,D1[1]
|
VMLAL.S16 Q10,D9,D1[1]
|
||||||
VEXT.8 Q8,Q8,Q15,#2
|
VEXT.8 Q8,Q8,Q15,#2
|
||||||
VMLAL.S16 Q11,D9,D0[1]
|
VMLAL.S16 Q11,D9,D0[1]
|
||||||
VMLAL.S16 Q12,D10,D1[1]
|
VMLAL.S16 Q12,D10,D1[1]
|
||||||
VEXT.8 Q4,Q4,Q5,#2
|
VEXT.8 Q4,Q4,Q5,#2
|
||||||
VMLAL.S16 Q9,D10,D2[1]
|
VMLAL.S16 Q9,D10,D2[1]
|
||||||
VMLAL.S16 Q10,D11,D3[1]
|
VMLAL.S16 Q10,D11,D3[1]
|
||||||
VMLAL.S16 Q11,D11,D2[1]
|
VMLAL.S16 Q11,D11,D2[1]
|
||||||
VMLAL.S16 Q12,D12,D3[1]
|
VMLAL.S16 Q12,D12,D3[1]
|
||||||
VEXT.8 Q5,Q5,Q6,#2
|
VEXT.8 Q5,Q5,Q6,#2
|
||||||
VMLAL.S16 Q9,D12,D4[1]
|
VMLAL.S16 Q9,D12,D4[1]
|
||||||
VMLAL.S16 Q10,D13,D5[1]
|
VMLAL.S16 Q10,D13,D5[1]
|
||||||
@@ -137,18 +137,18 @@ LOOP_6K7K:
|
|||||||
VMLAL.S16 Q10,D15,D7[1]
|
VMLAL.S16 Q10,D15,D7[1]
|
||||||
VMLAL.S16 Q11,D15,D6[1]
|
VMLAL.S16 Q11,D15,D6[1]
|
||||||
VMLAL.S16 Q12,D16,D7[1]
|
VMLAL.S16 Q12,D16,D7[1]
|
||||||
VEXT.8 Q7,Q7,Q8,#2
|
VEXT.8 Q7,Q7,Q8,#2
|
||||||
|
|
||||||
VMLAL.S16 Q9,D8,D0[2]
|
VMLAL.S16 Q9,D8,D0[2]
|
||||||
VMLAL.S16 Q10,D9,D1[2]
|
VMLAL.S16 Q10,D9,D1[2]
|
||||||
VEXT.8 Q8,Q8,Q15,#2
|
VEXT.8 Q8,Q8,Q15,#2
|
||||||
VMLAL.S16 Q11,D9,D0[2]
|
VMLAL.S16 Q11,D9,D0[2]
|
||||||
VMLAL.S16 Q12,D10,D1[2]
|
VMLAL.S16 Q12,D10,D1[2]
|
||||||
VEXT.8 Q4,Q4,Q5,#2
|
VEXT.8 Q4,Q4,Q5,#2
|
||||||
VMLAL.S16 Q9,D10,D2[2]
|
VMLAL.S16 Q9,D10,D2[2]
|
||||||
VMLAL.S16 Q10,D11,D3[2]
|
VMLAL.S16 Q10,D11,D3[2]
|
||||||
VMLAL.S16 Q11,D11,D2[2]
|
VMLAL.S16 Q11,D11,D2[2]
|
||||||
VMLAL.S16 Q12,D12,D3[2]
|
VMLAL.S16 Q12,D12,D3[2]
|
||||||
VEXT.8 Q5,Q5,Q6,#2
|
VEXT.8 Q5,Q5,Q6,#2
|
||||||
VMLAL.S16 Q9,D12,D4[2]
|
VMLAL.S16 Q9,D12,D4[2]
|
||||||
VMLAL.S16 Q10,D13,D5[2]
|
VMLAL.S16 Q10,D13,D5[2]
|
||||||
@@ -159,18 +159,18 @@ LOOP_6K7K:
|
|||||||
VMLAL.S16 Q10,D15,D7[2]
|
VMLAL.S16 Q10,D15,D7[2]
|
||||||
VMLAL.S16 Q11,D15,D6[2]
|
VMLAL.S16 Q11,D15,D6[2]
|
||||||
VMLAL.S16 Q12,D16,D7[2]
|
VMLAL.S16 Q12,D16,D7[2]
|
||||||
VEXT.8 Q7,Q7,Q8,#2
|
VEXT.8 Q7,Q7,Q8,#2
|
||||||
|
|
||||||
VMLAL.S16 Q9,D8,D0[3]
|
VMLAL.S16 Q9,D8,D0[3]
|
||||||
VMLAL.S16 Q10,D9,D1[3]
|
VMLAL.S16 Q10,D9,D1[3]
|
||||||
VEXT.8 Q8,Q8,Q15,#2
|
VEXT.8 Q8,Q8,Q15,#2
|
||||||
VMLAL.S16 Q11,D9,D0[3]
|
VMLAL.S16 Q11,D9,D0[3]
|
||||||
VMLAL.S16 Q12,D10,D1[3]
|
VMLAL.S16 Q12,D10,D1[3]
|
||||||
VEXT.8 Q4,Q4,Q5,#2
|
VEXT.8 Q4,Q4,Q5,#2
|
||||||
VMLAL.S16 Q9,D10,D2[3]
|
VMLAL.S16 Q9,D10,D2[3]
|
||||||
VMLAL.S16 Q10,D11,D3[3]
|
VMLAL.S16 Q10,D11,D3[3]
|
||||||
VMLAL.S16 Q11,D11,D2[3]
|
VMLAL.S16 Q11,D11,D2[3]
|
||||||
VMLAL.S16 Q12,D12,D3[3]
|
VMLAL.S16 Q12,D12,D3[3]
|
||||||
VEXT.8 Q5,Q5,Q6,#2
|
VEXT.8 Q5,Q5,Q6,#2
|
||||||
VMLAL.S16 Q9,D12,D4[3]
|
VMLAL.S16 Q9,D12,D4[3]
|
||||||
VMLAL.S16 Q10,D13,D5[3]
|
VMLAL.S16 Q10,D13,D5[3]
|
||||||
@@ -181,10 +181,10 @@ LOOP_6K7K:
|
|||||||
VMLAL.S16 Q10,D15,D7[3]
|
VMLAL.S16 Q10,D15,D7[3]
|
||||||
VMLAL.S16 Q11,D15,D6[3]
|
VMLAL.S16 Q11,D15,D6[3]
|
||||||
VMLAL.S16 Q12,D16,D7[3]
|
VMLAL.S16 Q12,D16,D7[3]
|
||||||
VEXT.8 Q7,Q7,Q8,#2
|
VEXT.8 Q7,Q7,Q8,#2
|
||||||
|
|
||||||
VMOV.S16 D8,D9
|
VMOV.S16 D8,D9
|
||||||
VEXT.8 Q8,Q8,Q15,#2
|
VEXT.8 Q8,Q8,Q15,#2
|
||||||
VMOV.S16 D9,D10
|
VMOV.S16 D9,D10
|
||||||
VADD.S32 Q9,Q9,Q10
|
VADD.S32 Q9,Q9,Q10
|
||||||
VMOV.S16 D10,D11
|
VMOV.S16 D10,D11
|
||||||
@@ -214,12 +214,12 @@ LOOP_6K7K:
|
|||||||
VST1.S16 {D4, D5, D6}, [r1]!
|
VST1.S16 {D4, D5, D6}, [r1]!
|
||||||
VST1.S16 D7[0], [r1]!
|
VST1.S16 D7[0], [r1]!
|
||||||
VST1.S16 D7[1], [r1]!
|
VST1.S16 D7[1], [r1]!
|
||||||
|
|
||||||
Filt_6k_7k_end:
|
Filt_6k_7k_end:
|
||||||
|
|
||||||
ADD r13, r13, #240
|
ADD r13, r13, #240
|
||||||
LDMFD r13!, {r0 - r12, r15}
|
LDMFD r13!, {r0 - r12, r15}
|
||||||
|
|
||||||
Lable1:
|
Lable1:
|
||||||
.word fir_6k_7k
|
.word fir_6k_7k
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Norm_corr_asm
|
.global Norm_corr_asm
|
||||||
.extern Convolve_asm
|
.extern Convolve_asm
|
||||||
.extern Isqrt_n
|
.extern Isqrt_n
|
||||||
@******************************
|
@******************************
|
||||||
@@ -47,17 +47,17 @@
|
|||||||
.equ T_MIN , 212
|
.equ T_MIN , 212
|
||||||
.equ T_MAX , 216
|
.equ T_MAX , 216
|
||||||
.equ CORR_NORM , 220
|
.equ CORR_NORM , 220
|
||||||
|
|
||||||
Norm_corr_asm:
|
Norm_corr_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
SUB r13, r13, #voSTACK
|
SUB r13, r13, #voSTACK
|
||||||
|
|
||||||
ADD r8, r13, #20 @get the excf[L_SUBFR]
|
ADD r8, r13, #20 @get the excf[L_SUBFR]
|
||||||
LDR r4, [r13, #T_MIN] @get t_min
|
LDR r4, [r13, #T_MIN] @get t_min
|
||||||
RSB r11, r4, #0 @k = -t_min
|
RSB r11, r4, #0 @k = -t_min
|
||||||
ADD r5, r0, r11, LSL #1 @get the &exc[k]
|
ADD r5, r0, r11, LSL #1 @get the &exc[k]
|
||||||
|
|
||||||
@transfer Convolve function
|
@transfer Convolve function
|
||||||
STMFD sp!, {r0 - r3}
|
STMFD sp!, {r0 - r3}
|
||||||
MOV r0, r5
|
MOV r0, r5
|
||||||
@@ -68,7 +68,7 @@ Norm_corr_asm:
|
|||||||
|
|
||||||
@ r8 --- excf[]
|
@ r8 --- excf[]
|
||||||
|
|
||||||
MOV r14, r1 @copy xn[] address
|
MOV r14, r1 @copy xn[] address
|
||||||
MOV r7, #1
|
MOV r7, #1
|
||||||
VLD1.S16 {Q0, Q1}, [r14]!
|
VLD1.S16 {Q0, Q1}, [r14]!
|
||||||
VLD1.S16 {Q2, Q3}, [r14]!
|
VLD1.S16 {Q2, Q3}, [r14]!
|
||||||
@@ -95,34 +95,34 @@ Norm_corr_asm:
|
|||||||
VQADD.S32 D20, D20, D21
|
VQADD.S32 D20, D20, D21
|
||||||
VMOV.S32 r9, D20[0]
|
VMOV.S32 r9, D20[0]
|
||||||
VMOV.S32 r10, D20[1]
|
VMOV.S32 r10, D20[1]
|
||||||
QADD r6, r9, r10
|
QADD r6, r9, r10
|
||||||
QADD r6, r6, r6
|
QADD r6, r6, r6
|
||||||
QADD r9, r6, r7 @L_tmp = (L_tmp << 1) + 1;
|
QADD r9, r6, r7 @L_tmp = (L_tmp << 1) + 1;
|
||||||
CLZ r7, r9
|
CLZ r7, r9
|
||||||
SUB r6, r7, #1 @exp = norm_l(L_tmp)
|
SUB r6, r7, #1 @exp = norm_l(L_tmp)
|
||||||
RSB r7, r6, #32 @exp = 32 - exp
|
RSB r7, r6, #32 @exp = 32 - exp
|
||||||
MOV r6, r7, ASR #1
|
MOV r6, r7, ASR #1
|
||||||
RSB r7, r6, #0 @scale = -(exp >> 1)
|
RSB r7, r6, #0 @scale = -(exp >> 1)
|
||||||
|
|
||||||
@loop for every possible period
|
@loop for every possible period
|
||||||
@for(t = t_min@ t <= t_max@ t++)
|
@for(t = t_min@ t <= t_max@ t++)
|
||||||
@r7 --- scale r4 --- t_min r8 --- excf[]
|
@r7 --- scale r4 --- t_min r8 --- excf[]
|
||||||
|
|
||||||
LOOPFOR:
|
LOOPFOR:
|
||||||
ADD r14, r13, #20 @copy of excf[]
|
ADD r14, r13, #20 @copy of excf[]
|
||||||
MOV r12, r1 @copy of xn[]
|
MOV r12, r1 @copy of xn[]
|
||||||
MOV r8, #0x8000
|
MOV r8, #0x8000
|
||||||
|
|
||||||
VLD1.S16 {Q0, Q1}, [r14]! @ load 16 excf[]
|
VLD1.S16 {Q0, Q1}, [r14]! @ load 16 excf[]
|
||||||
VLD1.S16 {Q2, Q3}, [r14]! @ load 16 excf[]
|
VLD1.S16 {Q2, Q3}, [r14]! @ load 16 excf[]
|
||||||
VLD1.S16 {Q4, Q5}, [r12]! @ load 16 x[]
|
VLD1.S16 {Q4, Q5}, [r12]! @ load 16 x[]
|
||||||
VLD1.S16 {Q6, Q7}, [r12]! @ load 16 x[]
|
VLD1.S16 {Q6, Q7}, [r12]! @ load 16 x[]
|
||||||
VMULL.S16 Q10, D0, D0 @L_tmp1 += excf[] * excf[]
|
VMULL.S16 Q10, D0, D0 @L_tmp1 += excf[] * excf[]
|
||||||
VMULL.S16 Q11, D0, D8 @L_tmp += x[] * excf[]
|
VMULL.S16 Q11, D0, D8 @L_tmp += x[] * excf[]
|
||||||
VMLAL.S16 Q10, D1, D1
|
VMLAL.S16 Q10, D1, D1
|
||||||
VMLAL.S16 Q11, D1, D9
|
VMLAL.S16 Q11, D1, D9
|
||||||
VMLAL.S16 Q10, D2, D2
|
VMLAL.S16 Q10, D2, D2
|
||||||
VMLAL.S16 Q11, D2, D10
|
VMLAL.S16 Q11, D2, D10
|
||||||
VMLAL.S16 Q10, D3, D3
|
VMLAL.S16 Q10, D3, D3
|
||||||
VMLAL.S16 Q11, D3, D11
|
VMLAL.S16 Q11, D3, D11
|
||||||
VMLAL.S16 Q10, D4, D4
|
VMLAL.S16 Q10, D4, D4
|
||||||
@@ -143,7 +143,7 @@ LOOPFOR:
|
|||||||
VMLAL.S16 Q10, D1, D1
|
VMLAL.S16 Q10, D1, D1
|
||||||
VMLAL.S16 Q11, D1, D9
|
VMLAL.S16 Q11, D1, D9
|
||||||
VMLAL.S16 Q10, D2, D2
|
VMLAL.S16 Q10, D2, D2
|
||||||
VMLAL.S16 Q11, D2, D10
|
VMLAL.S16 Q11, D2, D10
|
||||||
VMLAL.S16 Q10, D3, D3
|
VMLAL.S16 Q10, D3, D3
|
||||||
VMLAL.S16 Q11, D3, D11
|
VMLAL.S16 Q11, D3, D11
|
||||||
VMLAL.S16 Q10, D4, D4
|
VMLAL.S16 Q10, D4, D4
|
||||||
@@ -162,19 +162,19 @@ LOOPFOR:
|
|||||||
VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1
|
VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1
|
||||||
|
|
||||||
VMOV.S32 r6, D20[0]
|
VMOV.S32 r6, D20[0]
|
||||||
VMOV.S32 r5, D22[0]
|
VMOV.S32 r5, D22[0]
|
||||||
|
|
||||||
@r5 --- L_tmp, r6 --- L_tmp1
|
@r5 --- L_tmp, r6 --- L_tmp1
|
||||||
MOV r10, #1
|
MOV r10, #1
|
||||||
ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1
|
ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1
|
||||||
ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1
|
ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1
|
||||||
|
|
||||||
CLZ r10, r5
|
CLZ r10, r5
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
RSBLT r11, r5, #0
|
RSBLT r11, r5, #0
|
||||||
CLZLT r10, r11
|
CLZLT r10, r11
|
||||||
SUB r10, r10, #1 @exp = norm_l(L_tmp)
|
SUB r10, r10, #1 @exp = norm_l(L_tmp)
|
||||||
|
|
||||||
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
|
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
|
||||||
RSB r10, r10, #30 @exp_corr = 30 - exp
|
RSB r10, r10, #30 @exp_corr = 30 - exp
|
||||||
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
|
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
|
||||||
@@ -190,7 +190,7 @@ LOOPFOR:
|
|||||||
@Isqrt_n(&L_tmp, &exp_norm)
|
@Isqrt_n(&L_tmp, &exp_norm)
|
||||||
|
|
||||||
MOV r14, r0
|
MOV r14, r0
|
||||||
MOV r12, r1
|
MOV r12, r1
|
||||||
|
|
||||||
STMFD sp!, {r0 - r4, r7 - r12, r14}
|
STMFD sp!, {r0 - r4, r7 - r12, r14}
|
||||||
ADD r1, sp, #4
|
ADD r1, sp, #4
|
||||||
@@ -208,7 +208,7 @@ LOOPFOR:
|
|||||||
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
|
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
|
||||||
MUL r12, r6, r11
|
MUL r12, r6, r11
|
||||||
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
|
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
|
||||||
|
|
||||||
ADD r6, r10, r5
|
ADD r6, r10, r5
|
||||||
ADD r6, r6, r7 @exp_corr + exp_norm + scale
|
ADD r6, r6, r7 @exp_corr + exp_norm + scale
|
||||||
|
|
||||||
@@ -227,8 +227,8 @@ LOOPFOR:
|
|||||||
|
|
||||||
CMP r4, r6
|
CMP r4, r6
|
||||||
BEQ Norm_corr_asm_end
|
BEQ Norm_corr_asm_end
|
||||||
|
|
||||||
ADD r4, r4, #1 @ t_min ++
|
ADD r4, r4, #1 @ t_min ++
|
||||||
RSB r5, r4, #0 @ k
|
RSB r5, r4, #0 @ k
|
||||||
|
|
||||||
MOV r6, #63 @ i = 63
|
MOV r6, #63 @ i = 63
|
||||||
@@ -255,16 +255,16 @@ LOOPK:
|
|||||||
MUL r14, r11, r8
|
MUL r14, r11, r8
|
||||||
LDR r6, [r13, #T_MAX] @ get t_max
|
LDR r6, [r13, #T_MAX] @ get t_max
|
||||||
MOV r8, r14, ASR #15
|
MOV r8, r14, ASR #15
|
||||||
STRH r8, [r10]
|
STRH r8, [r10]
|
||||||
|
|
||||||
CMP r4, r6
|
CMP r4, r6
|
||||||
BLE LOOPFOR
|
BLE LOOPFOR
|
||||||
|
|
||||||
Norm_corr_asm_end:
|
Norm_corr_asm_end:
|
||||||
|
|
||||||
ADD r13, r13, #voSTACK
|
ADD r13, r13, #voSTACK
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,12 +33,12 @@
|
|||||||
@ sig_lo[] --- r5
|
@ sig_lo[] --- r5
|
||||||
@ lg --- r6
|
@ lg --- r6
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Syn_filt_32_asm
|
.global Syn_filt_32_asm
|
||||||
|
|
||||||
Syn_filt_32_asm:
|
Syn_filt_32_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
LDR r4, [r13, #40] @ get sig_hi[] address
|
LDR r4, [r13, #40] @ get sig_hi[] address
|
||||||
LDR r5, [r13, #44] @ get sig_lo[] address
|
LDR r5, [r13, #44] @ get sig_lo[] address
|
||||||
|
|
||||||
@@ -49,8 +49,8 @@ Syn_filt_32_asm:
|
|||||||
SUB r10, r4, #32 @ sig_hi[-16] address
|
SUB r10, r4, #32 @ sig_hi[-16] address
|
||||||
SUB r11, r5, #32 @ sig_lo[-16] address
|
SUB r11, r5, #32 @ sig_lo[-16] address
|
||||||
|
|
||||||
VLD1.S16 {D0, D1, D2, D3}, [r0]! @a[1] ~ a[16]
|
VLD1.S16 {D0, D1, D2, D3}, [r0]! @a[1] ~ a[16]
|
||||||
|
|
||||||
MOV r8, #0 @ i = 0
|
MOV r8, #0 @ i = 0
|
||||||
|
|
||||||
VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1]
|
VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1]
|
||||||
@@ -58,9 +58,9 @@ Syn_filt_32_asm:
|
|||||||
VREV64.16 D1, D1
|
VREV64.16 D1, D1
|
||||||
VLD1.S16 {D8, D9, D10, D11}, [r11]! @ sig_lo[-16] ~ sig_lo[-1]
|
VLD1.S16 {D8, D9, D10, D11}, [r11]! @ sig_lo[-16] ~ sig_lo[-1]
|
||||||
VREV64.16 D2, D2
|
VREV64.16 D2, D2
|
||||||
VREV64.16 D3, D3
|
VREV64.16 D3, D3
|
||||||
VDUP.S32 Q15, r8
|
VDUP.S32 Q15, r8
|
||||||
|
|
||||||
SYN_LOOP:
|
SYN_LOOP:
|
||||||
|
|
||||||
LDRSH r6, [r2], #2 @exc[i]
|
LDRSH r6, [r2], #2 @exc[i]
|
||||||
@@ -73,12 +73,12 @@ SYN_LOOP:
|
|||||||
|
|
||||||
VEXT.8 D9, D9, D10, #2
|
VEXT.8 D9, D9, D10, #2
|
||||||
VEXT.8 D10, D10, D11, #2
|
VEXT.8 D10, D10, D11, #2
|
||||||
|
|
||||||
VPADD.S32 D28, D20, D21
|
VPADD.S32 D28, D20, D21
|
||||||
MUL r12, r6, r3 @exc[i] * a0
|
MUL r12, r6, r3 @exc[i] * a0
|
||||||
VPADD.S32 D29, D28, D28
|
VPADD.S32 D29, D28, D28
|
||||||
VDUP.S32 Q10, D29[0] @result1
|
VDUP.S32 Q10, D29[0] @result1
|
||||||
|
|
||||||
VMULL.S16 Q11, D4, D3
|
VMULL.S16 Q11, D4, D3
|
||||||
VMLAL.S16 Q11, D5, D2
|
VMLAL.S16 Q11, D5, D2
|
||||||
VSUB.S32 Q10, Q15, Q10
|
VSUB.S32 Q10, Q15, Q10
|
||||||
@@ -101,7 +101,7 @@ SYN_LOOP:
|
|||||||
|
|
||||||
VSHR.S32 Q10, Q10, #11 @result1 >>= 11
|
VSHR.S32 Q10, Q10, #11 @result1 >>= 11
|
||||||
VSHL.S32 Q11, Q11, #1 @result2 <<= 1
|
VSHL.S32 Q11, Q11, #1 @result2 <<= 1
|
||||||
VDUP.S32 Q12, r14
|
VDUP.S32 Q12, r14
|
||||||
VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1)
|
VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1)
|
||||||
VSUB.S32 Q12, Q12, Q11
|
VSUB.S32 Q12, Q12, Q11
|
||||||
|
|
||||||
@@ -122,12 +122,12 @@ SYN_LOOP:
|
|||||||
STRH r12, [r5], #2 @stroe sig_lo[i]
|
STRH r12, [r5], #2 @stroe sig_lo[i]
|
||||||
|
|
||||||
CMP r8, #64
|
CMP r8, #64
|
||||||
BLT SYN_LOOP
|
BLT SYN_LOOP
|
||||||
|
|
||||||
Syn_filt_32_end:
|
Syn_filt_32_end:
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,22 +20,22 @@
|
|||||||
@* Word16 y[], /* (o) : output vector */
|
@* Word16 y[], /* (o) : output vector */
|
||||||
@* Word16 L /* (i) : vector size */
|
@* Word16 L /* (i) : vector size */
|
||||||
@*)
|
@*)
|
||||||
@
|
@
|
||||||
@ r0 --- x[]
|
@ r0 --- x[]
|
||||||
@ r1 --- h[]
|
@ r1 --- h[]
|
||||||
@ r2 --- y[]
|
@ r2 --- y[]
|
||||||
@ r3 --- L
|
@ r3 --- L
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
.global Convolve_asm
|
.global Convolve_asm
|
||||||
|
|
||||||
Convolve_asm:
|
Convolve_asm:
|
||||||
|
|
||||||
STMFD r13!, {r4 - r12, r14}
|
STMFD r13!, {r4 - r12, r14}
|
||||||
MOV r3, #0
|
MOV r3, #0
|
||||||
MOV r11, #0x8000
|
MOV r11, #0x8000
|
||||||
|
|
||||||
LOOP:
|
LOOP:
|
||||||
@MOV r8, #0 @ s = 0
|
@MOV r8, #0 @ s = 0
|
||||||
ADD r4, r1, r3, LSL #1 @ tmpH address
|
ADD r4, r1, r3, LSL #1 @ tmpH address
|
||||||
ADD r5, r3, #1 @ i = n + 1
|
ADD r5, r3, #1 @ i = n + 1
|
||||||
@@ -43,21 +43,21 @@ LOOP:
|
|||||||
LDRSH r9, [r6], #2 @ *tmpX++
|
LDRSH r9, [r6], #2 @ *tmpX++
|
||||||
LDRSH r10, [r4] @ *tmpH--
|
LDRSH r10, [r4] @ *tmpH--
|
||||||
SUB r5, r5, #1
|
SUB r5, r5, #1
|
||||||
VMOV.S32 Q10, #0
|
VMOV.S32 Q10, #0
|
||||||
MUL r8, r9, r10
|
MUL r8, r9, r10
|
||||||
|
|
||||||
LOOP1:
|
LOOP1:
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
BLE L1
|
BLE L1
|
||||||
SUB r4, r4, #8
|
SUB r4, r4, #8
|
||||||
MOV r9, r4
|
MOV r9, r4
|
||||||
VLD1.S16 D0, [r6]!
|
VLD1.S16 D0, [r6]!
|
||||||
VLD1.S16 D1, [r9]!
|
VLD1.S16 D1, [r9]!
|
||||||
VREV64.16 D1, D1
|
VREV64.16 D1, D1
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
VMLAL.S16 Q10, D0, D1
|
VMLAL.S16 Q10, D0, D1
|
||||||
B LOOP1
|
B LOOP1
|
||||||
L1:
|
L1:
|
||||||
VADD.S32 D20, D20, D21
|
VADD.S32 D20, D20, D21
|
||||||
VPADD.S32 D20, D20, D20
|
VPADD.S32 D20, D20, D20
|
||||||
VMOV.S32 r5, D20[0]
|
VMOV.S32 r5, D20[0]
|
||||||
@@ -73,25 +73,25 @@ L1:
|
|||||||
ADD r5, r3, #1
|
ADD r5, r3, #1
|
||||||
MOV r6, r0
|
MOV r6, r0
|
||||||
LDRSH r9, [r6], #2 @ *tmpX++
|
LDRSH r9, [r6], #2 @ *tmpX++
|
||||||
LDRSH r10, [r4], #-2
|
LDRSH r10, [r4], #-2
|
||||||
LDRSH r12, [r6], #2
|
LDRSH r12, [r6], #2
|
||||||
LDRSH r14, [r4]
|
LDRSH r14, [r4]
|
||||||
|
|
||||||
MUL r8, r9, r10
|
MUL r8, r9, r10
|
||||||
SUB r5, r5, #2
|
SUB r5, r5, #2
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
|
|
||||||
VMOV.S32 Q10, #0
|
VMOV.S32 Q10, #0
|
||||||
LOOP2:
|
LOOP2:
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
BLE L2
|
BLE L2
|
||||||
SUB r4, r4, #8
|
SUB r4, r4, #8
|
||||||
MOV r9, r4
|
MOV r9, r4
|
||||||
VLD1.S16 D0, [r6]!
|
VLD1.S16 D0, [r6]!
|
||||||
VLD1.S16 D1, [r9]!
|
VLD1.S16 D1, [r9]!
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
VREV64.16 D1, D1
|
VREV64.16 D1, D1
|
||||||
VMLAL.S16 Q10, D0, D1
|
VMLAL.S16 Q10, D0, D1
|
||||||
B LOOP2
|
B LOOP2
|
||||||
L2:
|
L2:
|
||||||
VADD.S32 D20, D20, D21
|
VADD.S32 D20, D20, D21
|
||||||
@@ -100,7 +100,7 @@ L2:
|
|||||||
ADD r8, r8, r5
|
ADD r8, r8, r5
|
||||||
ADD r8, r11, r8, LSL #1
|
ADD r8, r11, r8, LSL #1
|
||||||
MOV r8, r8, LSR #16 @extract_h(s)
|
MOV r8, r8, LSR #16 @extract_h(s)
|
||||||
ADD r3, r3, #1
|
ADD r3, r3, #1
|
||||||
STRH r8, [r2], #2 @y[n]
|
STRH r8, [r2], #2 @y[n]
|
||||||
|
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ L2:
|
|||||||
MUL r8, r9, r10
|
MUL r8, r9, r10
|
||||||
LDRSH r9, [r6], #2
|
LDRSH r9, [r6], #2
|
||||||
LDRSH r10, [r4]
|
LDRSH r10, [r4]
|
||||||
MLA r8, r12, r14, r8
|
MLA r8, r12, r14, r8
|
||||||
SUB r5, r5, #3
|
SUB r5, r5, #3
|
||||||
MLA r8, r9, r10, r8
|
MLA r8, r9, r10, r8
|
||||||
|
|
||||||
@@ -125,12 +125,12 @@ LOOP3:
|
|||||||
BLE L3
|
BLE L3
|
||||||
SUB r4, r4, #8
|
SUB r4, r4, #8
|
||||||
MOV r9, r4
|
MOV r9, r4
|
||||||
VLD1.S16 D0, [r6]!
|
VLD1.S16 D0, [r6]!
|
||||||
VLD1.S16 D1, [r9]!
|
VLD1.S16 D1, [r9]!
|
||||||
VREV64.16 D1, D1
|
VREV64.16 D1, D1
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
VMLAL.S16 Q10, D0, D1
|
VMLAL.S16 Q10, D0, D1
|
||||||
B LOOP3
|
B LOOP3
|
||||||
|
|
||||||
L3:
|
L3:
|
||||||
VADD.S32 D20, D20, D21
|
VADD.S32 D20, D20, D21
|
||||||
@@ -146,18 +146,18 @@ L3:
|
|||||||
ADD r4, r1, r5, LSL #1 @ tmpH address
|
ADD r4, r1, r5, LSL #1 @ tmpH address
|
||||||
MOV r6, r0
|
MOV r6, r0
|
||||||
VMOV.S32 Q10, #0
|
VMOV.S32 Q10, #0
|
||||||
LOOP4:
|
LOOP4:
|
||||||
CMP r5, #0
|
CMP r5, #0
|
||||||
BLE L4
|
BLE L4
|
||||||
SUB r4, r4, #8
|
SUB r4, r4, #8
|
||||||
MOV r9, r4
|
MOV r9, r4
|
||||||
VLD1.S16 D0, [r6]!
|
VLD1.S16 D0, [r6]!
|
||||||
VLD1.S16 D1, [r9]!
|
VLD1.S16 D1, [r9]!
|
||||||
VREV64.16 D1, D1
|
VREV64.16 D1, D1
|
||||||
SUBS r5, r5, #4
|
SUBS r5, r5, #4
|
||||||
VMLAL.S16 Q10, D0, D1
|
VMLAL.S16 Q10, D0, D1
|
||||||
B LOOP4
|
B LOOP4
|
||||||
L4:
|
L4:
|
||||||
VADD.S32 D20, D20, D21
|
VADD.S32 D20, D20, D21
|
||||||
VPADD.S32 D20, D20, D20
|
VPADD.S32 D20, D20, D20
|
||||||
VMOV.S32 r5, D20[0]
|
VMOV.S32 r5, D20[0]
|
||||||
@@ -165,14 +165,14 @@ L4:
|
|||||||
MOV r5, r5, LSR #16 @extract_h(s)
|
MOV r5, r5, LSR #16 @extract_h(s)
|
||||||
ADD r3, r3, #1
|
ADD r3, r3, #1
|
||||||
STRH r5, [r2], #2 @y[n]
|
STRH r5, [r2], #2 @y[n]
|
||||||
|
|
||||||
CMP r3, #64
|
CMP r3, #64
|
||||||
BLT LOOP
|
BLT LOOP
|
||||||
|
|
||||||
Convolve_asm_end:
|
Convolve_asm_end:
|
||||||
|
|
||||||
LDMFD r13!, {r4 - r12, r15}
|
LDMFD r13!, {r4 - r12, r15}
|
||||||
|
|
||||||
@ENDFUNC
|
@ENDFUNC
|
||||||
.END
|
.END
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user