00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00030 #include "libavutil/mathematics.h"
00031
00039 #define QCELP_BANDWITH_EXPANSION_COEFF 0.9883
00040
00051 static void lsp2polyf(const float *lspf, double *f, int lp_half_order)
00052 {
00053 int i, j;
00054
00055 f[0] = 1.0;
00056 f[1] = -2 * cos(M_PI * lspf[0]);
00057 lspf -= 2;
00058 for(i=2; i<=lp_half_order; i++)
00059 {
00060 double val = -2 * cos(M_PI * lspf[2*i]);
00061 f[i] = val * f[i-1] + 2*f[i-2];
00062 for(j=i-1; j>1; j--)
00063 f[j] += f[j-1] * val + f[j-2];
00064 f[1] += val;
00065 }
00066 }
00067
00080 void ff_qcelp_lspf2lpc(const float *lspf, float *lpc)
00081 {
00082 double pa[6], qa[6];
00083 int i;
00084 double bandwith_expansion_coeff = QCELP_BANDWITH_EXPANSION_COEFF * 0.5;
00085
00086 lsp2polyf(lspf, pa, 5);
00087 lsp2polyf(lspf + 1, qa, 5);
00088
00089 for (i=4; i>=0; i--)
00090 {
00091 double paf = pa[i+1] + pa[i];
00092 double qaf = qa[i+1] - qa[i];
00093
00094 lpc[i ] = paf + qaf;
00095 lpc[9-i] = paf - qaf;
00096 }
00097 for (i=0; i<10; i++)
00098 {
00099 lpc[i] *= bandwith_expansion_coeff;
00100 bandwith_expansion_coeff *= QCELP_BANDWITH_EXPANSION_COEFF;
00101 }
00102 }