Você está na página 1de 12

UNIVERSIDAD TCNICA FEDERICO SANTA MARA

DEPARTAMENTO DE ELECTRNICA

LECTURA 4
REPRESENTACIN DE NMEROS EN PUNTO FIJO Y FLOTANTE.

CURSO SIGLA PROFESOR AYUDANTE

LABORATORIO DE PROCESAMIENTO DIGITAL DE SEALES ELO385 RODRIGO HUERTA CORTS ALEJANDRO HERRERA

Valparaso, 14 de Abril de 2003

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

INTRODUCCIN
En esta lectura consideraremos la representacin de nmeros para clculos digitales. La principal caracterstica de la aritmtica de digital es el nmero limitado (generalmente fijo) de dgitos usados para representar los nmeros. Esta restriccin lleva a que la precisin numrica sea finita, y con ello los clculos, creando as, problemas de redondeo y efectos no lineales en el funcionamiento de los algoritmos implementados. Un ejemplo clsico de problemas de representacin finita se da en los filtros IIR de alto orden. En ellos un coeficiente podra ser cuantificado o redondeado de forma tal que quedara fuera de la circunferencia unitaria, haciendo que se inestabilice. La representacin de nmeros en un formato de punto fijo es una generalizacin de la familiar representacin decimal de un nmero como una cadena de dgitos con un punto decimal. En esta notacin, los dgitos a la izquierda del punto representan la parte entera del nmero, y los dgitos a la derecha del punto decimal, representan la parte fraccional del nmero. Las secciones siguientes entregan una introduccin a la representacin de nmeros decimales tanto en representacin de punto fijo como en representacin de punto flotante. Adems se entregan algunas consideraciones necesarias para trabajar correctamente con el codec de la tarjeta DSK TMS320C6711.

RHC-2003

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

1 REPRESENTACIN DE NMEROS EN PUNTO FIJO 1.1 REPRESENTACIN EN COMPLEMENTO 1


Complemento 1 es una forma particular de representar nmeros positivos y negativos. Su forma es simple y bastante directa de entender. Todo nmero positivo posee su bit ms significativo igual a 0. Los nmeros negativos se obtienen con slo negar (o complementar) el nmero positivo correspondiente. Un ejemplo para el caso de tres bits es mostrado en la tabla 1.
Tabla 1: Nmeros binarios en complemento 1

000 001 010 011

0 1 2 3

111 0 110 1 101 2 100 3

De la tabla anterior se puede observar que el nmero 0 posee dos formas distintas de representacin. Ello ha llevado a problemas con la comparacin por cero en algoritmos, por lo cual este tipo de representacin no es utilizado. El trmino complemento 1 se debe a que el nmero negativo se obtiene slo complementando el patrn de bits del nmero positivo que se quiere pasar a negativo.

1.2 REPRESENTACIN EN COMPLEMENTO 2


La representacin en complemento 2 es una forma eficiente de representar nmeros con signo en microprocesadores de punto fijo. La propiedad fundamental de este formato es que permite representar nmeros negativos, por lo cual se utiliza el bit ms significativo de la palabra binaria que se est manejando. Esto lleva a que en un formato de palabra de n bits, la capacidad de representacin sea de hasta 2 n 1 1 para nmeros positivos y 2 n 1 negativos. El bit de signo ser siempre el ms significativo. La figura 1 muestra un esquema para n bits.

Fig.1: Palabra de n bits: S: bit de signo, b: bits que representan un nmero

Con la forma de representacin antes mostrada los nmeros positivos tendrn el bit ms significativo igual a 0. Si es un nmero negativo ste bit ser 1. Un nmero positivo escrito en complemento 2 tendr la misma representacin que su equivalente en un formato sin signo (claro que el bit ms significativo deber ser 0). Por otro lado, un nmero negativo escrito en complemento 2 no tiene un equivalente directo en un formato sin signo. Esto quiere decir que con slo agregar un 1 al bit ms significativo de un nmero positivo no se logra representar un nmero negativo. RHC-2003
3

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

Para llegar a un nmero negativo en complemento 2 es necesario realizar las operaciones siguientes: al nmero positivo que se quiere convertir a negativo se le debe representar en formato binario, luego complementar cada bit (pasar los 1s a 0s y viceversa) y finalmente sumar 1. La tabla siguiente muestra un ejemplo para el caso de tres bits.
Tabla 2: Nmeros binarios de 3 bits en complemento 2

N Positivo 1 = 001 2 = 010 3 = 011 4 = 100

110 101 100 011

110 + 1 101 + 1 100 + 1 011 + 1

N Negativo 111 = 1 110 = 2 101 = 3 100 = 4

Nota: en la tabla anterior el nmero 100b no representa 4 sino que 4. Esto se debe a que el bit ms significativo es 1. Ello lleva a que siempre exista un nmero negativo ms que positivo.

Si se piensa en un nmero de 16 bits (como es el caso de la palabra binaria del codec de la tarjeta DSK TMS320C6711) el rango de nmeros a representar es de: [-32768 : 32767]. La tabla 3 resume los rangos mximos que se pueden manejar con distintos tipos de largo de palabra.
Tabla 3: Rangos de representacin para diferentes largo de palabra.

n 8 16 24 32

Min 128 32.768 8.388.608 2.147.483.648

Max 127 32.767 8.388.608 2.147.483.648

Para calcular el nmero decimal que se est representando en forma binaria se puede utilizar (1), refirindose a la figura 1: x = s 2 n1 + bk 2 k
k =0 n 2

(1)

donde cada factor bk es 0 1

1.3 REPRESENTACIN FRACCIONARIA DE NMEROS EN FORMATO DE PUNTO FIJO


Hasta ahora se ha visto que un nmero en representacin binaria puede ser interpretado como positivo o negativo. Sin embargo, en punto fijo es necesario poder operar con nmeros fraccionarios tambin. Para ello es posible utilizar una forma muy simple de representacin.

RHC-2003

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

1.3.1

FORMATO NUMRICO DIGITAL QM.N (QN)

En un formato Qm.n se utilizan m bits para representar en complemento 2 la parte entera de un nmero y n bits para representar en complemento 2 la parte fraccionaria. Son necesarios m + n + 1 bits para almacenar un nmero en formato Qm.n. El bit extra es usado para almacenar, en la posicin ms significativa, el signo del nmero. El rango entero representable es (2m, 2m2n) con una resolucin de 2-n. Para el caso de un sistema digital de 16 bits y su uso con una representacin numrica con de formato Q4.12, o Q12, se utilizan 3 bits para representar nmeros enteros, 12 para decimales y 1 bit de signo. S E E E d d d d d d d d d d d d (2)

La resolucin del formato es: 1 = 0.000244140625 212 (3)

La correspondencia entre la magnitud interpretada y el valor de 16 bit almacenado en el DSP es la siguiente:

( 8 : 7.99975585938) ( 32768 : 32767 )


o en formato hexadecimal

(4)

( 8 : 7.99975585938) ( 8000 : 7 FFFh )


Grficamente lo anterior es representado en la figura 2 de la siguiente manera:

(5)

Figura 2. Correspondencia entre valores decimales y enteros para representacin digital. En formato Q12.

Reglas para la operacin con nmeros en este tipo de notacin: 1.- Suma de cantidades con m bits decimales Qm + Qm = Qm (6)

RHC-2003

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

2.- Multiplicacin de cantidades con m y n bits decimales

Qm Qn = Qm + n

(7)

Por ejemplo, la multiplicacin de 2 nmeros en formato Q12 se obtiene de la siguiente forma:

Figura 3. Multiplicacin de nmeros en formato Q12.

Dado que la multiplicacin suma el nmero de cifras decimales, el resultado puede y debe ser truncado para poder representarlo en los 16 bits de un DSP. Los 12 primeros bits, los menos significativos, se eliminan quedando slo los 16 bits ms significativos que representan el resultado de la multiplicacin. Cabe destacar que todo procesador con una unidad independiente de multiplicacin posee un registro de 2n bits para almacenar el resultado de una operacin. Adems algunos incluyen 1 o hasta 3 bits extra para manejar posibles overflow. Se debe tener especial cuidado con la multiplicacin, ya que es fcil que ocurran overflow debido a la operacin con nmeros grandes, por ejemplo:

Figura 4: Problemas de representacin luego de una operacin de multiplicacin.

En la figura 4, el resultado Q12 es errneo, mientras que el resultado Q8 no es del todo preciso. Esto se debe a que el resultado no es representable en el formato Q12. Por ello es importante tener claro el tipo de cantidades que se operan y los rangos que stas ocupan. El resultado en Q8 es impreciso por la cantidad de bits decimales que actan como cifras significativas que ste puede representar (2-8 = 0,00390625). A modo de ejemplo de la necesidad de tener en cuenta que se est trabajando con nmeros de punto fijo, observe el siguiente extracto de cdigo. En l se han definido variables de tipo short para la lectura de datos (desde el codec) y los coeficientes del filtro FIR tambin son de tipo short. Sin embargo, la variable yn, que almacena el resultado de la multiplicacin y acumulacin, es de tipo integer (32 bits).

RHC-2003

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

int yn = 0; short dly[N]; short h[N]; interrupt void c_int11() { short i; dly[0] = input_sample(); yn = 0; for (i = 0; i< N; i++) yn +=(h[i]*dly[i]); for (i = N-1; i > 0; i--) dly[i] = dly[i-1]; output_sample(yn >> 15); return; }

Declaracin de variables Inicio de rutina de interrupcin Lectura de dato desde codec Multiplicacin y acumulacin Corrimiento de datos en buffer Eliminacin por corrimiento de los bits de precisin y posterior envo al codec. Retorno de la interrupcin

Cada vez que se multiplican dos variables de tipo short es necesario un buffer o variable de almacenamiento, 32 bits para este caso. Al final de la operacin de multiplicacin y acumulacin caracterstica de los filtros FIR se toma el resultado obtenido y se corre en 15 posiciones para slo entregar los bits ms significativos del resultado. Notar que el programador sabe que el manejo de los datos fue hecho en formato Q15 y de ah que el resultado de la multiplicacin sea corrido en 15 posiciones a la derecha. El resto es ignorado ya que slo representan bits de precisin que para el caso no son tiles.

2 REPRESENTACIN DE NMEROS EN PUNTO FLOTANTE


La representacin en punto flotante posee una gran ventaja sobre los nmeros de punto fijo: escalar las variables no es una preocupacin. Un nmero de punto flotante puede ser representado usando precisin simple (SP) con 32 bits, o doble precisin (DP) con 64 bits, cmo se muestra en la figura 5(a). En un formato de precisin simple, el bit 31 es el signo, los bits 30 al 23 representan el exponente y los bits 22 al 0 representan los bits decimales. Nmeros tan grandes como 10-38 y tan grandes como 10+38 pueden ser representados. En formato de precisin doble, ms bit para el exponente y los decimales estn disponibles, como se muestra en la figura 5(b). Un flotante de 64 bits debe ser formado a partir de dos registros de 32 bits. El primer registro con sus bits 31 al 0 son slo para decimales, los bits 19 al 0 del segundo registro tambin son para decimales, posiciones 30 a la 20 se utilizan para exponente y el bit de signo est en la posicin 31, siempre del segundo registro. Como resultado, nmeros tan pequeos como 10-308 y tan grandes como 10+308 pueden ser representados.

RHC-2003

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

Figura 5: Formato de tipos flotantes

3 CONSIDERACIONES NECESARIAS PARA TRABAJAR CON EL CODEC TARJETA DSK

EN LA

Como fue visto en la experiencia 2, el CODEC TLC320AD535 trabaja con un formato numrico de 16 bit. Esto presenta ciertas dificultades que deben ser observadas al momento de leer datos y escribir datos desde y hacia el CODEC. 3.1 LECTURA DE DATOS Cada vez que el CODEC realiza una conversin A/D el resultado es enviado al DSP, donde es tomado desde el puerto serial y dispuesto en una variable. Es este momento donde se debe tener claro qu es lo que se desea hacer. Primero es necesario tener en cuenta qu tipo de variable fsica se est leyendo. En trminos generales, el CODEC slo realiza conversiones A/D y entrega su resultado en un formato complemento 2, lo cual significa que enva valores que pueden ser interpretados como nmeros positivos o negativos. Ello dice que el valor ledo desde el codec debiera ser almacenado en un tipo de variable que contemple el signo. Una buena eleccin es un tipo integer (int). Ahora bien, si se asigna a una variable de tipo int se deber tener en cuenta que el dato de 16 bit que entreg el CODEC ahora es de 32 bits, por lo cual la nueva variable tendr un largo de palabra de 32 bit con los 16 bits superiores llenos de ceros. Algo similar ocurre cuando la variable utilizada es de tipo flotante (float). Ello hace que la variable float almacene el signo y la magnitud que posee el dato enviado por el CODEC. Recordar que el rango de salida de los datos del CODEC es (-32768 : 32767). 3.2 MANEJO DE DATOS A raz de la lectura de datos se deben tener en cuenta una serie de consideraciones que eviten problemas a la hora de empezar a manejar y operar los datos adquiridos. Pero cul es el problema con todo lo anterior? Suponga que desea hacer un algoritmo que cree una seal AM a partir de una portadora generada con un oscilador digital y una seal modulante proveniente del CODEC. Una seal modulada en amplitud tiene una forma general dada por (8). S (t ) = Ac [1 + mf (t )]cos( wc t ) donde f (t ) | 1 | es la seal modulante adquirida desde el CODEC. RHC-2003
8

(8)

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

Es claro que si el CODEC justo realiz una conversin que arroj un nmero grande como por ejemplo 12.389, la suma con 1 no tendr sentido. Una condicin necesaria es que la funcin o seal f(t) est en el rango [1 y 1]. Ello implica un necesario escalamiento de la variable antes de ser operada; y ms an, conocer y entender la naturaleza de los datos que estn siendo manejados y operados para as asociar correctamente la variable fsica medida con su manejo digital dentro del procesador. Por otro lado, si se quiere manejar nmeros fraccionarios, lo ms simple es primero transformar la variable que contiene el dato adquirido a un tipo que resista fracciones. Recordar que un tipo entero no puede manejarlas. El siguiente cdigo ejemplifica la transformacin y posterior escalamiento utilizando tipos flotantes: Float a, c; Main { a = (float) McBSP_read( ); a = a / 32767; ... c = 1.43 * a; ... ... }

Cast de integer a flotante. Escalamiento al rango [-1:1] Operacin en nmeros flotantes

La arquitectura del DSP TMS320C6711 est diseada para operar a nivel de hardware con nmeros flotantes (de hecho, puede realizar hasta 900 MFLOPS @ 150MHz clock) por lo que operaciones con nmeros flotantes no implica introducir extensos cdigos que manejen tipos flotantes a partir de una arquitectura de punto fijo (notar que ello lo realiza el compilador y es prcticamente transparente para el programador). Sin perjuicio de lo anterior, es posible operar todo en tipo integer o short. Esto obliga a tener especiales cuidados en el manejo de los datos. Un tipo integer necesariamente deber ser manejado teniendo en cuenta que las operaciones matemticas como multiplicaciones devuelven resultados de 2n bits cuando los dos operandos son de n bits. Los nmeros fraccionarios no son representables ni en los tipos integer ni short, por lo cual deben ser traspasados a algn formato Q e interpretados de acuerdo a ello. Una consideracin necesaria es no sumar nmeros en distinto formato Q ya que no tendr sentido su resultado. Ello no ocurre con la multiplicacin que, como fue visto anteriormente, entregar un nmero con m+n bits decimales. De acuerdo al corrimiento efectuado ser el formato del resultado final. 3.3 ESCRITURA DE DATOS Una vez que ya se cuenta con el dato necesario para ser enviado al CODEC (o a algn tipo de conversor D/A) se debe llevar a un formato numrico de 16 bits. El compilador utilizado asigna a un tipo short 16 bits, por lo cual es necesario, si se ha trabajado con tipos float o int, realizar un cast. Cuando se trabaja con nmeros dentro del rango [-1:1) se deber RHC-2003
9

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

amplificar el dato antes de realizar el cast. Eso es necesario ya que si no se hace en ese orden se perder precisin. Por ejemplo: Suponga una variable de tipo float con un valor de 0,85. Cada vez que se haga un cast a tipo short para enviar el dato por el codec el valor asignado a la variable short ser 0 1 segn sea el redondeo propio del nmero por parte del compilador. Lo mismo pasar con cualquier otro valor y adems no se estar utilizando todo el rango de 16 bits para la salida del CODEC. Ello obliga a amplificar los datos procesados para no perder la precisin. 3.4 DOS EJEMPLOS PRCTICOS 3.4.1 OSCILADOR DIGITAL DE 1 KHZ UTILIZANDO TIPO SHORT Y FORMATO Q14.

Sea (9) la ecuacin de diferencias para un oscilador digital. y (n) = Ay (n 1) y (n 2) (9)

1000 La constante A para una oscilacin de 1 KHz ser: A = 2 cos 2 = 0.7071 . Segn se 8000 vio en la seccin 1.3.1, los nmeros decimales, y en particular aquellos menores de 1, no son representables en punto fijo en forma directa. Para este caso se escogi un formato Q14. Este permite que una buena cantidad de decimales sean representados y evitar el riesgo de overflow en las multiplicaciones. El nuevo valor de A en la representacin Q14 es: A = 0.7071 214 = 11585 . Observar el cdigo siguiente: short y[3] = {0,11585,0}; const short A = 11585; int n = 2; Declaracin de variables y asignacin de condiciones iniciales

Inicio de rutina de interrupcin que calcula el interrupt void c_int11() tono de 1[KHz] { y[n] = (((int)A*(int)y[n-1])>>14) - Algoritmo de ecuaciones de diferencia. Multiplicacin e inmediato corrimiento y[n-2]; y[n-2] = y[n-1]; Salida del dato calculado a travs del codec. y[n-1] = y[n]; Notar que no se escala output_sample(y[n]); return; } Inicializacin de codec y McBSP Loop infinito void main() { comm_intr(); while(1); } RHC-2003
10

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

Observar que en la multiplicacin de las variables A e y[n-a] se ha realizado previamente un cast y luego se ha corrido en 14 posiciones el resultado. Recordar que multiplicar 2 nmeros en formato Q14 entrega un nmero en formato Q28, y para volver al formato original se deben eliminar los bits menos significativos del resultado. Este tipo de consideraciones se deben tener presente al momento de escoger tanto una plataforma de desarrollo como el tipo de datos que se usarn para la implementacin de un algoritmo. 3.4.2 OSCILADOR DIGITAL DE 1 KHZ UTILIZANDO TIPO FLOAT

Esta vez el cdigo es el mismo salvo en los tipos utilizados y la forma de manejar los nmeros y la manera de aplicarlos. Como los nmeros en punto flotante FLOAT pueden representar nmeros decimales, esta vez es posible slo entregar los resultados directamente, vale decir, la variable A = 0.7071 no debe ser escalada y las condiciones iniciales tampoco. Con esto en mente el cdigo queda as: Float y[3] = {0,7071,0}; const float A = 0.7071; int n = 2; interrupt void c_int11() { y[n] = A* y[n-1] - y[n-2]; y[n-2] = y[n-1]; y[n-1] = y[n]; Declaracin de variables condiciones iniciales y asignacin de

Inicio de rutina de interrupcin que calcula el tono de 1[KHz] Algoritmo de ecuaciones de diferencia

output_sample((short)32767*y[n]); Salida del dato calculado a travs del codec, previamente escalado y casteado a tipo short. return; } void main() { comm_intr(); while(1); }

Inicializacin de codec y McBSP Loop infinito

Se observa inmediatamente que el tipo float facilita las cosas cuando se trata de multiplicar o dividir datos, ya que la aritmtica de punto flotante se encarga de realizar todas las operaciones anexas para que los resultados sean los correctos. Notar que para la salida del dato por el codec se requiere el casteo, segn se vio en la seccin 3.3. El valor 32767 no es arbitrario ya que ste se encuentra dentro de representacin de 16 bits contemplando que la mitad es para nmeros negativos y la otra para positivos, en complemento 2. As el rango anlogo que maneja el codec ser completamente cubierto ya que la variable y[n] est en el rango [-1 : 1]. Una mencin especial: El Code Composer puede manejar diferentes opciones de compilacin. Una de ellas permite que las operaciones de punto flotante sean hechas a nivel de hardware, bien con las unidades de punto fijo o con las de punto flotante. Por ejemplo, si no se escoge (configura) que las operaciones de punto flotante se realicen en las unidades RHC-2003
11

Laboratorio de Procesamiento Digital de Seales

Representacin de Nmeros en Punto Fijo y Flotante

del mismo tipo, las multiplicaciones se harn a travs de cdigo almacenado en una biblioteca RTS en vez de hacerla con la instruccin especializada MPYSP.

4 TIPOS DE DATOS
1. Short: 16 bits representados en complemento 2. Rango [-215 : 215-1]. 2. Int o signed int: 32 bits representados en complemento 2. Rango [-231 : 231-1]. 3. Float: representados en formato IEEE de 32 bits. Rango [2-126 = 1.175494 x 10-38 : 2+128 = 3.40282346x10+38]. 4. Double: representados en formato IEEE de 64 bits. Rango [2-1022 = 2.22507385 x 10-308 : 2+1024 = 1.79769313 x 10+308]. Datos de tipo short para operaciones en punto fijo pueden ser ms eficientes (menos ciclos) que los tipos integer.

5 CONSIDERACIONES ESPECIALES
Se debe poner especial atencin al tamao tipo de dato cuando se escribe un cdigo. El compilador C6000 define un tamao para cada tipo de dato (con y sin signo): Tipo de Datos Char short int long float double Cantidad de Bits 8 bits 16 bits 32 bits 40 bits 32 bits 64 bits

Basado en el tamao de cada tipo de dato, es conveniente seguir las siguientes consideraciones al escribir un cdigo: No asumir que los tipos INT y LONG son del mismo tamao porque el compilador C6000 asume un tamao de 40 bits para los tipos LONG. Esto puede aadir instrucciones extra, as como limitar la seleccin de unidades funcionales de hardware. Para multiplicacin de punto fijo usar tipos SHORT cada vez que sea posible ya que este tipo utiliza ms eficientemente el multiplicador de 16 bits (hardware) del procesador (1 ciclo para short * short v/s 5 ciclos para int * int). Usar tipos INT o UNSIGNED INT para contadores en lazos, en vez de tipos SHORT o UNSIGNED SHORT para evitar instrucciones de extensin de signo innecesarias.

RHC-2003

12

Você também pode gostar