00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1994 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ SPL3.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 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Proposito de la edicion 00016 ------- -------- -------- ----------------------- 00017 1.1.1 30/07/95 Borja scope funciones explicito 00018 1.1.0 08/12/94 Borja revision general (tipos,idx,nel,tnel...) 00019 1.0.0 06/07/93 Borja Codificacion inicial. 00020 00021 ======================== Contenido ======================== 00022 Cruces por cero, filtrado de primer orden (preenfasis y 00023 deenfasis). 00024 Mas abajo se comenta el formato de las funciones de deenfasis 00025 y preenfasis. 00026 00027 Definir NDEBUG para desconectar la validacion de parametros 00028 con assert(). No definir este simbolo mientras se depuren 00029 aplicaciones, ya que aunque las funciones son algo mas lentas, 00030 el chequeo de validacion de parametros resuelve muchos problemas. 00031 =========================================================== 00032 */ 00033 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00034 /**********************************************************/ 00035 00036 #include "spli.h" 00037 00038 /**********************************************************/ 00039 /* Calcula los cruces por cero del vector {v} de {N} elementos. 00040 00041 Parametros: 00042 00043 - SPL_pFLOAT {v} : vector de longitud {N} del que se quieren calcular los cc. 00044 - SPL_INT {N} : longitud del vector {v}. {N}>=0 00045 00046 La funcion {devuelve} el numero de cruces por cero encontrados. 00047 Los puntos 'tangentes' en cero no se tienen en cuenta. */ 00048 00049 PUBLIC SPL_INT XAPI zero_cross( SPL_pFLOAT v, SPL_INT N ) 00050 { 00051 #define __getsign(n,os) (((n)>0)? 1 : (((n)<0)? -1 : (os))) 00052 SPL_INT i, cc; 00053 SPL_INT os; /* signo viejo */ 00054 SPL_INT ns; /* signo nuevo */ 00055 assert(N>=0); 00056 00057 cc = 0; 00058 os = __getsign(*v,1); 00059 for (i=1; i<N; i++) { 00060 v++; 00061 ns = __getsign(*v,os); 00062 if (ns!=os) 00063 cc++; 00064 os=ns; 00065 } 00066 00067 return cc; 00068 #undef __getsign 00069 } 00070 00071 /**********************************************************/ 00072 /* Funciones de filtrado de preenfasis y deenfasis. 00073 00074 Las funciones ????_i procesan un valor. Reciben 00075 la entrada y la memoria del filtro, y devuelve la salida del 00076 filtro. 00077 00078 Parametros: 00079 00080 - SPL_FLOAT {a} : constante de preenfasis/deenfasis. Comprendida 00081 . entre 0 y 1, aunque funciona con cualquier valor. 00082 . 0 no hace nada, y 1 tiene efecto maximo. 00083 - SPL_FLOAT {i} : entrada (input) al filtro. 00084 - SPL_FLOAT {i0} : entrada anterior al filtro (memoria de la entrada 00085 . anterior) 00086 - SPL_FLOAT {o0} : salida anterior del filtro (memoria de la salida 00087 . anterior del filtro). 00088 00089 Cada funcion {devuelve} la salida del sistema ('o', output). 00090 00091 Las funciones ?????_n procesan un vector. Reciben el vector y su 00092 longitud, la memoria inicial del filtro y el vector de salida, 00093 y se {devuelve} un puntero al propio vector de salida. 00094 00095 Parametros: 00096 00097 - SPL_FLOAT {a} : constante de preenfasis/deenfasis. Comprendida 00098 . entre 0 y 1, aunque funciona con cualquier valor. 00099 . 0 no hace nada, y 1 tiene efecto maximo. 00100 - SPL_FLOAT {i0} : entrada anterior al filtro (memoria de la entrada 00101 . anterior al primer elemento del vector) 00102 - SPL_FLOAT {o0} : salida anterior del filtro (memoria de la salida 00103 . anterior al primer elemento del vector). 00104 - SPL_pFLOAT {vi} : vector de entrada al filtro. 00105 - SPL_pFLOAT {vo} : vector de salida del filtro 00106 - SPL_INT {N} : longitud de los vectores de entrada y salida. {N}>0 00107 00108 Cada funcion {devuelve} el propio puntero {vo}. 00109 Puede enviarse {vo} igual a {vi} si se quiere reemplazar la entrada 00110 con la salida. */ 00111 /**********************************************************/ 00112 /* {devuelve} la salida de preenfatizar con {a} la muestra de 00113 entrada {i}, si la entrada anterior al sistema era {i0} */ 00114 00115 PUBLIC SPL_FLOAT XAPI preen_i( SPL_FLOAT a, SPL_FLOAT i, SPL_FLOAT i0 ) 00116 { 00117 return i-a*i0; 00118 } 00119 00120 /**********************************************************/ 00121 /* preenfatiza con {a} el vector {vi} de {N} elementos. Mete el resultado 00122 en {vo}. {i0} es la entrada anterior al primer elemento de {vi} (memoria 00123 inicial). {vi} e {vo} pueden ser el mismo. {N}>0 */ 00124 00125 PUBLIC SPL_pFLOAT XAPI preen_n( SPL_FLOAT a, SPL_pFLOAT vi, SPL_pFLOAT vo, 00126 SPL_INT N, SPL_FLOAT i0 ) 00127 { 00128 SPL_INT i; 00129 assert(N>0); 00130 00131 for (i=N-1; i>0; i--) /* hacia atras, por si vi==vo */ 00132 vo[i] = vi[i]-a*vi[i-1]; 00133 vo[0] = vi[0]-a*i0; 00134 00135 return vo; 00136 } 00137 00138 /**********************************************************/ 00139 /* {devuelve} la salida de deenfatizar con {a} la muestra de 00140 entrada {i}, si la salida anterior del sistema era {o0} */ 00141 00142 PUBLIC SPL_FLOAT XAPI deen_i( SPL_FLOAT a, SPL_FLOAT i, SPL_FLOAT o0 ) 00143 { 00144 return i+a*o0; 00145 } 00146 00147 /**********************************************************/ 00148 /* deenfatiza con {a} el vector {vi} de {N} elementos. Mete el resultado 00149 en {vo}. {o0} es la salida anterior al primer elemento de {vo} (memoria 00150 de salida inicial). {vi} e {vo} pueden ser el mismo. {N}>0 */ 00151 00152 PUBLIC SPL_pFLOAT XAPI deen_n( SPL_FLOAT a, SPL_pFLOAT vi, SPL_pFLOAT vo, 00153 SPL_INT N, SPL_FLOAT o0 ) 00154 { 00155 SPL_INT i; 00156 assert(N>0); 00157 00158 vo[0] = vi[0]+o0*a; 00159 for (i=1; i<N; i++) 00160 vo[i]=vi[i]+vo[i-1]*a; 00161 00162 return vo; 00163 } 00164 00165 /**********************************************************/ 00166