q_plsf_5.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 476 行 · 第 1/2 页

C
476
字号
/***********************************************************************************      GSM AMR-NB speech codec   R98   Version 7.6.0   December 12, 2001*                                R99   Version 3.3.0                *                                REL-4 Version 4.1.0                ***********************************************************************************      File             : q_plsf_5.c*      Purpose          : Quantization of 2 sets of LSF parameters using 1st *                         order MA prediction and split by 5 matrix*                         quantization (split-MQ)**********************************************************************************/  /**********************************************************************************                         MODULE INCLUDE FILE AND VERSION ID*********************************************************************************/#include "q_plsf.h"const char q_plsf_5_id[] = "@(#)$Id $" q_plsf_h; /**********************************************************************************                         INCLUDE FILES*********************************************************************************/#include <uclib.h>#include <uclib.h>#include "typedef.h"#include "basic_op.h"#include "count.h"#include "lsp_lsf.h"#include "reorder.h"#include "lsfwt.h"#ifdef JZ4740_MXU_OPT#include "jzmedia.h"#endif/**********************************************************************************                         LOCAL VARIABLES AND TABLES*********************************************************************************/#include "q_plsf_5.tab"         /* Codebooks of LSF prediction residual */ /**********************************************************************************                         LOCAL PROGRAM CODE*********************************************************************************//* Quantization of a 4 dimensional subvector */static Word16 Vq_subvec (/* o : quantization index,            Q0  */    Word16 *lsf_r1,      /* i : 1st LSF residual vector,       Q15 */    Word16 *lsf_r2,      /* i : 2nd LSF residual vector,       Q15 */    const Word16 *dico,  /* i : quantization codebook,         Q15 */    Word16 *wf1,         /* i : 1st LSF weighting factors      Q13 */    Word16 *wf2,         /* i : 2nd LSF weighting factors      Q13 */      Word16 dico_size     /* i : size of quantization codebook, Q0  */){    Word16 index = 0; /* initialization only needed to keep gcc silent */    Word16 i, temp;    const Word16 *p_dico;    Word32 dist_min, dist;    dist_min = MAX_32;                                  move32 (); #ifdef JZ4740_MXU_OPT    p_dico = dico - 2;//                                      move16 ();     S32LDD(xr14, lsf_r1, 0x00);    S32LDD(xr13, lsf_r2, 0x00);    S32LDD(xr12, wf1   , 0x00);    S32LDD(xr11, wf2   , 0x00);    for (i = 0; i < dico_size; i++)    {        S32LDI(xr1, p_dico, 0x04);         Q16ADD_SS_WW(xr2, xr14,xr1,xr0);  //xr2 = lsf_r1[0] - p_dico[i]                                          //      lsf_r1[1] - p_dico[i+1]        D16MUL_WW(xr3, xr12,xr2,xr4);     //xr3 = wf1[1]*(lsf_r1[1]-p_dico[i+1])                                          //xr4 = wf1[0]*(lsf_r1[0]-p_dico[i])        D32SAR(xr1,xr3,xr4,xr2,15);        S32SFL(xr0, xr1,xr2,xr3,3);       //xr1 = wf1[1]*(lsf_r1[1]-p_dico[i+1])                                          //    = wf1[0]*(lsf_r1[0]-p_dico[i])        D16MUL_WW(xr5,xr3,xr3,xr6);       //xr5 = wf1[1]*(lsf_r1[1]-p_dico[i+1]) ^2                                          //xr6 = wf1[0]*(lsf_r1[0]-p_dico[i])^2        S32LDI(xr1, p_dico, 0x04);         Q16ADD_SS_WW(xr2, xr13,xr1,xr0);  //xr2 = lsf_r2[0] - p_dico[i]                                          //      lsf_r2[1] - p_dico[i+1]        D16MUL_WW(xr3, xr11,xr2,xr4);     //xr3 = wf2[1]*(lsf_r2[1]-p_dico[i+1])                                          //xr4 = wf2[0]*(lsf_r2[0]-p_dico[i])        D32SAR(xr1,xr3,xr4,xr2,15);        S32SFL(xr0, xr1,xr2,xr3,3);       //xr1 = wf2[1]*(lsf_r2[1]-p_dico[i+1])                                          //    = wf2[0]*(lsf_r2[0]-p_dico[i])        D16MAC_AA_WW(xr5,xr3,xr3,xr6);       //xr5 = wf2[1]*(lsf_r2[1]-p_dico[i+1]) ^2                                          //xr6 = wf2[0]*(lsf_r2[0]-p_dico[i])^2        D32SLL(xr1,xr5,xr6,xr2,1);        D32ADD_AA(xr3,xr1,xr2,xr0);        dist = S32M2I(xr3);         //test ();         if (L_sub (dist, dist_min) < (Word32) 0)        {            dist_min = dist;                            //move32 ();             index = i;                                  //move16 ();         }    }    /* Reading the selected vector */    p_dico = &dico[shl (index, 2)];                     //move16 ();     lsf_r1[0] = *p_dico++;                              //move16 ();     lsf_r1[1] = *p_dico++;                              //move16 ();     lsf_r2[0] = *p_dico++;                              //move16 ();     lsf_r2[1] = *p_dico++;                              //move16 (); #else    p_dico = dico;                                      move16 ();     for (i = 0; i < dico_size; i++)    {        temp = sub (lsf_r1[0], *p_dico++);        temp = mult (wf1[0], temp);        dist = L_mult (temp, temp);        temp = sub (lsf_r1[1], *p_dico++);        temp = mult (wf1[1], temp);        dist = L_mac (dist, temp, temp);        temp = sub (lsf_r2[0], *p_dico++);        temp = mult (wf2[0], temp);        dist = L_mac (dist, temp, temp);        temp = sub (lsf_r2[1], *p_dico++);        temp = mult (wf2[1], temp);        dist = L_mac (dist, temp, temp);        test ();         if (L_sub (dist, dist_min) < (Word32) 0)        {            dist_min = dist;                            move32 ();             index = i;                                  move16 ();         }    }    /* Reading the selected vector */    p_dico = &dico[shl (index, 2)];                     move16 ();     lsf_r1[0] = *p_dico++;                              move16 ();     lsf_r1[1] = *p_dico++;                              move16 ();     lsf_r2[0] = *p_dico++;                              move16 ();     lsf_r2[1] = *p_dico++;                              move16 (); #endif    return index;}/* Quantization of a 4 dimensional subvector with a signed codebook */static Word16 Vq_subvec_s ( /* o : quantization index            Q0  */    Word16 *lsf_r1,         /* i : 1st LSF residual vector       Q15 */    Word16 *lsf_r2,         /* i : and LSF residual vector       Q15 */    const Word16 *dico,     /* i : quantization codebook         Q15 */    Word16 *wf1,            /* i : 1st LSF weighting factors     Q13 */    Word16 *wf2,            /* i : 2nd LSF weighting factors     Q13 */    Word16 dico_size)       /* i : size of quantization codebook Q0  */  {    Word16 index = 0;  /* initialization only needed to keep gcc silent */    Word16 sign = 0;   /* initialization only needed to keep gcc silent */    Word16 i, temp;    const Word16 *p_dico;    Word32 dist_min, dist;    dist_min = MAX_32;                                  //move32 (); #ifdef JZ4740_MXU_OPT    p_dico = dico - 2;                                      //move16 ();     S32LDD(xr14, lsf_r1, 0x00);    S32LDD(xr13, lsf_r2, 0x00);    S32LDD(xr12, wf1   , 0x00);    S32LDD(xr11, wf2   , 0x00);    for (i = 0; i < dico_size; i++)    {        /* test positive */        S32LDI(xr1, p_dico, 0x04);         Q16ADD_SS_WW(xr2, xr14,xr1,xr0);  //xr2 = lsf_r1[0] - p_dico[i]                                          //      lsf_r1[1] - p_dico[i+1]        D16MUL_WW(xr3, xr12,xr2,xr4);     //xr3 = wf1[1]*(lsf_r1[1]-p_dico[i+1])                                          //xr4 = wf1[0]*(lsf_r1[0]-p_dico[i])        D32SAR(xr1,xr3,xr4,xr2,15);        S32SFL(xr0, xr1,xr2,xr3,3);       //xr1 = wf1[1]*(lsf_r1[1]-p_dico[i+1])                                          //    = wf1[0]*(lsf_r1[0]-p_dico[i])        D16MUL_WW(xr5,xr3,xr3,xr6);       //xr5 = wf1[1]*(lsf_r1[1]-p_dico[i+1]) ^2                                          //xr6 = wf1[0]*(lsf_r1[0]-p_dico[i])^2        S32LDI(xr1, p_dico, 0x04);         Q16ADD_SS_WW(xr2, xr13,xr1,xr0);  //xr2 = lsf_r2[0] - p_dico[i]                                          //      lsf_r2[1] - p_dico[i+1]        D16MUL_WW(xr3, xr11,xr2,xr4);     //xr3 = wf2[1]*(lsf_r2[1]-p_dico[i+1])                                          //xr4 = wf2[0]*(lsf_r2[0]-p_dico[i])        D32SAR(xr1,xr3,xr4,xr2,15);        S32SFL(xr0, xr1,xr2,xr3,3);       //xr1 = wf2[1]*(lsf_r2[1]-p_dico[i+1])                                          //    = wf2[0]*(lsf_r2[0]-p_dico[i])        D16MAC_AA_WW(xr5,xr3,xr3,xr6);       //xr5 = wf2[1]*(lsf_r2[1]-p_dico[i+1]) ^2                                          //xr6 = wf2[0]*(lsf_r2[0]-p_dico[i])^2        D32SLL(xr1,xr5,xr6,xr2,1);        D32ADD_AA(xr3,xr1,xr2,xr0);        dist = S32M2I(xr3);         test ();         if (L_sub (dist, dist_min) < (Word32) 0)        {            dist_min = dist;                            move32 ();             index = i;                                  move16 ();             sign = 0;                                   move16 ();         }        /* test negative */        p_dico -= 4;                                    move16 ();         S32LDI(xr1, p_dico, 0x04);         Q16ADD_AA_WW(xr2, xr14,xr1,xr0);  //xr2 = lsf_r1[0] - p_dico[i]                                          //      lsf_r1[1] - p_dico[i+1]        D16MUL_WW(xr3, xr12,xr2,xr4);     //xr3 = wf1[1]*(lsf_r1[1]-p_dico[i+1])                                          //xr4 = wf1[0]*(lsf_r1[0]-p_dico[i])        D32SAR(xr1,xr3,xr4,xr2,15);        S32SFL(xr0, xr1,xr2,xr3,3);       //xr1 = wf1[1]*(lsf_r1[1]-p_dico[i+1])                                          //    = wf1[0]*(lsf_r1[0]-p_dico[i])        D16MUL_WW(xr5,xr3,xr3,xr6);       //xr5 = wf1[1]*(lsf_r1[1]-p_dico[i+1]) ^2

⌨️ 快捷键说明

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