00001 #include <math.h>
00002
00003 #include "xalloc.h"
00004 #include "uti.h"
00005 #include "spl.h"
00006 #include "lpcint.hpp"
00007
00008
00009
00010 LPCInt::LPCInt( INT ord, INT meth, DOUBLE te ) :
00011 VecInt(ord,(meth!=LPCINT_CONST)?TRUE:FALSE,te)
00012 {
00013 INT tmplen=0, t;
00014 INT i;
00015
00016 method=meth;
00017
00018 vtmp=vwrk2=NULL;
00019
00020 switch (method) {
00021 case LPCINT_CONST:
00022 tmplen=0;
00023 break;
00024 case LPCINT_LIN_KI:
00025 tmplen=tnel_lp_k2a(ord);
00026 t=tnel_lp_a2k(ord);
00027 if (tmplen<t) tmplen=t;
00028 break;
00029 case LPCINT_LIN_LSF:
00030
00031 for (i=0; i<ord; i++) v2[i]=linterpol(i,0,ord,0.1,M_PI-0.1);
00032 tmplen=tnel_lp_a2lx(ord);
00033 t=tnel_lp_lx2a(ord);
00034 if (tmplen<t) tmplen=t;
00035 break;
00036 default:
00037 die_beep("LPCInt: invalid LPC interpolation method (%d)",method);
00038 }
00039
00040 if (tmplen) {
00041 vtmp = (DOUBLE*)xmalloc(sizeof(DOUBLE)*tmplen);
00042 vwrk2 = (DOUBLE*)xmalloc(sizeof(DOUBLE)*ord);
00043 }
00044 }
00045
00046
00047
00048 LPCInt::~LPCInt()
00049 {
00050 #define FREE(v) if (v) xfree(v)
00051 FREE(vtmp);
00052 FREE(vwrk2);
00053 }
00054
00055
00056
00057 VOID LPCInt::set( DOUBLE *vai, DOUBLE te )
00058 {
00059 switch (method) {
00060 case LPCINT_CONST:
00061 VecInt::set(vai,te);
00062 break;
00063 case LPCINT_LIN_KI:
00064 lp_a2k(vai,vwrk2,len,vtmp);
00065 VecInt::set(vwrk2,te);
00066 break;
00067 case LPCINT_LIN_LSF:
00068 if (lp_a2lx(vai,vwrk2,len,vtmp)) {
00069 lp_lx2lw(vwrk2,vwrk2,len);
00070 VecInt::set(vwrk2,te);
00071 }
00072 else VecInt::set(v2,te);
00073 break;
00074 default:
00075 die_beep("LPCInt: invalid LPC interpolation method (%d)",method);
00076 }
00077 }
00078
00079
00080
00081 DOUBLE *LPCInt::get( DOUBLE pos )
00082 {
00083 DOUBLE *v;
00084 switch (method) {
00085 case LPCINT_CONST:
00086 return VecInt::get(pos);
00087 case LPCINT_LIN_KI:
00088 v=VecInt::get(pos);
00089 lp_k2a(v,vwrk2,len,vtmp);
00090 return vwrk2;
00091 case LPCINT_LIN_LSF:
00092 v=VecInt::get(pos);
00093 lp_lw2lx(v,v,len);
00094 lp_lx2a(v,vwrk2,len,vtmp);
00095 return vwrk2;
00096 default:
00097 die_beep("LPCInt: invalid LPC interpolation method (%d)",method);
00098 }
00099 show_srcpos();
00100 die_beep("LPCInt: should never arrive here!");
00101 return NULL;
00102 }
00103
00104
00105