?? util2.cpp
字號:
//#include "stdafx.h"
#include <stdio.h>
#include "LanAudio.h"
#include "Global.h"
/*
**
** File: util2.c
**
** Description: utility functions for the lbc codec
**
** Functions:
**
** I/O functions:
**
** Read_lbc()
** Write_lbc()
**
** High-pass filtering:
**
** Rem_Dc()
**
** Miscellaneous signal processing functions:
**
** Vec_Norm()
** Mem_Shift()
** Scale()
**
** Bit stream packing/unpacking:
**
** Line_Pack()
** Line_Unpk()
**
** Mathematical functions:
**
** Rand_lbc()
*/
/*
**
** Function: Read_lbc()
**
** Description: Read in a file
**
** Links to text: Sections 2.2 & 4
**
** Arguments:
**
** float *Dpnt
** int Len
** FILE *Fp
**
** Outputs:
**
** float *Dpnt
**
** Return value: None
**
*/
void Read_lbc (float *Dpnt, int Len, FILE *Fp)
{
short Ibuf[Frame];
int i,n;
n = fread (Ibuf, sizeof(short), Len, Fp);
for (i=0; i<n; i++)
Dpnt[i] = (float) Ibuf[i];
for (i=n; i<Len; i++)
Dpnt[i] = (float)0.0;
}
/*
**
** Function: Write_lbc()
**
** Description: Write a file
**
** Links to text: Section
**
** Arguments:
**
** float *Dpnt
** int Len
** FILE *Fp
**
** Outputs: None
**
** Return value: None
**
*/
void Write_lbc(float *Dpnt, int Len, FILE *Fp)
{
short Obuf[Frame];
int i;
for (i=0; i<Len; i++)
{
if (Dpnt[i] < (float)-32767.5)
Obuf[i] = -32768L;
else if (Dpnt[i] > (float)32766.5)
Obuf[i] = 32767;
else
{
if (Dpnt[i] < 0)
Obuf[i] = (short) (Dpnt[i]-(float)0.5);
else
Obuf[i] = (short) (Dpnt[i]+(float)0.5);
}
}
fwrite(Obuf, sizeof(short), Len, Fp);
}
void Line_Wr(char *Line, FILE *Fp)
{
short Info;
int Size;
Info = (short) (Line[0] & 0x0003);
/* Check frame type and rate information */
switch (Info) {
case 0x0002 : { /* SID frame */
Size = 4;
break;
}
case 0x0003 : { /* untransmitted silence frame */
Size = 1;
break;
}
case 0x0001 : { /* active frame, low rate */
Size = 20;
break;
}
default : { /* active frame, high rate */
Size = 24;
}
}
fwrite(Line, Size, 1, Fp);
}
int Line_Rd(char *Line, FILE *Fp)
{
short Info;
int Size;
if (fread(Line, 1,1, Fp) != 1)
return (-1);
Info = (short) (Line[0] & 0x0003);
/* Check frame type and rate information */
switch (Info) {
/* Active frame, high rate */
case 0 : {
Size = 23;
break;
}
/* Active frame, low rate */
case 1 : {
Size = 19;
break;
}
/* Sid Frame */
case 2 : {
Size = 3;
break;
}
/* untransmitted */
default : {
return 0;
}
}
fread(&Line[1], Size, 1, Fp);
return 0;
}
/*
**
** Function: Mem_Shift()
**
** Description: Memory shift, update of the high-passed input speech signal
**
** Links to text:
**
** Arguments:
**
** float *PrevDat
** float *DataBuff
**
** Outputs:
**
** float *PrevDat
** float *DataBuff
**
** Return value: None
**
*/
void Mem_Shift(float *PrevDat, float *DataBuff)
{
int i;
float Dpnt[Frame+LpcFrame-SubFrLen];
/* Form Buffer */
for (i=0; i < LpcFrame-SubFrLen; i++)
Dpnt[i] = PrevDat[i];
for (i=0; i < Frame; i++)
Dpnt[i+LpcFrame-SubFrLen] = DataBuff[i];
/* Update PrevDat */
for (i=0; i < LpcFrame-SubFrLen; i++)
PrevDat[i] = Dpnt[Frame+i];
/* Update DataBuff */
for (i=0; i < Frame; i++)
DataBuff[i] = Dpnt[(LpcFrame-SubFrLen)/2+i];
}
short* Par2Ser( int Inp, short *Pnt, int BitNum )
{
int i;
short Temp ;
for ( i = 0 ; i < BitNum ; i ++ ) {
Temp = (short)(Inp & 0x0001);
Inp >>= 1 ;
*Pnt ++ = Temp ;
}
return Pnt ;
}
int Ser2Par( short **Pnt, int Count )
{
int i;
int Rez = 0L;
for ( i = 0 ; i < Count ; i ++ ) {
Rez += (int) **Pnt << i ;
(*Pnt) ++ ;
}
return Rez ;
}
/*
**
** Function: Rand_lbc()
**
** Description: Generator of random numbers
**
** Links to text: Section 3.10.2
**
** Arguments:
**
** short *p
**
** Outputs:
**
** short *p
**
** Return value:
**
** short random number
**
*/
short Rand_lbc(short *p)
{
*p = (short)(((*p)*521L + 259) & 0x0000ffff);
return(*p);
}
/*
**
** Function: DotProd()
**
** Description: Dot product
**
** Links to text: Section 3.9
**
** Arguments:
**
** float *in1
** float *in2
** int len
**
** Inputs:
**
** Outputs:
**
** Return value:
**
** float dot product
**
*/
/*
float DotProd(float *in1, float *in2, int len)
{
int i;
float sum;
sum = (float)0.0;
for (i=0; i<len; i++)
sum += in1[i]*in2[i];
return(sum);
}
*/
float DotProd(float *in1, float *in2, int len)
{
__asm
{
mov eax, DWORD PTR in1
xor ebx, ebx
fldz
mov edx, DWORD PTR in2
mov ecx, len
Loop_DotProd:
fld DWORD PTR [eax+ebx]
fmul DWORD PTR [edx+ebx]
add ebx, 4
dec ecx
fadd
// faddp ST(1), ST(0)
jne Loop_DotProd
}
}
float DotProd2(float *in1, float *in2, int len)
{
__asm
{
mov eax, DWORD PTR in1
xor ebx, ebx
fldz
mov edx, DWORD PTR in2
mov ecx, len
Loop_DotProd2:
fld DWORD PTR [eax+ebx]
fmul DWORD PTR [edx+ebx]
fld DWORD PTR [eax+ebx+4]
fmul DWORD PTR [edx+ebx+4]
fxch st(2)
fadd
add ebx, 8
fadd
sub ecx, 2
jne Loop_DotProd2
}
}
float DotProd3(float *in1, float *in2, int len)
{
__asm
{
mov eax, DWORD PTR in1
xor ebx, ebx
fldz
mov edx, DWORD PTR in2
mov ecx, len
Loop_DotProd3:
fld DWORD PTR [eax+ebx]
fmul DWORD PTR [edx+ebx]
fld DWORD PTR [eax+ebx+4]
fmul DWORD PTR [edx+ebx+4]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+8]
fmul DWORD PTR [edx+ebx+8]
fxch st(2)
fadd
add ebx, 12
fadd
sub ecx, 3
jne Loop_DotProd3
}
}
float DotProd4(float *in1, float *in2, int len)
{
__asm
{
mov eax, DWORD PTR in1
xor ebx, ebx
fldz
mov edx, DWORD PTR in2
mov ecx, len
Loop_DotProd4:
fld DWORD PTR [eax+ebx]
fmul DWORD PTR [edx+ebx]
fld DWORD PTR [eax+ebx+4]
fmul DWORD PTR [edx+ebx+4]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+8]
fmul DWORD PTR [edx+ebx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+12]
fmul DWORD PTR [edx+ebx+12]
fxch st(2)
fadd
add ebx, 16
fadd
sub ecx, 4
jne Loop_DotProd4
}
}
float DotProd5(float *in1, float *in2, int len)
{
__asm
{
mov eax, DWORD PTR in1
xor ebx, ebx
fldz
mov edx, DWORD PTR in2
mov ecx, len
Loop_DotProd5:
fld DWORD PTR [eax+ebx]
fmul DWORD PTR [edx+ebx]
fld DWORD PTR [eax+ebx+4]
fmul DWORD PTR [edx+ebx+4]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+8]
fmul DWORD PTR [edx+ebx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+12]
fmul DWORD PTR [edx+ebx+12]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+16]
fmul DWORD PTR [edx+ebx+16]
fxch st(2)
fadd
add ebx, 20
fadd
sub ecx, 5
jne Loop_DotProd5
}
}
float DotProd10(float *in1, float *in2, int len)
{
__asm
{
mov eax, DWORD PTR in1
xor ebx, ebx
fldz
mov edx, DWORD PTR in2
mov ecx, len
Loop_DotProd10:
fld DWORD PTR [eax+ebx]
fmul DWORD PTR [edx+ebx]
fld DWORD PTR [eax+ebx+4]
fmul DWORD PTR [edx+ebx+4]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+8]
fmul DWORD PTR [edx+ebx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+12]
fmul DWORD PTR [edx+ebx+12]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+16]
fmul DWORD PTR [edx+ebx+16]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+20]
fmul DWORD PTR [edx+ebx+20]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+24]
fmul DWORD PTR [edx+ebx+24]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+28]
fmul DWORD PTR [edx+ebx+28]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+32]
fmul DWORD PTR [edx+ebx+32]
fxch st(2)
fadd
fld DWORD PTR [eax+ebx+36]
fmul DWORD PTR [edx+ebx+36]
fxch st(2)
fadd
add ebx, 40
fadd
sub ecx, 10
jne Loop_DotProd10
}
}
float DotProd3s(float *in1, float *in2)
{
__asm
{
mov eax, DWORD PTR in1
mov edx, DWORD PTR in2
;// fldz
fld DWORD PTR [eax]
fmul DWORD PTR [edx]
fld DWORD PTR [eax+4]
fmul DWORD PTR [edx+4]
;// fxch st(2)
;// fadd
fld DWORD PTR [eax+8]
fmul DWORD PTR [edx+8]
fxch st(2)
fadd
fadd
}
}
float DotProd4s(float *in1, float *in2)
{
__asm
{
mov eax, DWORD PTR in1
mov edx, DWORD PTR in2
;// fldz
fld DWORD PTR [eax]
fmul DWORD PTR [edx]
fld DWORD PTR [eax+4]
fmul DWORD PTR [edx+4]
;// fxch st(2)
;// fadd
fld DWORD PTR [eax+8]
fmul DWORD PTR [edx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+12]
fmul DWORD PTR [edx+12]
fxch st(2)
fadd
fadd
}
}
float DotProd5s(float *in1, float *in2)
{
__asm
{
mov eax, DWORD PTR in1
mov edx, DWORD PTR in2
;// fldz
fld DWORD PTR [eax]
fmul DWORD PTR [edx]
fld DWORD PTR [eax+4]
fmul DWORD PTR [edx+4]
;// fxch st(2)
;// fadd
fld DWORD PTR [eax+8]
fmul DWORD PTR [edx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+12]
fmul DWORD PTR [edx+12]
fxch st(2)
fadd
fld DWORD PTR [eax+16]
fmul DWORD PTR [edx+16]
fxch st(2)
fadd
fadd
}
}
float DotProd10s(float *in1, float *in2)
{
__asm
{
mov eax, DWORD PTR in1
mov edx, DWORD PTR in2
;// fldz
fld DWORD PTR [eax]
fmul DWORD PTR [edx]
fld DWORD PTR [eax+4]
fmul DWORD PTR [edx+4]
;// fxch st(2)
;// fadd
fld DWORD PTR [eax+8]
fmul DWORD PTR [edx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+12]
fmul DWORD PTR [edx+12]
fxch st(2)
fadd
fld DWORD PTR [eax+16]
fmul DWORD PTR [edx+16]
fxch st(2)
fadd
fld DWORD PTR [eax+20]
fmul DWORD PTR [edx+20]
fxch st(2)
fadd
fld DWORD PTR [eax+24]
fmul DWORD PTR [edx+24]
fxch st(2)
fadd
fld DWORD PTR [eax+28]
fmul DWORD PTR [edx+28]
fxch st(2)
fadd
fld DWORD PTR [eax+32]
fmul DWORD PTR [edx+32]
fxch st(2)
fadd
fld DWORD PTR [eax+36]
fmul DWORD PTR [edx+36]
fxch st(2)
fadd
fadd
}
}
float DotProd20s(float *in1, float *in2)
{
__asm
{
mov eax, DWORD PTR in1
mov edx, DWORD PTR in2
;// fldz
fld DWORD PTR [eax]
fmul DWORD PTR [edx]
fld DWORD PTR [eax+4]
fmul DWORD PTR [edx+4]
;// fxch st(2)
;// fadd
fld DWORD PTR [eax+8]
fmul DWORD PTR [edx+8]
fxch st(2)
fadd
fld DWORD PTR [eax+12]
fmul DWORD PTR [edx+12]
fxch st(2)
fadd
fld DWORD PTR [eax+16]
fmul DWORD PTR [edx+16]
fxch st(2)
fadd
fld DWORD PTR [eax+20]
fmul DWORD PTR [edx+20]
fxch st(2)
fadd
fld DWORD PTR [eax+24]
fmul DWORD PTR [edx+24]
fxch st(2)
fadd
fld DWORD PTR [eax+28]
fmul DWORD PTR [edx+28]
fxch st(2)
fadd
fld DWORD PTR [eax+32]
fmul DWORD PTR [edx+32]
fxch st(2)
fadd
fld DWORD PTR [eax+36]
fmul DWORD PTR [edx+36]
fxch st(2)
fadd
fld DWORD PTR [eax+40]
fmul DWORD PTR [edx+40]
fxch st(2)
fadd
fld DWORD PTR [eax+44]
fmul DWORD PTR [edx+44]
fxch st(2)
fadd
fld DWORD PTR [eax+48]
fmul DWORD PTR [edx+48]
fxch st(2)
fadd
fld DWORD PTR [eax+52]
fmul DWORD PTR [edx+52]
fxch st(2)
fadd
fld DWORD PTR [eax+56]
fmul DWORD PTR [edx+56]
fxch st(2)
fadd
fld DWORD PTR [eax+60]
fmul DWORD PTR [edx+60]
fxch st(2)
fadd
fld DWORD PTR [eax+64]
fmul DWORD PTR [edx+64]
fxch st(2)
fadd
fld DWORD PTR [eax+68]
fmul DWORD PTR [edx+68]
fxch st(2)
fadd
fld DWORD PTR [eax+72]
fmul DWORD PTR [edx+72]
fxch st(2)
fadd
fld DWORD PTR [eax+76]
fmul DWORD PTR [edx+76]
fxch st(2)
fadd
fadd
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -