You are on page 1of 16

INSTITUTO POLITÉCNICO NACIONAL

UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA


CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


PRACTICA 1. PRIMEROS PASOS CON EL DSP EN CCS

OBJETIVO: En esta práctica se presentarán los primeros pasos para trabajar con el DSP TSM320C6713
de Texas instruments mediante la utilidad de diagnóstico DSK para el testeo de la tarjeta completa
(diagnóstico del USB, herramienta de emulación, DSP, memoria externa, códecs, leds y dipswitches),
así como la generación de código e implementación de un algoritmo en C.

DESCRIPCIÓN: Realizar las conexiones de la tarjeta TSM320C6713 de Texas instruments a la PC con


la finalidad de realizar la prueba general “test” mediante la aplicación DSK’s Diagnostic Utility incluida
por el fabricante.

Posteriormente se describirá el procedimiento para elaborar y cargar un programa en el DSP.

MATERIAL:

• Tarjeta Spectrum Digital Developer Starter Kits DSK’s TMS320C6713


• Software de desarrollo 6713 DSK CCStudio v3.x
• Software de configuración Setup CCStudio Setup v3.x
• Software de prueba 6713 DSK Diagnostics Utility v3.x

DESARROLLO:

1. Conectar a la fuente de voltaje la tarjeta


2. Conectar el cable USB a la PC.
3. Ejecutar 6713 DSK Diagnostics Utility v3.x para realizar una prueba de la tarjeta de desarrollo.
El ícono correspondiente a la utilidad de diagnóstico se muestra a continuación:

Fig 1.0 Utilidad para la realización de pruebas con la tarjeta C6713.

En la figura 1.0 se muestra la aplicación para la realización de pruebas a la tarjeta.

Sergio Domínguez Sánchez 1


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


4. Presione el botón Start para realizar la prueba de la placa. Si todos los leds que se puestran
en la interface gráfica del software encienden en color verde, significa que todos los
componentes de la placa funcionan perfectamente, en caso contrario se indicarán los
componentes inactivos o dañados.

Fig 1.1 Estados de la rutina de prueba

En la figura 1.1 se muestran los estados de la rutina de prueba a la tarjeta, cada combinación
de LEDS encendidos representan una prueba distinta. La prueba puede durar varios segundos
en la segunda prueba (External SDRAM test). Puede tomar un rato en probar toda la memoria
SDRAM incluida en el DSK. Si toma más de 15-30 s, puede haber un problema.

Creación del primer proyecto en CCStudio 3.x

1. Ejecutar Setup CCStudio v3.x para seleccionar la tarjeta (emulador o tarjeta física) a utilizar
para el desarrollo de las prácticas como se muestra en la figura 1.2

Fig 1.2 Selección de la tarjeta a utilizar

Sergio Domínguez Sánchez 2


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


2. Seleccionar la tarjeta C6713 DSK y presionar el botón de ADD para añadir la tarjeta
seleccionada. Una vez seleccionada, ésta deberá aparecer en la parte izquierda de la pantalla
en System Configuration.
3. Presionar el botón Save & Quit para guardar los cambios realizados e iniciar con el desarrollo
del programa. Enseguida aparecerá un cuadro de dialogo con la pregunta de si se desea inciar
con Code Composer y deberá seleccionar Si para iniciar con la creación de un nuevo proyecto.
4. Para crear un nuevo proyecto seleccionar Proyect® New y colocar el nombre como aparece
en la figura 2.1. Es importante seleccionar la tecnología a implementar, en este caso deberá
seleccionar la tarjeta TMS320C67XX.

Fig 1.3 Creación de un nuevo proyecto.

5. Una vez creado el nuevo proyecto, se deberá crear un nuevo archivo de configuración CDB
que incluirá las especificaciones de la tarjeta de desarrollo así como las configuraciones
necesarias que haya que implementar en dicha tarjeta, para ello se deberá seleccionar como
aparece en la figura 1.4

Fig 1.4 Creación de un archivo de configuración CDB

En seguida deberá seleccionar el archivo correspondiente a la tarjeta de desarrollo


TMS320C6713 como se muestra en la figura 1.5

Sergio Domínguez Sánchez 3


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.

Fig 1.5 Selección del archivo de configuración correspondiente a la tarjeta TMS320C6713

Una vez seleccionado, deberá guardar el archivo y añadirlo al proyecto para que éste tenga efecto
como se muestra en la figura 2.2 haciendo clic derecho sobre la carpeta DSP/BIOS Config.

