00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1994 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ SPL6.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.2 30/07/95 Borja scope funciones explicito 00018 1.1.1 02/03/95 Borja LONG-->FLOAT para evitar posibles overflows 00019 1.1.0 08/12/94 Borja revision general (tipos,idx,nel,tnel...) 00020 1.0.0 06/07/93 Borja Codificacion inicial. 00021 00022 ======================== Contenido ======================== 00023 Generacion de numeros aleatorios con distribucion pseudo-gaussiana 00024 de valor medio cero. 00025 00026 Las funciones reciben un valor {c}. Cuanto mayor sea {c}, mas 'gaussiana' 00027 es la distribucion. Con {c}=8 ya se obtienen buenos resultados. 00028 Este valor {c} es el numero de valores aleatorios uniformes a sumar. 00029 {c}>=1. 00030 00031 Hay 2 tipos de funciones noise_i_? y noise_n_?. 00032 00033 - noise_i_? se {devuelve} un valor aleatorio. 00034 - noise_n_? rellenan un vector con valores aleatorios. 00035 00036 Hay 2 variantes para cada una de las anteriores: 00037 - noise_?_v distribucion con Varianza unidad (potencia normalizada). 00038 - noise_?_m distribucion con Maximo unidad (amplitud normalizada). 00039 00040 Las funciones gnoise_??? producen ruido pseudo-gaussiano generalizado 00041 de forma similar a las funciones noise_??? pero con la media y la 00042 varianza indicadas como parametros. Ademas de el valor {c}, reciben 00043 la media en {mean} y la varianza en {var}. Hay 2 funciones, gnoise_i() 00044 y gnoise_n() que respectivamente generan una sola muestra o rellenan 00045 un vector. 00046 00047 Definir NDEBUG para desconectar la validacion de parametros 00048 con assert(). No definir este simbolo mientras se depuren 00049 aplicaciones, ya que aunque las funciones son algo mas lentas, 00050 el chequeo de validacion de parametros resuelve muchos problemas. 00051 =========================================================== 00052 */ 00053 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00054 /**********************************************************/ 00055 00056 #include <stdlib.h> 00057 00058 #include "spli.h" 00059 00060 /**********************************************************/ 00061 /* {devuelve} numero aleatorio gaussiano entre +-1, sumando {c} 00062 numeros aleatorios uniformes. 00063 La varianza es 1/(3*{c}) = funcion noise_mvar(c). */ 00064 00065 PUBLIC SPL_FLOAT XAPI noise_i_m( SPL_INT c ) 00066 { 00067 SPL_INT i; 00068 SPL_FLOAT l; 00069 assert(c>0); 00070 00071 l = 0.0; 00072 for (i=0; i<c; i++) 00073 l += rand(); /* sumar para obtener numero aleatorio pseudo-gaussiano */ 00074 00075 /* normaliza a +-1 */ 00076 return (l*2.0) / ((SPL_FLOAT)RAND_MAX*(SPL_FLOAT)c) - 1.0; 00077 } 00078 00079 /**********************************************************/ 00080 /* {devuelve} numero aleatorio gaussiano con varianza unidad, sumando {c} 00081 numeros aleatorios uniformes. */ 00082 00083 PUBLIC SPL_FLOAT XAPI noise_i_v( SPL_INT c ) 00084 { 00085 SPL_INT i; 00086 SPL_FLOAT l; 00087 assert(c>0); 00088 00089 l = 0.0; 00090 for (i=0; i<c; i++) 00091 l+=rand(); 00092 00093 return ((l*2.0) / ((SPL_FLOAT)RAND_MAX*(SPL_FLOAT)c) - 1.0) * 00094 sqrt(3.0*(SPL_FLOAT)c); 00095 } 00096 00097 /**********************************************************/ 00098 /* rellena el vector {v} de {N} elementos con numeros aleatorios 00099 gaussianos entre +-1, sumando {c} numeros aleatorios uniformes. 00100 La varianza es 1/(3*{c}). 00101 {devuelve} el puntero {v} */ 00102 00103 PUBLIC SPL_pFLOAT XAPI noise_n_m( SPL_pFLOAT v, SPL_INT N, SPL_INT c ) 00104 { 00105 SPL_INT i; 00106 assert(c>0); 00107 00108 for (i=0; i<N; i++) 00109 v[i]=noise_i_m(c); 00110 00111 return v; 00112 } 00113 00114 /**********************************************************/ 00115 /* rellena el vector {v} de {N} elementos con numeros aleatorios 00116 gaussianos con varianza unidad sumando {c} numeros aleatorios uniformes. 00117 {devuelve} el puntero {v} */ 00118 00119 PUBLIC SPL_pFLOAT XAPI noise_n_v( SPL_pFLOAT v, SPL_INT N, SPL_INT c ) 00120 { 00121 SPL_INT i; 00122 assert(c>0); 00123 00124 for (i=0; i<N; i++) 00125 v[i]=noise_i_v(c); 00126 00127 return v; 00128 } 00129 00130 /**********************************************************/ 00131 /* {devuelve} la varianza de los numeros generados con las funciones 00132 noise_?_m(), para el parametro {c} que se utilice. */ 00133 00134 PUBLIC SPL_FLOAT XAPI noise_mvar( SPL_INT c ) 00135 { 00136 return 1.0/(3.0*(SPL_FLOAT)c); 00137 } 00138 00139 /**********************************************************/ 00140 /* {devuelve} numero aleatorio gaussiano con media {mean} y varianza 00141 {var}, sumando {c} numeros aleatorios uniformes. 00142 {c}>=1, {var}>0 */ 00143 00144 PUBLIC SPL_FLOAT XAPI gnoise_i( SPL_INT c, SPL_FLOAT mean, SPL_FLOAT var ) 00145 { 00146 assert(c>0); 00147 assert(var>0.0); 00148 00149 return mean+noise_i_v(c)*sqrt(var); 00150 } 00151 00152 /**********************************************************/ 00153 /* rellena el vector {v} de {N} elementos con numeros aleatorios 00154 gaussianos de media {mean} y varianza {var} sumando {c} numeros aleatorios 00155 uniformes. 00156 {devuelve} el puntero {v}. 00157 {c}>=1, {var}>0 */ 00158 00159 PUBLIC SPL_pFLOAT XAPI gnoise_n( SPL_pFLOAT v, SPL_INT N, SPL_INT c, 00160 SPL_FLOAT mean, SPL_FLOAT var ) 00161 { 00162 SPL_INT i; 00163 assert(c>0); 00164 assert(var>0.0); 00165 00166 var = sqrt(var); 00167 for (i=0; i<N; i++) 00168 v[i]=mean+noise_i_v(c)*var; 00169 00170 return v; 00171 } 00172 00173 /**********************************************************/ 00174