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

📄 qsidlsf.c

📁 语音编码G.729 语音编码G.729
💻 C
字号:
/*   ITU-T G.729 Annex C+ - Reference C code for floating point                         implementation of G.729 Annex C+                         (integration of Annexes B, D and E)                          Version 2.1 of October 1999*//* File : QSIDLSF.C*/#include <stdio.h>#include <stdlib.h>#include <math.h>#include "typedef.h"#include "ld8a.h"#include "tab_ld8a.h"#include "sid.h"#include "vad.h"#include "dtx.h"#include "tab_dtx.h"/* local functions */static void qnt_e(    FLOAT *errlsf,    /* (i)  : error lsf vector             */    FLOAT *weight,    /* (i)  : weighting vector             */    int DIn,        /* (i)  : number of input candidates   */    FLOAT *qlsf,      /* (o)  : quantized error lsf vector   */    int *Pptr,      /* (o)  : predictor index              */    int DOut,       /* (i)  : number of quantized vectors  */    int *cluster,   /* (o)  : quantizer indices            */    int *MS         /* (i)  : size of the quantizers       */);static void new_ML_search_1(    FLOAT *d_data,    /* (i) : error vector             */    int J,          /* (i) : number of input vectors  */    FLOAT *new_d_data,/* (o) : output vector            */    int K,          /* (i) : number of candidates     */    int *best_indx, /* (o) : best indices             */    int *ptr_back,  /* (o) : pointer for backtracking */    const int *PtrTab,    /* (i) : quantizer table          */    int MQ          /* (i) : size of quantizer        */);static void new_ML_search_2(    FLOAT *d_data,    /* (i) : error vector             */    FLOAT *weight,    /* (i) : weighting vector         */    int J,          /* (i) : number of input vectors  */    FLOAT *new_d_data,/* (o) : output vector            */    int K,          /* (i) : number of candidates     */    int *best_indx, /* (o) : best indices             */    int *ptr_prd,   /* (i) : pointer for backtracking */    int *ptr_back,  /* (o) : pointer for backtracking */    const int PtrTab[2][16],/* (i) : quantizer table        */    int MQ          /* (i) : size of quantizer        */);/*-----------------------------------------------------------------* * Functions lsfq_noise                                            * *           ~~~~~~~~~~                                            * * Input:                                                          * *   lsp[]         : unquantized lsp vector                        * *   freq_prev[][] : memory of the lsf predictor                   * *                                                                 * * Output:                                                         * *                                                                 * *   lspq[]        : quantized lsp vector                          *  *   ana[]         : indices                                       * *                                                                 * *-----------------------------------------------------------------*/void lsfq_noise(struct lsfq_state_t * state,				FLOAT *lsp, FLOAT *lspq, FLOAT freq_prev[MA_NP][M], int *ana){    int i, MS[MODE]={32, 16}, Clust[MODE], mode;    FLOAT  lsf[M], lsfq[M], weight[M], tmpbuf[M], errlsf[M*MODE];        /* convert lsp to lsf */	lsp_lsf(lsp, lsf, M);        /* spacing to ~100Hz */    if (lsf[0] < L_LIMIT)        lsf[0] = L_LIMIT;    for (i=0 ; i < M-1 ; i++) {        if (lsf[i+1]- lsf[i] < 2*GAP3) lsf[i+1] = lsf[i]+ 2*GAP3;    }    if (lsf[M-1] > M_LIMIT)        lsf[M-1] = M_LIMIT;    if (lsf[M-1] < lsf[M-2])         lsf[M-2] = lsf[M-1]- GAP3;        /* get the lsf weighting */    get_wegt(lsf, weight);        /**********************/    /* quantize the lsf's */    /**********************/    /* get the prediction error vector */    for (mode=0; mode<MODE; mode++)        lsp_prev_extract(lsf, errlsf+mode*M, (const FLOAT (*)[M]) state->noise_fg[mode],		freq_prev, noise_fg_sum_inv[mode]);        /* quantize the lsf and get the corresponding indices */    qnt_e(errlsf, weight, MODE, tmpbuf, &mode, 1, Clust, MS);    ana[0] = (int) mode;    ana[1] = (int) Clust[0];    ana[2] = (int) Clust[1];        /* guarantee minimum distance of 0.0012 between tmpbuf[j]    and tmpbuf[j+1] */    lsp_expand_1_2(tmpbuf, (F)0.0012);        /* compute the quantized lsf vector */    lsp_prev_compose(tmpbuf, lsfq, (const FLOAT (*)[M]) state->noise_fg[mode],		freq_prev, noise_fg_sum[mode]);        /* update the prediction memory */    lsp_prev_update(tmpbuf, freq_prev);        /* lsf stability check */    lsp_stability(lsfq);        /* convert lsf to lsp */    lsf_lsp(lsfq, lspq, M);}static void qnt_e(    FLOAT *errlsf,    /* (i)  : error lsf vector             */    FLOAT *weight,    /* (i)  : weighting vector             */    int DIn,        /* (i)  : number of input candidates   */    FLOAT *qlsf,      /* (o)  : quantized error lsf vector   */    int *Pptr,      /* (o)  : predictor index              */    int DOut,       /* (i)  : number of quantized vectors  */    int *cluster,   /* (o)  : quantizer indices            */    int *MS         /* (i)  : size of the quantizers       */){    int best_indx[2][R_LSFQ];    int ptr_back[2][R_LSFQ], ptr, i;    FLOAT d_data[2][R_LSFQ*M];        new_ML_search_1(errlsf, DIn, d_data[0], 4, best_indx[0], ptr_back[0],        PtrTab_1, MS[0]);    new_ML_search_2(d_data[0], weight, 4, d_data[1], DOut, best_indx[1],         ptr_back[0], ptr_back[1], PtrTab_2, MS[1]);        /* backward path for the indices */    cluster[1] = best_indx[1][0];    ptr = ptr_back[1][0];    cluster[0] = best_indx[0][ptr];        /* this is the pointer to the best predictor */    *Pptr = ptr_back[0][ptr];        /* generating the quantized vector */    copy(lspcb1[PtrTab_1[cluster[0]]], qlsf, M);    for (i=0; i<M/2; i++)        qlsf[i] = qlsf[i]+ lspcb2[PtrTab_2[0][cluster[1]]][i];    for (i=M/2; i<M; i++)        qlsf[i] = qlsf[i]+ lspcb2[PtrTab_2[1][cluster[1]]][i];    }static void new_ML_search_1(    FLOAT *d_data,    /* (i) : error vector             */    int J,          /* (i) : number of input vectors  */    FLOAT *new_d_data,/* (o) : output vector            */    int K,          /* (i) : number of candidates     */    int *best_indx, /* (o) : best indices             */    int *ptr_back,  /* (o) : pointer for backtracking */    const int *PtrTab,    /* (i) : quantizer table          */    int MQ          /* (i) : size of quantizer        */){    int m, l, p, q, min_indx_p[R_LSFQ], min_indx_m[R_LSFQ];    FLOAT  sum[R_LSFQ*R_LSFQ], min[R_LSFQ];        for (q=0 ; q < K ; q++) {        min[q] = FLT_MAX_G729;    }        /* compute the errors */    for (p=0 ; p < J ; p++) {        for(m=0 ; m < MQ ; m++) {            sum[p*MQ+m] = (F)0.0;            for (l=0 ; l < M ; l++) {                sum[p*MQ+m] +=                    sqr(d_data[p*M+l]-lspcb1[PtrTab[m]][l]);            }            sum[p*MQ+m] *= Mp[p];        }    }        /* select the candidates */    for (q=0 ; q < K ; q++) {        for (p=0 ; p < J ; p++) {            for (m=0 ; m < MQ ; m++) {                if (sum[p*MQ+m] < min[q]) {                    min[q] = sum[p*MQ+m];                    min_indx_p[q] = p;                    min_indx_m[q] = m;                }            }        }        sum[min_indx_p[q]*MQ+min_indx_m[q]] = FLT_MAX_G729;    }        for (q=0 ; q < K ; q++) {        for (l=0 ; l < M ; l++) {            new_d_data[q*M+l] =                d_data[min_indx_p[q]*M+l]-lspcb1[PtrTab[min_indx_m[q]]][l];        }        ptr_back[q] = min_indx_p[q];        best_indx[q] = min_indx_m[q];    }}static void new_ML_search_2(    FLOAT *d_data,    /* (i) : error vector             */    FLOAT *weight,    /* (i) : weighting vector         */    int J,          /* (i) : number of input vectors  */    FLOAT *new_d_data,/* (o) : output vector            */    int K,          /* (i) : number of candidates     */    int *best_indx, /* (o) : best indices             */    int *ptr_prd,   /* (i) : pointer for backtracking */    int *ptr_back,  /* (o) : pointer for backtracking */    const int PtrTab[2][16],/* (i) : quantizer table        */    int MQ          /* (i) : size of quantizer        */){    int   m,l,p,q;    int   min_indx_p[R_LSFQ];    int   min_indx_m[R_LSFQ];    FLOAT   sum[R_LSFQ*R_LSFQ];    FLOAT   min[R_LSFQ];        for (q=0; q<K; q++)        min[q] = FLT_MAX_G729;        /* compute the errors */    for (p=0 ; p < J ; p++) {        for(m=0 ; m < MQ ; m++) {            sum[p*MQ+m] = (F)0.0;            for (l=0 ; l < M/2 ; l++) {                sum[p*MQ+m] +=                    weight[l]*sqr(noise_fg_sum[ptr_prd[p]][l])*sqr(d_data[p*M+l]-lspcb2[PtrTab[0][m]][l]);            }            for (l=M/2 ; l < M ; l++) {                sum[p*MQ+m] +=                    weight[l]*sqr(noise_fg_sum[ptr_prd[p]][l])*sqr(d_data[p*M+l]-lspcb2[PtrTab[1][m]][l]);            }        }    }        /* select the candidates */    for (q=0 ; q < K ; q++) {        for (p=0 ; p < J ; p++) {            for (m=0 ; m < MQ ; m++) {                if (sum[p*MQ+m] < min[q]) {                    min[q] = sum[p*MQ+m];                    min_indx_p[q] = p;                    min_indx_m[q] = m;                }            }        }        sum[min_indx_p[q]*MQ+min_indx_m[q]] = FLT_MAX_G729;    }        /* compute the candidates */    for (q=0 ; q < K ; q++) {        for (l=0 ; l < M/2 ; l++) {            new_d_data[q*M+l] =                d_data[min_indx_p[q]*M+l]-lspcb2[PtrTab[0][min_indx_m[q]]][l];        }        for (l=M/2 ; l < M ; l++) {            new_d_data[q*M+l] = d_data[min_indx_p[q]*M+l]-                lspcb2[PtrTab[1][min_indx_m[q]]][l];        }        ptr_back[q] = min_indx_p[q];        best_indx[q] = min_indx_m[q];    }}

⌨️ 快捷键说明

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