Crear una tabla de valores
Ésta tabla será usada como un ciclo de valores para generar la onda. Dicho ciclo de valores se crea mediante una función genérica, de ésta manera la tabla puede tener la forma que se deseé. Antes de generar la tabla debemos conocer su tamaño y en que lugar de la función que genera los valores comenzaremos a leer.
Entonces creamos una función que genere dicha tabla.
Argumentos:
- fase -- decimal, el lugar desde donde se comienza a leer en la función generadora de valores. El rango debe estar entre 0 y 1.
- largo -- entero positivo, el largo en muestras de la tabla a generar.
- FuncGen -- ésta es la función genérica que llena los valores de la tabla. Debe tomar como argumento un valor decimal y devolver un valor decimal.
Salida:
Un puntero a la tabla de valores.
Proceso:
- Creo dinámicamente un conjunto de valores decimales cuyo tamaño es igual a largo.
- Hallo el lugar donde se comienza a leer en la función que llena cada lugar de la tabla. Dado que la tabla representa un ciclo, éste siempre se completa cada 2PI, y por lo tanto para hallar el valor multiplico a fase por 2PI.
- Itero por cada elemento de la tabla, asignándole el valor de la función generadora cuyo argumento es el obtenido en el paso anterior. Incremento el argumento de la función una cantidad que es una fracción de la tabla. Como dije antes un ciclo se completa cada 2PI, entonces divido este valor por el largo de la tabla para obtener dicha fracción.
- Cuando el índice en la iteración llega a la cantidad de elementos de la tabla, salgo de la función con un puntero a dicha tabla.
Diagrama de flujo
Código
float *CrearTabla(float fase, int largo, float (*GenTabla)(float))
{
float *tabla = (float *)calloc(largo, sizeof(float));
float radian = fase * DOS_PI;
float incr = DOS_PI / (float)largo;
int i;
for(i = 0; i < largo; i++)
{
tabla[i] = GenTabla(radian);
radian += incr;
}
return tabla;
}
/* función seno de ejemplo que puede ser usada por CrearTabla */
float FuncionSeno(float valor)
{
return sin(valor);
}
Nota -- DOS_PI es una macro definida en defs.h