00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1994 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ SPL5d.C 00007 Nombre paquete............... SPL 00008 Lenguaje fuente.............. C (Borland C/C++ 3.1) 00009 Estado....................... Completado 00010 Dependencia Hard/OS.......... - 00011 Codigo condicional........... NDEBUG, LP_NEGSUM 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Proposito de la edicion 00016 ------- -------- -------- ----------------------- 00017 1.1.2 16/05/96 Borja bugs en documentacion 00018 1.1.1 30/07/95 Borja scope funciones explicito 00019 1.1.0 08/12/94 Borja revision general (tipos,idx,nel,tnel...) 00020 1.0.1 07/12/93 Borja soporte LP_NEGSUM_NEG() y LP_POSSUM_NEG() 00021 1.0.0 06/07/93 Borja Codificacion inicial. 00022 00023 ======================== Contenido ======================== 00024 Algoritmos de prediccion lineal (LP). Ver SPL5A.C para mas detalles. 00025 00026 Definir NDEBUG para desconectar la validacion de parametros 00027 con assert(). No definir este simbolo mientras se depuren 00028 aplicaciones, ya que aunque las funciones son algo mas lentas, 00029 el chequeo de validacion de parametros resuelve muchos problemas. 00030 =========================================================== 00031 */ 00032 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00033 /**********************************************************/ 00034 00035 #include "spli.h" 00036 00037 /**********************************************************/ 00038 /* Metodo de las covarianzas. {mcv} es la pseudo matriz de covarianzas 00039 de orden {p}. Efectua el analisis predictivo de orden {p} y devuelve 00040 los coeficientes LPC en el vector {vai}. 00041 Esta funcion NO {devuelve} la potencia del error (???_ne). 00042 {vtmp} es de tnel_lpa_cov_chl_a(p) elementos. {p}>0 */ 00043 00044 PUBLIC SPL_VOID XAPI lpa_cov_chl_a_ne( SPL_pFLOAT mcv, SPL_pFLOAT vai, 00045 SPL_INT p, SPL_pFLOAT vtmp ) 00046 { 00047 #ifndef LP_NEGSUM 00048 SPL_INT j; 00049 #endif 00050 assert(p>0); 00051 00052 matrix_sim2tri_dgn(mcv+p+1,vtmp+p,vtmp,p); 00053 ecsys_tri_dgn(vtmp+p,vtmp,mcv+1,p,vai); 00054 00055 #ifndef LP_NEGSUM 00056 for (j=0; j<p; j++) 00057 vai[j]=-vai[j]; 00058 #endif 00059 } 00060 00061 /**********************************************************/ 00062 /* Metodo de las covarianzas por cholesky. 00063 {mcv} es la pseudo matriz de covarianzas de orden {p}. 00064 Los coeficientes LPC de orden {p} se devuelven en el vector {vai}. 00065 La funcion {devuelve} la potencia del error. 00066 {vtmp} es de tnel_lpa_cov_chl_a(p) elementos. {p}>0 */ 00067 00068 PUBLIC SPL_FLOAT XAPI lpa_cov_chl_a( SPL_pFLOAT mcv, SPL_pFLOAT vai, 00069 SPL_INT p, SPL_pFLOAT vtmp ) 00070 { 00071 SPL_FLOAT sum; 00072 SPL_INT j; 00073 assert(p>0); 00074 00075 matrix_sim2tri_dgn(mcv+p+1,vtmp+p,vtmp,p); 00076 ecsys_tri_dgn(vtmp+p,vtmp,mcv+1,p,vai); 00077 00078 sum=mcv[0]; 00079 for (j=0; j<p; j++) { 00080 sum-=vai[j]*mcv[j+1]; 00081 #ifndef LP_NEGSUM 00082 vai[j]=-vai[j]; 00083 #endif 00084 } 00085 00086 return sum; 00087 } 00088 00089 /**********************************************************/ 00090 00091 PUBLIC SPL_INT XAPI tnel_lpa_cov_chl( SPL_INT p ) 00092 { 00093 assert(p>0); 00094 00095 return nel_matrix_tri(p-1)+nel_matrix_dgn(p); 00096 } 00097 00098 /**********************************************************/ 00099 /* Metodo de las covarianzas por choleski, estabilizado. 00100 {mcv} es la pseudo matriz de covarianzas de orden {p}. 00101 En el vector {vki} se devuelven los coeficientes de reflexion. 00102 La funcion {devuelve} la potencia del error. 00103 {vtmp} es de tnel_lpa_cov_sch_k(p) elementos. p>0 */ 00104 00105 PUBLIC SPL_FLOAT XAPI lpa_cov_sch_k( SPL_pFLOAT mcv, SPL_pFLOAT vki, 00106 SPL_INT p, SPL_pFLOAT vtmp ) 00107 { 00108 SPL_INT j; 00109 SPL_FLOAT sum, osum; 00110 assert(p>0); 00111 00112 matrix_sim2tri(mcv+p+1,vtmp,p); 00113 ecsys_tri(vtmp,mcv+1,p,vki); 00114 00115 sum=osum=mcv[0]; 00116 00117 for (j=0; j<p; j++) { 00118 sum-=vki[j]*vki[j]; 00119 vki[j] /= LP_POSSUM_NEG(sqrt(osum)); 00120 osum=sum; 00121 } 00122 00123 return sum; 00124 } 00125 00126 /**********************************************************/ 00127 00128 PUBLIC SPL_INT XAPI tnel_lpa_cov_sch_k( SPL_INT p ) 00129 { 00130 assert(p>0); 00131 00132 return nel_matrix_tri(p); 00133 } 00134 00135 /**********************************************************/ 00136