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

📄 pitch_a.c

📁 C源程序---G.729a语音代码G.729a语音代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*   ITU-T G.729A Speech Coder    ANSI-C Source Code   Version 1.1    Last modified: September 1996   Copyright (c) 1996,   AT&T, France Telecom, NTT, Universite de Sherbrooke   All rights reserved.*//*---------------------------------------------------------------------------* * Pitch related functions                                                   * * ~~~~~~~~~~~~~~~~~~~~~~~                                                   * *---------------------------------------------------------------------------*/#include "typedef.h"#include "basic_op.h"#include "oper_32b.h"#include "ld8a.h"#include "tab_ld8a.h"/*---------------------------------------------------------------------------* * Function  Pitch_ol_fast                                                   * * ~~~~~~~~~~~~~~~~~~~~~~~                                                   * * Compute the open loop pitch lag. (fast version)                           * *                                                                           * *---------------------------------------------------------------------------*/Word16 Pitch_ol_fast(  /* output: open loop pitch lag                        */   Word16 signal[],    /* input : signal used to compute the open loop pitch */                       /*     signal[-pit_max] to signal[-1] should be known */   Word16   pit_max,   /* input : maximum pitch lag                          */   Word16   L_frame    /* input : length of frame to compute pitch           */){  Word16  i, j;  Word16  max1, max2, max3;  Word16  max_h, max_l, ener_h, ener_l;  Word16  T1, T2, T3;  Word16  *p, *p1;  Word32  max, sum, L_temp;  /* Scaled signal */  Word16 scaled_signal[L_FRAME+PIT_MAX];  Word16 *scal_sig;  scal_sig = &scaled_signal[pit_max];  /*--------------------------------------------------------*   *  Verification for risk of overflow.                    *   *--------------------------------------------------------*/   Overflow = 0;   sum = 0;   for(i= -pit_max; i< L_frame; i+=2)     sum = L_mac(sum, signal[i], signal[i]);  /*--------------------------------------------------------*   * Scaling of input signal.                               *   *                                                        *   *   if Overflow        -> scal_sig[i] = signal[i]>>3     *   *   else if sum < 1^20 -> scal_sig[i] = signal[i]<<3     *   *   else               -> scal_sig[i] = signal[i]        *   *--------------------------------------------------------*/   if(Overflow == 1)   {     for(i=-pit_max; i<L_frame; i++)     {       scal_sig[i] = shr(signal[i], 3);     }   }   else {     L_temp = L_sub(sum, (Word32)1048576L);     if ( L_temp < (Word32)0 )  /* if (sum < 2^20) */     {        for(i=-pit_max; i<L_frame; i++)        {          scal_sig[i] = shl(signal[i], 3);        }     }     else     {       for(i=-pit_max; i<L_frame; i++)       {         scal_sig[i] = signal[i];       }     }   }   /*--------------------------------------------------------------------*    *  The pitch lag search is divided in three sections.                *    *  Each section cannot have a pitch multiple.                        *    *  We find a maximum for each section.                               *    *  We compare the maxima of each section by favoring small lag.      *    *                                                                    *    *  First section:  lag delay = 20 to 39                              *    *  Second section: lag delay = 40 to 79                              *    *  Third section:  lag delay = 80 to 143                             *    *--------------------------------------------------------------------*/    /* First section */    max = MIN_32;    T1  = 20;    /* Only to remove warning from some compilers */    for (i = 20; i < 40; i++) {        p  = scal_sig;        p1 = &scal_sig[-i];        sum = 0;        for (j=0; j<L_frame; j+=2, p+=2, p1+=2)            sum = L_mac(sum, *p, *p1);        L_temp = L_sub(sum, max);        if (L_temp > 0) { max = sum; T1 = i;   }    }    /* compute energy of maximum */    sum = 1;                   /* to avoid division by zero */    p = &scal_sig[-T1];    for(i=0; i<L_frame; i+=2, p+=2)        sum = L_mac(sum, *p, *p);    /* max1 = max/sqrt(energy)                  */    /* This result will always be on 16 bits !! */    sum = Inv_sqrt(sum);            /* 1/sqrt(energy),    result in Q30 */    L_Extract(max, &max_h, &max_l);    L_Extract(sum, &ener_h, &ener_l);    sum  = Mpy_32(max_h, max_l, ener_h, ener_l);    max1 = extract_l(sum);    /* Second section */    max = MIN_32;    T2  = 40;    /* Only to remove warning from some compilers */    for (i = 40; i < 80; i++) {        p  = scal_sig;        p1 = &scal_sig[-i];        sum = 0;        for (j=0; j<L_frame; j+=2, p+=2, p1+=2)            sum = L_mac(sum, *p, *p1);        L_temp = L_sub(sum, max);        if (L_temp > 0) { max = sum; T2 = i;   }    }    /* compute energy of maximum */    sum = 1;                   /* to avoid division by zero */    p = &scal_sig[-T2];    for(i=0; i<L_frame; i+=2, p+=2)        sum = L_mac(sum, *p, *p);    /* max2 = max/sqrt(energy)                  */    /* This result will always be on 16 bits !! */    sum = Inv_sqrt(sum);            /* 1/sqrt(energy),    result in Q30 */    L_Extract(max, &max_h, &max_l);    L_Extract(sum, &ener_h, &ener_l);    sum  = Mpy_32(max_h, max_l, ener_h, ener_l);    max2 = extract_l(sum);    /* Third section */    max = MIN_32;    T3  = 80;    /* Only to remove warning from some compilers */    for (i = 80; i < 143; i+=2) {        p  = scal_sig;        p1 = &scal_sig[-i];        sum = 0;        for (j=0; j<L_frame; j+=2, p+=2, p1+=2)            sum = L_mac(sum, *p, *p1);        L_temp = L_sub(sum, max);        if (L_temp > 0) { max = sum; T3 = i;   }    }     /* Test around max3 */     i = T3;     p  = scal_sig;     p1 = &scal_sig[-(i+1)];     sum = 0;     for (j=0; j<L_frame; j+=2, p+=2, p1+=2)         sum = L_mac(sum, *p, *p1);     L_temp = L_sub(sum, max);     if (L_temp > 0) { max = sum; T3 = i+(Word16)1;   }     p  = scal_sig;     p1 = &scal_sig[-(i-1)];     sum = 0;     for (j=0; j<L_frame; j+=2, p+=2, p1+=2)         sum = L_mac(sum, *p, *p1);     L_temp = L_sub(sum, max);     if (L_temp > 0) { max = sum; T3 = i-(Word16)1;   }    /* compute energy of maximum */    sum = 1;                   /* to avoid division by zero */    p = &scal_sig[-T3];    for(i=0; i<L_frame; i+=2, p+=2)        sum = L_mac(sum, *p, *p);    /* max1 = max/sqrt(energy)                  */    /* This result will always be on 16 bits !! */    sum = Inv_sqrt(sum);            /* 1/sqrt(energy),    result in Q30 */    L_Extract(max, &max_h, &max_l);    L_Extract(sum, &ener_h, &ener_l);    sum  = Mpy_32(max_h, max_l, ener_h, ener_l);    max3 = extract_l(sum);   /*-----------------------*    * Test for multiple.    *    *-----------------------*/    /* if( abs(T2*2 - T3) < 5)  */    /*    max2 += max3 * 0.25;  */    i = sub(shl(T2,1), T3);    j = sub(abs_s(i), 5);    if(j < 0)      max2 = add(max2, shr(max3, 2));    /* if( abs(T2*3 - T3) < 7)  */    /*    max2 += max3 * 0.25;  */    i = add(i, T2);    j = sub(abs_s(i), 7);    if(j < 0)      max2 = add(max2, shr(max3, 2));    /* if( abs(T1*2 - T2) < 5)  */    /*    max1 += max2 * 0.20;  */    i = sub(shl(T1,1), T2);    j = sub(abs_s(i), 5);    if(j < 0)      max1 = add(max1, mult(max2, 6554));    /* if( abs(T1*3 - T2) < 7)  */    /*    max1 += max2 * 0.20;  */    i = add(i, T1);    j = sub(abs_s(i), 7);    if(j < 0)      max1 = add(max1, mult(max2, 6554));   /*--------------------------------------------------------------------*    * Compare the 3 sections maxima.                                     *    *--------------------------------------------------------------------*/    if( sub(max1, max2) < 0 ) {max1 = max2; T1 = T2;  }    if( sub(max1, max3) <0 )  {T1 = T3; }    return T1;}/*--------------------------------------------------------------------------* *  Function  Dot_Product()                                                 * *  ~~~~~~~~~~~~~~~~~~~~~~                                                  * *--------------------------------------------------------------------------*/Word32 Dot_Product(      /* (o)   :Result of scalar product. */       Word16   x[],     /* (i)   :First vector.             */       Word16   y[],     /* (i)   :Second vector.            */       Word16   lg       /* (i)   :Number of point.          */){  Word16 i;  Word32 sum;  sum = 0;  for(i=0; i<lg; i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -