# Punto fijo en ensamblador y fourier... quien le entra?



## antiworldx (Feb 6, 2010)

Cuando en algun punto de tu vida, creas algo y contestas dos o tres preguntas, sientes que ya sabes mucho... pero la verdad es que entre mas aprendes, menos sabes, y en mi caso, aprendi algo nuevo pero tengo mas dudas que respuestas... Bueno este rollo era nomas por platicar algo. 

Ahora si el tema de lleno:
El asunto es este, estoy manejando la transformada Z en un dspic. Mi problema no es la transformada Z, ni el dspic, mi problema es... el punto fijo.

He buscado por internet, y no pasan de explicar el complemento a1 y a2, y que el punto fijo es una extension de las operaciones enteras... pero, exactamente como se comporta en la multiplicacion? en la suma? como voy a interpretar los resultados de un numero binario, por medio de las banderas?
En palabras mas concretas y vanales... Exactamente como se hace una operacion con punto fijo? y hablo desde nivel binario y en la practica. Porque eso si, explicaciones matematicas y explicaciones teoricas hay mucho, pero nada implementado. 

Ojo, no pido que me hagan el trabajo... por su puesto que no, simplemente quiero saber como se implementa en la practica para comprenderlo e implementarlo ahora si a mi transformada Z.

Gracias.


----------



## Dr. Zoidberg (Feb 6, 2010)

Yo he programado controladores PID para motores de CC con mando directo y tuve que usar aritmética de punto fijo (fué en 1994!) para poder muestrear por debajo de los 500us usando un microcontrolador 80C196KB de Intel, así que me acuerdo de la historia. Te cuento mas o menos como es:

Yo usaba palabras de 32 bits para almacenar numeros de punto fijo. En esos 32 bits, los 24 mas significativos eran la parte entera y los 8 menos significativos era la parte decimal. De esta manera  yo podía representar numeros decimales con un valor mínimo de 1/256, lo que era sufuciente para mis necesidades.
Bueno, partiendo de esta estructura en 32 bits, para la suma y la resta no hay ningún problema. Se suma y se resta como si fueran números enteros, solo que en el resultado, los 8 bits menos significativos son la parte decimal.
Para la multiplicación es un poco más de lío, por que hay que multiplicar a plena precisión (32 bits X 32 bits = 64 bits) y luego ajustar el resultado al campo de representación.
Para la división es parecido, pero esa tenía una triquiñuela que no recuerdo ahora con el tema de los restos. Si encuentro la implementación que hice te la paso para que la veas, pero no es nada que con un poco de meditación no puedas obtener.

PD: Ese microcontrolador tenía operaciones para multiplicación y división en enteros, así que eso no era problema. SI tu CPU no las tiene...hay que trabajar un poco mas.


----------



## antiworldx (Feb 6, 2010)

Afortunadamente el dsPic viene bastante completo, incluso trae banderas de sobreflujo y otras monerias para punto fijo... el detalle es que no comprendo perfectamente la mecanica del punto fijo con multiplicaciones y divisiiones.
Efectivamente lo que me comentas... hasta ahi lo entiendo perfectamente, pero como dices, en la multiplicacion es mas lío. Ahi es donde especificamente me agradaria ver en tu caso como lo manejas.

Gracias.


----------



## Dr. Zoidberg (Feb 6, 2010)

La división tengo que verificarlo, pero la multiplicación es simple:
Cuando multipliques dos numeros de 32 bits (en el formato que te dije antes), el resultado que vas a obtener es de 64 bits, con los 16 menos significativos como parte decimal y los 48 mas significativos como parte entera. Sin embargo, el formato original tiene la mitad de esos tamaño como campo de representación para la parte decimal y la entera, así que hay que "serruchar" el resultado obtenido. De la parte decimal tenes que eliminar (truncar) los 8 bits menos significativos. De los 48 bits de la parte entera tenes que eliminar los 24 bits superiores, con lo que el resultado final te queda en 32 bits como debería ser.
El problema es si tenés un overflow en la multiplicación, pero detectarlo es simple, ya que los 24 bits que vas a eliminar deben ser todos 0's o todos 1's, dependiendo si el resultado es positivo o negativo. Cualquier valor diferente de estos significa que la multiplicación se te pasó del campo de representación (aunque hay otros casos que considerar) y tenés que indicar el overflow de alguna forma para gestionar el error.

De todas formas, si vas a usar PICs, estoy seguro de haber visto en la web hace bastante tiempo un proyecto de alguien que calculaba la FFT en un PIC usando aritmética de punto fijo y te daba disponibles para bajar las bibliotecas que había implementado. Lamentablemente eso lo ví en el 2005, así que no tengo idea donde puede estar ese link. Creo que la referencia a esa biblioteca estaba en el foro de www.hardcore-modding.com, en un tema relacionado con un hombre que quería hacer un osciloscopio digital.

Y si nó, acá hay bastante para ver:
http://www.google.com.ar/search?q=fixed+point+pic+library


----------



## antiworldx (Feb 12, 2010)

Bueno, ya resolvi el problema del punto fijo y la señal... ahora tengo otro problema... genere una tabla en memoria de programa de la siguiente forma...

coheficientes:
.hword 0x012f,etc etc...

Ahora, mi problema es que no se como obtener la direccion efectiva para asi leer los datos con un apuntador Wreg, ya lei y busque en la ayuda y google y en todopic.com y usan otra forma para el pic 18 y familia, pero no para el dspic.

sugerencias?


----------



## antiworldx (Feb 14, 2010)

Problema resuelto, gracias por la ayuda. 

Gracias ezavalla, ya supe como hacer sumas y multiplicaciones con punto fijo y signo.


----------

