Está en la página 1de 3

#include "dsk6713_aic23.

h" // archivo con las funciones de la tarjeta dsk


#define PI 3.14159265359 // definimos la constante PI
Uint32 fs=DSK6713_AIC23_FREQ_48KHZ; // frecuencia de muestreo
float f0=500; // frecuencia de la señal generada
float fs_float; // frecuencia de muestreo en Hz
float angle=0; // variable temporal en radianes
float offset; // variador de la linea temporal
short amp=20; // amplitud de la señal generada
short triang_value; // valor de la señal generada

interrupt void c_int11() // rutina de servicio de interrupción


{
switch(fs) // convertir fs a Hz
{
case DSK6713_AIC23_FREQ_8KHZ:
case DSK6713_AIC23_FREQ_16KHZ:
case DSK6713_AIC23_FREQ_24KHZ:
case DSK6713_AIC23_FREQ_32KHZ:
case DSK6713_AIC23_FREQ_48KHZ:
fs_float=8000*fs;
break;
case DSK6713_AIC23_FREQ_44KHZ:
fs_float=44000;
break;
case DSK6713_AIC23_FREQ_96KHZ:
fs_float=96000;
break;
}
offset=2*PI*f0/fs_float; // definir el variador temporal
angle = angle + offset; // tiempo anterior mas la variacion
if (angle > 2*PI) // si angle es 2pi
angle -= 2*PI; // se vuelve cero
if (angle<(PI/2))
{
triang_value=(short)1000*angle*amp/(PI/2) // el primer cuarto la de la señal
}
else
{
if (angle<(3*PI/2))
{triang_value=(short)1000*(2*amp-angle*amp/(PI/2))} // 2do y 3er cuarto de la señal
else
{triang_value=(short)1000*(-4*amp-angle*amp/(PI/2))} // ultimo cuarto de la señal
}
output_left_sample(triang_value); // señal triangular por el canal izq
return; // retorno de interrupcion
}

void main()
{
comm_intr(); // iniciar DSK, codec, SP0 para interrupciones
while(1); // bucle infinito
}
EXPLICACION DEL PROGRAMA

El código del programa contiene comentarios que forma parte de esta explicación.

La primera parte del programa carga el archivo necesario para el programa (dsk6713_aic23.h), estable la
frecuencia de muestre fs (48KHz) y define las variables.
El programa genera los valores discretos de la señal punto a punto, a través de una ISR, definida como
c_int11()
La primera parte de la ISR es un switch que establece fs_float (frecuencia de muestreo en Hz) a partir de fs,
el cual contiene un número de 1 al 7 según el valor que le hayamos dado en la primera parte del programa, y
acorde con la siguiente tabla:

#define DSK6713_AIC23_FREQ_8KHZ 1
#define DSK6713_AIC23_FREQ_16KHZ 2
#define DSK6713_AIC23_FREQ_24KHZ 3
#define DSK6713_AIC23_FREQ_32KHZ 4
#define DSK6713_AIC23_FREQ_44KHZ 5
#define DSK6713_AIC23_FREQ_48KHZ 6
#define DSK6713_AIC23_FREQ_96KHZ 7

Esta tabla se encuentra en el archivo dsk6713_aic23.h, como vemos la relacion entre la frecuencia en Hz y el
valor asignado tiene una forma lineal (factor 8000) excepto para 5 y 7.
La segunda parte de la ISR define el offset (el que hara variar el tiempo "angle") y angle volverá a 0 cuando
valga 2pi.
Segun el valor de angle, la señal tomara la forma de x[n]=k*n para n<pi/2, x[n]=B-k*n para n<3pi/2 y x[n]=-
C+k*n estas condiciones definen la forma triangular de la señal generada, la señal es expuesta en el canal
izquierdo.
La última parte es la rutina principal, la cual contiene la inicialización de las interrupciones y el bucle
infinito.

ALGORITMO PARA LA GENERACION DE LA ONDA TRINGULAR


Dibujamos un periodo de la onda triangular
x[n]
|
|
+Amp_|...........
| /\
|/__\_______ n
| \ /
_|.....\/....
-Amp |
|
|

observamos que para la primera cuarta parte de la onda es una funcion lineal cuya pendiente es:
m=Amp/(PI/2)
entonces x[angle]=angle*amp/(PI/2)

extendemos la línea correspondiente a la 2do y 3er cuarto de la onda hacia el eje vertical

+2Amp_|
|\
+Amp_| \
| /\
|/__\_______ n
| \ /
_|.....\/....
-Amp |
|

observamos que para este segmento la funcion lineal tiene pendiente:


m=-Amp/(PI/2)
y corta el eje vertical en 2Amp
entonces x[angle]=2*amp-angle*amp/(PI/2)

extendemos la línea correspondiente al ultimo cuarto de la onda hacia el eje vertical

+Amp_| \
| /\
|/__\_______ n
| \ /
_|.....\/....
-Amp | /
| /
| /
| /
| /
_|/
-4Amp |

observamos que para este segmento la funcion lineal tiene pendiente:


m=Amp/(PI/2)
y corta el eje vertical en -4Amp
entonces x[angle]=-4*amp+angle*amp/(PI/2)

También podría gustarte