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 + -
显示快捷键?