Fig 1.6 Adición del archivo de configuración CDB.

6. Se deberá crear un nuevo archivo con extensión .c como se muestra en la figura 1.7 donde
se editará el codigo de nuestro primer programa.

Fig 1.7 Creación de una nueva fuente de archivo

7. Deberá añadir el archivo con extensión .c al proyecto posicionando el cursor sobre la carpeta
source del proyecto de nombre Source y presionar el botón derecho como aparece en la
figura 1.8

Sergio Domínguez Sánchez 4


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.

Fig 1.8 Añadir nuevo archivo fuente al proyecto

8. La siguiente plantilla muestra la estructura general que se deberá implementar para el


desarrollo de todas las practicas de DSPs, tomando en cuenta nombre de la práctica, versión,
datos generales y la estructura que se detalla más adelante en el punto número 9.

/*
* ========================= main.c Ver 1.0 =============================
*INSTITUTOPOLITÉCNICONACIONAL
* ======================================================================
* UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA CAMPUS ZACATECAS
* UNIDAD DE APRENDIZAJE: PROCESADOR DIGITAL DE SEÑALES
* PRACTICA 1: Primeros pasos con un DSP y CCS
* PROFESOR:
* ALUMNO: FULANITO DE TAL...
* DESCRIPCIÓN:
*/
/*
* ======== Include files ========
*/
/*
* ======== Declarations ========
*/
/*
* ======== Prototypes ========
*/
/*
* ======== Global Variables ========
*/
/*
* ======== main ========

*/

int main()
{
// Código...

Sergio Domínguez Sánchez 5


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


return 0;
}
/*
* ======== Description Function ========

*/

9. La estructura de la plantilla que se mostró en el punto anterior consta de 7 bloques:


a) En el primero se describe mediante comentarios los datos relevantes a la práctica, así
como la descripción detallada del programa.
b) En el segundo bloque se incluyen los archivos de cabecera con extensión .h; cabe señalar
que cuando se utiliza < > se refiere a una ruta predefinida y cuando se utilizan “ ” hace
referencia localmente.
c) En el tercer bloque se definen las declaraciones que hacen referencia a valores
constantes.
d) En el cuarto bloque se declaran los prototipos de funciones.
e) En el quinto bloque se declaran las variables globales a utilizar en el programa. Recuerda
que el uso de este tipo de variables involucra el uso de más memoria.
f) En el sexto bloque se programa la función principal main.
g) En el séptimo y último bloque se programan los algoritmos de las funciones.

Código C a implementar

Se programarán un par de ejemplos para ilustrar algunas de las características de CCS y la tarjeta DSK.
El objetivo de estos ejemplos es familiarizarse con las herramientas de software y hardware que serán
usadas en esta asignatura.

Ejemplo1: Este ejemplo genera una forma de onda senoidal analoga usando un método de busqueda
de tablas. Ilustra algunas de las caracteristicas de CCS para editar archivos fuente, creación de
proyecto, acceso de las herramientas de generación de código, y ejecución de programa en el
procesador C6713.

En los Apendices de este documento se encontrarán los codigos C necesarios para esta practica.

Procedimiento:

1. Iniciar CCS usando el icono de escritorio.


2. Crear un nuevo proyecto llamado audio_sin.pjt seleccionando Project® New (Asegurese de
seleccionar el Target correcto).
3. Verifique que el proyecto nuevo creado esté abierto
4. Crear un nuevo archivo CDB (Configuración DSP/BIOS), seleccionar dsk6713.cdb
5. Guardar archivo de configuración
6. Agregar archivos al proyecto
a. main.c
b. audioapp.cdb
c. sine.c
7. Examinando el codigo C

Sergio Domínguez Sánchez 6


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


Si se inspecciona main.c, notará que hemos configurado un búfer en memoria de longitud 32. Éste
retendrá los valores que se generan por la rutina generadora de onda senoidal. Observe la rutina
main(). Se inicializa el generador senoidal llamando la función seno (llena el bufer con valores seno),
y después entra en un loop while infinito.

8. Examinar la rutina senoidal

En la rutina sine.c se tiene codificado un filtro IIR usando algunas condiciones iniciales que se
proporcionan con la llamada a SINE_init(). Pasamos el tono que queremos generar y la velocidad con
la que vamos a muestrear ese tono. También pasamos una estructura SINE_Obj que es usado por el
generador senoidal para mantener un seguimiento de la información que se necesite. Para realmente
generar valores senoidales, se llama a la función SINE_blockFill(). Cada vez que esta rutina es llamada,
llenará el búfer con 32 valores nuevos de datos senoidales. Más adelante se graficará este búfer para
ver si la onda se genera.

