📄 lsftopc.c
字号:
/*LINTLIBRARY*/ /*PROTOLIB1*/#include <math.h>#include <stdio.h>#include "main.h"#include "lsftopc.h"/*************************************************************************** NAME* LSFtoPC ** FUNCTION** convert line spectral frequencies to predictor coefficients** SYNOPSIS** LSFtoPC(f, pc, frame_num)* * formal* data I/O* name type type function* -------------------------------------------------------------------* f real i lsp frequencies* pc real o LPC predictor coefficients* frame_num int i Frame number******************************************************************************* DESCRIPTION** LSFtoPC converts line spectral frequencies to predictor * coefficients. ** The analysis filter may be reconstructed:** A(z) = 1/2 [ P(z) + Q(z) ]** CELP's LPC predictor coefficient convention is:* p+1 -(i-1)* A(z) = SUM a z where a = +1.0* i=1 i 1****************************************************************************/void LSFtoPC(float lsf[ORDER],float pc[ORDER+1],int frame_num){int i, j;float pi, xf, xx;int half_order;float a[ORDER/2 +1], a1[ORDER/2 +1], a2[ORDER/2 +1];float b[ORDER/2 +1], b1[ORDER/2 +1], b2[ORDER/2 +1];float p[ORDER/2], q[ORDER/2];float freq[ORDER];/* Check input for ill-conditioned cases */ if( (lsf[0] <= 0.0) || (lsf[0] >= 0.5) ) { printf("LSFtoPC: LSFs out of bounds; lsf[0] = %1.4f at frame %d\n", lsf[0], frame_num); } for(i=1; i<ORDER; i++) { if(lsf[i] <= lsf[i-1]) printf("LSFtoPC: nonmonotonic LSFs at frame %d\n", frame_num); if( (lsf[i] <= 0.0) || (lsf[i] >= 0.5) ) printf("LSFtoPC: LSFs out of bounds; lsf[%d] = %1.4f at frame %d\n", i, lsf[i], frame_num); }/* Initialization *//* pi = 4*atan(1.0);*/ pi = 3.1415926535897931032; for(i=0;i<ORDER;i++) freq[i] = lsf[i]; half_order = ORDER/2; for(i=0;i<=half_order;i++) { a[i] = 0.0; a1[i] = 0.0; a2[i] = 0.0; b[i] = 0.0; b1[i] = 0.0; b2[i] = 0.0; }/* LSF filter parameters */ for(i=0;i<half_order;i++) {/* p[i] = -2.0 * (float)cos( 2.0 * pi * (double)freq[2*i] ); q[i] = -2.0 * (float)cos( 2.0 * pi * (double)freq[2*i+1] );*/ p[i] = -2. * cos(2. * pi * freq[2 * i]); q[i] = -2. * cos(2. * pi * freq[2 * i + 1]); }/* Impulse response of analysis filter */ xf = 0.0; for(i=0;i<=ORDER;i++) { xx = 0.0; if (i == 0) xx = 1.0; a[0] = xx + xf; b[0] = xx - xf; xf = xx; for(j=0;j<half_order;j++) { a[j+1] = a[j] + p[j] * a1[j] + a2[j]; b[j+1] = b[j] + q[j] * b1[j] + b2[j]; a2[j] = a1[j]; a1[j] = a[j]; b2[j] = b1[j]; b1[j] = b[j]; } if(i > 0) pc[i-1] = -0.5 * (a[half_order] + b[half_order]); } /* Convert to CELPs PC array configuration */ for(i=9;i>=0;i--) pc[i+1] = -pc[i]; pc[0] = 1.0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -