Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DE MORELIA
SECRETARIA DE EDUCACIÓN
PÚBLICA
ASIGNATURA:
PROCESAMIENTO DE SEÑALES
PRESENTAN:
DOCENTE:
Dra. ADRIANA DEL CARMEN TÉLLEZ ANGUIANO
Como se sabe la FFT (abreviatura usual para el idioma ingles) es un algoritmo que nos
ayudara a calcular esta transformada rápida, la cual tiene variedad de aplicaciones, que
van desde un tratamiento de señales digitales y un filtrado digital hasta para resolución de
ecuaciones en derivadas parciales o los algoritmos de multiplicación rápida de grandes
enteros. Este método es eficaz y de importancia para el análisis matemático. Sus
aplicaciones son múltiples además de que puede facilitar el uso de algoritmos. Para el
caso de la transformada rápida de Fourier se implementará en el programa del
microcontrolador el proceso para el cálculo de ocho puntos que se describió
anteriormente en clase.
OBEJETIVO DE LA PRÁCTICA
MARCO TEÓRICO
Obsérvese, que se realizó el diezmado de la secuencia x[n], una vez. La DFT de N puntos
puede expresarse ahora en términos de las DFT´s de las secuencias diezmadas como
sigue:
Pero . Sustituyendo esta igualdad en la expresión anterior se tiene:
Por otro lado, se cumple que por lo que se puede escribir la siguiente
expresión sustituyendo en la anterior.
Tabla de comparación entre la cantidad de multiplicaciones complejas a realizar por parte de la DFT y el
algoritmo FFT de base de base 2.
Algoritmo para la FFT de diezmado en tiempo para 8 puntos, utilizado en esta practica.
Como puede observarse, el cálculo que se realiza en cada etapa, el cual consiste en
aplicar las operaciones de una transformada DFT de dos puntos o “mariposa”. En general
cada mariposa implica una multiplicación y dos sumas complejas. Para N puntos,
tenemos N/2 mariposas por cada etapa del proceso y log2 N etapas de mariposas.
Esto es haciendo que cada tecla genere un voltaje distinto para diferenciarla de otra tecla.
Inclusive es la forma en que muchos aparatos electrodomésticos funcionan como los
estéreos de casa que tienen muchas teclas, hacen que cada tecla genere un voltaje
distinto.
Teóricamente si tenemos un ADC de 8 bits podríamos tener hasta 256 teclas, pero en
la práctica no es posible porque las resistencias tienen tolerancias y hay que separar
cada tecla en un voltaje para diferenciar entre cada tecla.
Para tener una idea supongamos que 4 resistencias son de 1Kohm, pero lo importante es
que si las 4 resistencias son iguales el voltaje que habrá en los extremos de la resistencia
serán: 1.25, 2.5, 3.75 y 5 volts. Entonces si se presiona el B0 Vg=1.25V, si se presiona B1
Vg=2.5, B2 Vg=3.75 y B4=5 volts. Ese Vg es el que aplicamos al pin del ADC del
microcontrolador.
Figura 1. Teclado ADC.
Pero si no se presiona ninguna tecla ¿qué voltaje habrá en Vg? Sería cero, pero resulta
que en el ADC el pin quedará flotado porque no está conectado a ningún potencial, así
que el ADC medirá ruido, así que tenemos que modificar el circuito para fijar el ADC a un
potencial de cero cuando no se presione ninguna tecla, figura 2.
Se aprecia que el Vadc=0 cuando no se presione ninguna tecla porque está fijado a cero
a través de la resistencia de pull down.
Vemos que al ser grande esa resistencia de 100Kohms su efecto sobre las resistencias
del divisor disminuye, si fuera muy pequeña su efecto modificaría las resistencias del
divisor y por lo tanto sus voltajes. Así que despreciaremos el efecto de carga de esa
resistencia y consideraremos que los voltajes generados son 1.25, 2.5, 3.75 y 5 volts. Si
se colocan más teclas y más resistencias probablemente si requiera ver los voltajes que
se generarían considerando el efecto de la resistencia de pull down.
Cuando se presiona la tecla B1 se coloca en paralelo las dos resistencias de 1Kohm con
la de 100 Kohm, así que el voltaje en la segunda resistencia no es de 2.5 Volts sino de
2.47 Volts, vemos que el efecto en el voltaje no es muy grande, así que lo seguiremos
considerando de 2.5 volts.
Vamos a suponer que tiene una red de 100 teclas y 100 resistores de 1Kohm y se
presiona la última tecla, la resistencia equivalente sería 100Kohm en paralelo con 100
resistores de 1 Kohm=50 Kohms, en lugar de 100 kohms, así que cuando hay muchas
teclas y resistores el efecto de carga se va haciendo más grande y deberá calcular los
voltajes generados cuando se presione la tecla, pero en el caso de pocas teclas no
influiría el efecto de esa resistencia.
Ahora bien, supongamos que usamos el ADC en 8 bits y el Vref = 5 volts así que el
valor en cuentas es el que se muestra:
Pero sabemos que las resistencias no son exactas así que colocamos un rango de
holgura, vea que entre tecla y tecla hay aproximadamente 64 cuentas de diferencia.
Entonces podemos hacer que el rango para detectar la tecla sean 32 cuentas hacia arriba
y 32 hacia abajo del valor calculado por si la resistencia real es más grande o más
pequeña por la tolerancia.
Tecla presionada Voltaje generado Valor en cuentas
B0 1.25 32 a 96
B1 2.5 97 a 159
B2 3.75 160 a 223
B3 5 Mayor a 223
Considere que el valor en cuentas, son los valores que el microcontrolador leerá para
hacer el conteo del botón presionado, de esta manera podemos tener el teclado usando el
ADC del micro, sin gastar más que un pin del mismo. Con ello simplemente tendríamos
que agregar mas resistencias y botones a la entrada del micro, para tener un teclado mas
amplio sin necesidad de usar mas puertos como entrada.
Principales características
PANTALLA LCD.
Una pantalla de cristal líquido o LCD (sigla del inglés liquid crystal display) es una
pantalla delgada y plana formada por un número de píxeles en color o monocromos
colocados delante de una fuente de luz o reflectora. A menudo se utiliza en dispositivos
electrónicos de pilas, ya que utiliza cantidades muy pequeñas de energía eléctrica.
La mayoría de las pantallas LCD vienen unidas a una placa de circuito y poseen pines de
entrada/salida de datos.
Estas pantallas constan de 16 pines. De izquierda a derecha, sus usos son los siguientes:
Pin 5 – Lectura/Escritura. Dependiendo del estado (HIGH o LOW), se podrá escribir o leer
datos en el LCD
Pin 7 hasta Pin 14 – Son los pines de datos por donde se envía o recibe información.
Las teclas van de 0-9 empezando pos las tres primeras de derecha a izquierda y asi
sucesivamente hasta llegar a la superior en la parte alta. En la imagen se puede ver como
ha sido presionada la tecla 4 que se ve representada en la pantalla.
El código empleado para programar el microcontrolador es el que se muestra a
continuación:
PORTB=0x00;
#include <stdlib.h> DDRB=0x00;
#include <mega168.h>
#include <delay.h> // Port C initialization
#include <math.h> // Func6=In Func5=In Func4=In Func3=In Func2=In
intval,tecla,cont; Func1=In Func0=In
signed char x0, x1, x2, x3, x4, x5, x6, x7; // State6=T State5=T State4=T State3=T State2=T
signed char aa,bb,cc,dd,ee,ff,gg,hh,A,B,C,D,E,F,G,H; State1=T State0=T
float result[8][2]; PORTC=0x00;
DDRC=0x00;
float valor;
signed int dato,centenas,decenas,unidades,M,P,Q; // Port D initialization
unsigned char i,j; // Func7=In Func6=In Func5=In Func4=In Func3=In
Func2=In Func1=In Func0=In
// Alphanumeric LCD functions // State7=T State6=T State5=T State4=T State3=T
#include <alcd.h> State2=T State1=T State0=T
PORTD=0x00;
#define ADC_VREF_TYPE 0x60 DDRD=0x00;
if(cont==6) result[1][0]=((F*0.7071)+(bb));
{
x5=tecla; result[1][1]=(-1)*(((0.7071*hh)+(0.7071*ff))+(dd));
lcd_gotoxy(0,1);
lcd_puts(" X5= "); result[2][0]=C;
lcd_putchar(x5+48); result[2][1]=((-1)*(G));
delay_ms(100);
} result[3][0]=((-0.7071*ff)-(-0.7071*hh))+(bb);
result[3][1]=((1)*(dd))+(H*-0.7071);
if(cont==7)
{ result[4][0]=((-1)*(E))+(A);
x6=tecla;
lcd_gotoxy(0,1);
lcd_puts(" X6= "); result[5][0]=((-0.7071*ff)-(-0.7071*hh))+(bb);
lcd_putchar(x6+48); result[5][1]=(-1)*((dd)+(H*-0.7071));
delay_ms(100);
} result[6][0]=C;
result[6][1]=G;
if(dato<0)//se descompone muestra para desplegarla,
result[7][0]=((F*0.7071)+(bb)); en caso de ser negativa
{
result[7][1]=((0.7071*hh)+(0.7071*ff))+(dd); dato=(dato*(-1));
centenas=(dato/10000); //se descompone la muestra
//********************DESPLIEGUE DE para desplegarla en caso de ser positiva
MUESTRAS EN LCD*********************** decenas=((dato-(centenas*10000))/1000);
// unidades=((dato-(centenas*10000)-
for(i=0;i<=7;i++)//se escoge extrae la muestra (decenas*1000))/100);
correspondiente del arreglo M=((dato-(centenas*10000)-(decenas*1000)-
{ (unidades*100))/10);
result[i]; P=(dato-(centenas*10000)-(decenas*1000)-
lcd_gotoxy(2,0); (unidades*100)-(M*10));
lcd_puts("X"); lcd_puts("-");
lcd_putchar(i+0x30); lcd_putchar(centenas+0x30);
lcd_puts(" "); lcd_putchar(decenas+0x30);
for(j=0;j<=1;j++)//de cada muestra se despliega su lcd_puts(".");
parte real y despues la parte imaginaria lcd_putchar(unidades+0x30);
{ lcd_putchar(M+0x30);
valor=result[i][j];// lcd_putchar(P+0x30);
dato=(valor*1000);
lcd_gotoxy(11,0);//indicadores en la lcd
if(dato>0) lcd_puts("real");
{ lcd_gotoxy(11,1);
centenas=(dato/10000); //se descompone la muestra lcd_puts("imagin");
para desplegarla en caso de ser positiva }
decenas=((dato-(centenas*10000))/1000); lcd_gotoxy(3,1); //se cambia de renglon en la lcd para
unidades=((dato-(centenas*10000)- desplegar la parte imaginaria
(decenas*1000))/100); }valor=read_adc(0);
M=((dato-(centenas*10000)-(decenas*1000)- delay_ms(500);
(unidades*100))/10); if(valor>=254)
P=(dato-(centenas*10000)-(decenas*1000)- {
(unidades*100)-(M*10)); cont=0;
lcd_putchar(centenas+0x30); lcd_clear();
lcd_putchar(decenas+0x30); }
lcd_puts("."); }
lcd_putchar(unidades+0x30); delay_ms(500);//retardo para apreciar los despliegues
lcd_putchar(M+0x30); correspondientes en la lcd
lcd_putchar(P+0x30); lcd_clear();//borrado de pantalla para desplegar un
nuevo par de datos en la lcd
lcd_gotoxy(11,0);//indicadores en la lcd }
lcd_puts("real"); }
lcd_gotoxy(11,1); }
lcd_puts("imagin"); }
}
Las muestras son capturadas por medio del ADC y guardadas en variables las cuales son
utilizadas para hacer las cuentas necesarias y los resultados se fueron guardando en un
vector de 8 x 2, para después desplegar los resultados en pantalla uno por uno, para
cuando el valor del punto de la transformada es menor a 0 se multiplica el valor por -1 y al
final solo se pinta el signo “-“ en la posición correspondiente, en el caso de ser positivo el
valor se queda igual.
Esta práctica resulto algo laboriosa ya que se tuvo que analizar detalladamente como es
que se realiza la transformada rápida de Fourier y cuáles son las operaciones en las
cuales solo es el conjugado de otra operación. La transformada Rápida de Fourierpara
este caso se implementó a 8 puntos. Por falta de tiempo solo se pudo hacer que el
programa aceptará valores mayores a cero y que mostrara en pantalla tres decimales.
Lo más difícil que se presento fue tratar de hacer funcionar el teclado donde el usuario
introducía los valores imaginados, al elegir un teclado por medio de ADC se facilitó un
poco su implementación pero se tuvo en ocasiones errores en cuanto al valor que tomaba
el ADC. Se utilizó un ADC con una resolución de 8 bits obteniendo valores de 0 a 256 los
cuales se peticionaron para que por medio de condiciones obtuviéramos el valor
introducido.
En la pantalla LCD se muestran los valores uno a uno esperando durante cada valor para
que pueda ser visualizado.