9. Examinar/Modificar las opciones de compilación

Seleccione Project®Build Options

Usando los ajustes en estas cuatro pestañas, podrá controlar la compilación y vinculación de su
proyecto a cualquier grado que se deseé. Por ejemplo: puede escoger varios niveles de optimización
de código. Por el momento dejaremos esta opción en apagado (None).

Fig 1.9 Opciones de compilación

Se observan reflejadas en el cuadro de dialogo de la figura 1.9, todas las opciones seleccionadas.

10. Configuración de depuración.

Ahora que todos los archivos han sido añadidos a nuestro proyecto, es tiempo de crear el programa
de salida ejecutable (el archivo .out). Este se auto nombrará audio_sine.out.

Sergio Domínguez Sánchez 7


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


Las configuraciones de compilación se muestran a la derecha del nombre del proyecto cerca de la
esquina superior izquierda del CCS. Para depuración sencilla, use la configuración Debug; esta debe
ser la configuración por defecto.

11. Compilar el programa.

Use el icono REBUILD ALL de la barra o seleccione Project® Rebuild All

La ventana de salida de compilación se muestra en la parte baja de la ventana del CCS. Revise la
información del progreso de compilación. Si observa “0 Errors, 0 Warnings, 0 Remarks”, la
compilación se habrá realizado con éxito.

12. Cargar el programa al DSK

Si se encuentra ativa la opción Program Load After Build, el programa deberá descargarse al DSK por
el depurador del CCS. Si el programa no lo carga, seleccione: File ® Load Program y busque en la
carpeta Debug el archivo audio_sine.out

Ahora que hemos cargado el programa usaremos algunas herramientas para mirarlo más de cerca.

13. Agregue gBuf a la ventana Watch

Seleccione y resalte la variable gBuf en la ventana main.c. De click derecho en gBuf y escoja Add to
Watch Window.

14. Ver el contenido de memoria en la dirección gBuf

Otra manera de ver los valores de la memoria es usar una ventana de memoria. Seleccione View®
Memory y escriba lo siguiente:

Title = gBuf

Address = gBuf

Q-Value = 0

Format = 16-Bit Hex-TI Style

Sergio Domínguez Sánchez 8


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


Presione OK y redimensione la ventana para que pueda ver el codigo y el búfer. Como la memoria no
ha sido inicializada, veremos datos random en esta localidad.

15. Grabar la dirección del arreglo gBuf.

Hay muchas maneras de encontrar esta dirección:

• La dirección mostrada para el valor +gBuf en la ventana Watch Window o


• La dirección asociada con gBuf en la ventana Memory view

Dirección de gBuf:____________________________________________

16. Inicializar el arreglo gBuf a zero.

Seleccione: Edit ® Memory ® Fill

Y llene con lo siguiente:

• Dirección = gBuf
• Longitud = 16
• Fill pattern = 0

Click OK. El búfer fue 32 valores de 16-bit de longitud (fueron definidos como “shorts” en el código
C). La función de memoria Fill llena localidades de enteros o 32-bits. Así que solo necesitamos llenar
16 locaciones de 32-bits del arreglo de 32x16. Mantenga esto en mente cuando quiera inicializar un
area de memoria. Podria terminar llenando algo que no debería. Crearemos un archivo GEL que llena
esto automáticamente.

17. Establezca punto de paro.

Establezca un punto de paro en el loop while main(). Los puntos de paro pueden colocarse en 3
formas distintas. Escoja el que más le guste.

• Coloque el cursor en la llave final del loop while() y de click en


• Click derecho en la linea con la llave final y escoja Toggle Breakpoint
• Doble click en el área gris junto a la llave final

18. Corra el código hasta el punto de paro. Hay 3 maneras:

• Use el icono de la barra de herramientas:


• Seleccione: Debug® Run
• Presione F5

Sergio Domínguez Sánchez 9


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


El procesador se detendrá al punto de paro que se ha configurado. Note que esta linea está dentro
de un loop while infinito. Note que la ventana Watch Window cambia para mostrar el nuevo valor de
gBuf[]. Debe hacer click en el signo + a un lado del búfer para ver los valores.

Los valores en rojo son los valores que han cambiado en la última actualización, que ocurre cuando
el código llega al punto de paro.

19. Guarda tu espacio de trabajo

Mientras una ventana no sea maximizada en CCS, puede ser movida a cualquier locación que prefiera.
Las ventanas pueden flotar o fijarse. Seleccione Watch Window, click derecho en la parte superior y
seleccione Float In Main Window. Después, muevala alrededor. Trate de fijarla nuevamente. Cuando
tenga las ventanas exactamente donde quiera, guarde su espacio de trabajo seleccionando: File®
Workspace® Save Workspace As, escoja un nombre y guardelo en cualquier ubicación que guste.
Para cargar un espacio de trabajo seleccione: File® Workspace® Load Workspace.

20. Grafique los datos senoidales.

La ventana Watch Window es una gran manera de ver los datos en CCS. Pero, ¿puede decir si esto es
en realidad una señal senoidal? ¿No sería mejor ver los datos graficados?. Seleccione:

View® Graph® Time/Frequency

Modifique los siguientes valores:

• Graph Title gBuf


• Start Address gBuf
• Acquisition Buffer Size 32
• Display Data Size 32
• DSP Data Type 16-bits signed integer
• Sampling Rate 8000

Cuando termine de click en OK

Sergio Domínguez Sánchez 10


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


Su grafica debe ser algo como esto:

21. Otras caracteristicas gráficas.

Podremos realizar diferentes graficas: tiempo frecuencia, magnitud FFT, tiempo dual, constelación,
etc. La señal senoidal que generamos fue una onda a 256Hz muestreada a 8KHz. Se revisará si es
posible graficar la magnitud FFT para ver la frecuencia fundamental de la onda senoidal.

Click derecho en el display gráfico de gBug y seleccione Properties. Cambie el tipo del display a FFT
Magnitude y seleccione OK. Desplegará algo como la figura siguiente:

22. Quite los puntos de paro.

Borre cualquier punto de paro que haya colocado, puede hacerlo de diferentes maneras:

• Debug® Breakpoints® Delete All

• Use el icono de la barra de herramientas


23. Cierre el proyecto y CCS

Sergio Domínguez Sánchez 11


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


Apéndices

/*
* ========================= main.c =============================
*INSTITUTOPOLITÉCNICONACIONAL
* ======================================================================
* UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA CAMPUS ZACATECAS
* UNIDAD DE APRENDIZAJE: PROCESADOR DIGITAL DE SEÑALES
* PRACTICA 1: Primeros pasos con un DSP y CCS
* PROFESOR:
* ALUMNO:
* DESCRIPCIÓN: Genera una forma de onda senoidal análoga
*usando un método de búsqueda de tablas.
*/
/*
* ======== Include files ========
*/
#include "sine.h"

/*
* ======== Declarations ========
*/
#define BUFFSIZE 32
/*
* ======== Prototypes ========
*/
/*
* ======== Global Variables ========
*/
short gBuf[BUFFSIZE];
SINE_Obj sineObj;
/*
* ======== main ========
*/
void main()
{
SINE_init(&sineObj, 256, 8 * 1024);

SINE_blockFill(&sineObj, gBuf, BUFFSIZE); //Llena el buffer con datos senoidales


while(1){ //Loop
infinito
}
}

/*

Sergio Domínguez Sánchez 12


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.

/*
* =============sine.h================
*Este archivo contiene los prototipos para todas las funciones
*contenidas en sine.c
*/
#ifndef SINE_Obj
typedef struct {
float freqTone;
float freqSampRate;
float a;
float b;
float y0;
float y1;
float y2;
float count;
float aInitVal;
float bInitVal;
float y0InitVal;
float y1InitVal;
float y2InitVal;
float countInitVal;
} SINE_Obj;
#endif

void copyData(short *inbuf, short *outbuf, int length);


void SINE_init(SINE_Obj *sineObj, float freqTone, float freqSampRate);
void SINE_blockFill(SINE_Obj *myObj, short *buf, int len);
void SINE_addPacked(SINE_Obj *myObj, short *inbuf, int length);

Sergio Domínguez Sánchez 13


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


// ============ sine.c ==============================
// El coeficiente A y los tres valores iniciales
// generan un tono de 200Hz (onda senoidal) con una
// velocidad de muestreo de 48KHz
//
// Aunque el calculo esté hecho en punto flotante,
// esta función regresa un valor tipo short ya que
// es lo que necesita el códec de 16-bit (DAC).

// ================ Includes =====================


#include "sine.h"
#include <std.h>
#include <math.h>

// ============= Definitions =====================


#define PI 3.1415927

// ===============Prototypes ====================
void SINE_init(SINE_Obj *sineObj, float freqTone, float freqSampRate);
void SINE_blockFill(SINE_Obj *sineObj, short *buf, int len);
void SINE_addPacked(SINE_Obj *sineObj, short *inbuf, int length);
void SINE_add(SINE_Obj *sineObj, short *inbuf, int length);
static short sineGen(SINE_Obj *sineObj);
static short sineGen(SINE_Obj *sineObj);
static float degreesToRadiansF(float d);
void copyData (short *inbuf, short *outbuf ,int length);

// ================ Globals =====================

// ================ SINE_init ===================


// Inicializa el algoritmo de generación de la onda senoidal
void SINE_init(SINE_Obj *sineObj, float freqTone, float freqSampRate)
{
float rad=0;

if(freqTone == NULL)
sineObj->freqTone =200;
else
sineObj->freqTone =freqTone;

if(freqSampRate == NULL)
sineObj->freqSampRate =48 * 1024;
else
sineObj->freqSampRate =freqSampRate;

rad = sineObj->freqTone / sineObj->freqSampRate;


rad = rad * 360.0;
rad = degreesToRadiansF(rad);

sineObj->a = 2 * cosf(rad);
sineObj->b = -1;
sineObj->y0 = 0;

Sergio Domínguez Sánchez 14


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


sineObj->y1 = sinf(rad);
sineObj->y2 = 0;
sineObj->count = sineObj->freqTone * sineObj->freqSampRate;

sineObj->aInitVal = sineObj->a;
sineObj->bInitVal = sineObj->b;
sineObj->y0InitVal = sineObj->y0;
sineObj->y1InitVal = sineObj->y1;
sineObj->y2InitVal = sineObj->y2;
sineObj->countInitVal = sineObj->count;
}

// ================ SINE_blockFill ===================


//Genera un bloque de datos senoidales usando sineGen
void SINE_blockFill(SINE_Obj *sineObj, short *buf, int len)
{
int i=0;

for(i=0;i<len;i++) {
buf[i] = sineGen(sineObj);
}
}

// ================ SINE_addPacked =================


// agrega la forma de onda senoidal al búfer indicado de los datos
// divide la señal senoidal en 8 y lo agrega
void SINE_addPacked(SINE_Obj *sineObj, short *inbuf, int length)
{
int i=0;
static short temp;

for (i = 0; i < length; i+=2){


temp = sineGen(sineObj);
inbuf[i] = (inbuf[i]) + (temp>>4);
inbuf[i+1] = (inbuf[i+1]) + (temp>>4);
}
}

// ================ SINE_add ===================


// agrega la onda senoidal al búfer indicado
void SINE_add(SINE_Obj *sineObj, short *inbuf, int length)
{
int i = 0;
short temp;

for(i = 0; i < length; i++){


temp = sineGen(sineObj);
inbuf[i] = (inbuf[i]) + (temp>>4);
}
}

// ================ sineGen ===================

Sergio Domínguez Sánchez 15


INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA
CAMPUS ZACATECAS

PRACTICAS DE LABORATORIO DE PROCESADOR DIGITAL DE SEÑALES.


// Genera un solo valor de onda seno
static short sineGen(SINE_Obj *sineObj)
{
float result; if(sineObj->count > 0){
sineObj->count = sineObj->count -1;
}
else {
sineObj->a = sineObj->aInitVal;
sineObj->b = sineObj->bInitVal;
sineObj->y0 = sineObj->y0InitVal;
sineObj->y1 = sineObj->y1InitVal;
sineObj->y2 = sineObj->y2InitVal;
sineObj->count = sineObj->countInitVal;
}

sineObj->y0 = (sineObj->a * sineObj->y1) + (sineObj->b * sineObj->y2);


sineObj->y2 = sineObj->y1;
sineObj->y1 = sineObj->y0;

//Para escala completa de rango 16-bit se multiplicará por y[0]


// por 32768 usando un número ligeramente más pequeño que esto
// (como 28000) para prevenir overflow.
result = sineObj->y0 * 28000;

return((short)result);
}

// ================ degreesToRadiansF ===================


// Convertir a un numero punto flotante de grados a radianes
static float degreesToRadiansF(float d)
{
return(d * PI / 180);
}

// ================ copyData ===================


// copiar datos de un búfer a otro.
void copyData(short *inbuf, short *outbuf ,int length)
{
int i=0;

for (i=0; i<length; i++){


outbuf[i] = inbuf[i];
}
}

Sergio Domínguez Sánchez 16

You might also like