Obtener el valor actual en la tabla de valores
Usamos un índice para posicionarnos dentro de la tabla de valores, cuyo avance o incremento va a depender de la frecuencia del oscilador, del largo de la tabla de valores y de la frecuencia de muestreo que se usa para generar la textura.
Usamos una función que modificará apropiadamente el índice de la tabla de valores
Argumentos:
- lg_actual -- puntero al índice de la tabla.
- frec -- la frecuencia en Hz en que se genera la onda periódica.
- largo -- el largo de la tabla de valores.
- frec_mues -- la frecuencia de muestreo en que se usa para leer las muestras
Salida:
No hay valor de retorno.
Proceso:
- Debo sumar al índice actual de la tabla un valor que se obtiene de la frecuencia, el largo de la tabla y la frecuencia de muestreo. Éste valor debe estar en ciclos. Al dividir el largo por la frecuencia de muestreo obtengo un valor que representa los segundos que demora en leer la tabla de valores (recordemos que largo es el largo de la tabla de valores). Al multiplicar éste valor en segundos por la frecuencia, resulta en la cantidad de ciclos que se deben avanzar ésta vez. Lo más seguro que éste valor sea una porción de un ciclo.
- Pero al incrementar el valor actual puedo estar más allá del largo de la tabla, es decir de un ciclo de la onda periódica (si lo pensamos como sonido con percepción de altura), si eso ocurre debemos restar al valor actual una cantidad igual al largo de la tabla hasta que estemos en un lugar dentro del ciclo de la tabla.
- Como última prevención podemos verificar que el lugar actual no sea negativo, ya que los elementos en un arreglo son siempre positivos, y para eso debemos sumar el largo de la tabla hasta estar dentro de un lugar dentro del ciclo de la tabla. El caso en que puede darse esto es cuando la frecuencia sea negativa, dado que el largo es siempre positivo y también la frecuencia de muestreo, el programa sencillamente no funcionaría.
- El primer argumento de la función es un puntero al lugar actual de la tabla de valores, por lo tanto siempre estamos modificando el valor al que apunta, y esto tiene alcance más allá de la función.
Diagrama de flujo
Código
void LugarActualTabla(float *lug_actual, float frec, int largo, int frec_mues)
{
*lug_actual += (frec * ((float)largo / (float)frec_mues));
while(*lug_actual >= (float)largo)
*lug_actual -= (float)largo;
while(*lug_actual < 0.0)
*lug_actual += (float)largo;
}