⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util2.cpp

📁 G711语音压缩源码
💻 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 + -