domingo, 2 de enero de 2011

bloque raíz cuadrada


Este bloque obtiene la raíz cuadrada de un vector de entrada. La entrada es el vector de 32 bits en punto flotante y la salida es un vector de 32 bits en punto flotante con el resultado de esta operación.

Bloque Suma


Este Bloque realiza la operación de suma de las dos componentes, la componente real y la imaginaria, una vez han sido elevadas al cuadrado. Las entradas del bloque son los dos vectores de 32bits de componente real e imaginaria de la FFT elevados al cuadrado, en representación de punto flotante, que provienen de los bloques que los multiplican por sí mismos. La salida de este bloque es un vector de 32 bits en punto flotante que contiene el resultado de la operación.

Bloque de Multiplicación por sí mismo.

Elevar al cuadrado un número es multiplicar ese número por sí mismo.  Este bloque se ha denominado multiplicación por sí mismo porque es mucho más sencillo y ocupa menos recursos, realizar una implementación que lea dos vectores de entrada, los multiplique y entregue el resultado a la salida, que una implementación que tome únicamente un vector de entrada y lo manipule para elevarlo al cuadrado que es lo mismo que multiplicarlo por el mismo. En este caso los dos vectores de entrada son el mismo vector, de esta forma se ahorra la lógica que adecua el vector para realizar la operación. La entrada de este bloque consiste en dos vectores de 32 bits que contienen el mismo valor en punto flotante y la salida del bloque es un vector de 32 bits en punto flotante con el resultado de la operación.

Bloque de Conversión de Complemento a dos a Punto Flotante (C2-IEEE754).


Desde la señal entregada por parte del ADC, se tiene una representación en complemento a dos para cada muestra, así que para cada entrada de la FFT con N=512, la salida que se obtiene es un par de vectores de 24 bits cada uno en representación de complemento a dos. La conversión de complemento  a dos a representación en punto flotante se realiza debido a que, para obtener la magnitud de la FFT es necesario realizar una serie de operaciones sobre este par de muestras de salida y la representación en complemento a dos no es conveniente para este tipo de operaciones por varias razones, por ejemplo,  porque al elevar al cuadrado cada componente de la FFT, se está elevando al cuadrado un vector de longitud 24 bits, así que se requiere de un vector de 48 bits para almacenar el resultado de esta operación, lo cual es excesivo y dispendioso para el manejo, en cuanto a recursos físicos y en cuanto a lógica a implementar. Además, porque al continuar realizando operaciones con este número de bits se requiere el uso de muchos acumuladores y multiplicadores y una alta exigencia del algoritmo CORDIC (COordinate Rotation DIgital Computer-método de dígito por dígito), lo que resulta en un amplio uso de recursos de la FPGA disminuyendo y hasta anulando la capacidad de esta para realizar otras tareas mucho más importantes, como la FFT. Mientras que la representación en punto flotante siempre va a tener el mismo número de bits y permite realizar operaciones de una manera más cómoda ya que aprovecha las propiedades de los exponenciales, lo que ahorra recursos y hace un uso más eficiente de los multiplicadores y acumuladores.
El bloque de conversión de complemento a dos a punto flotante o estándar IEEE754 toma un vector de entrada en punto fijo con signo y lo transforma a un vector de punto flotante de precisión simple de 32 bits de longitud como especifica el estándar para este tipo de precisión. En una Entrada Posterior se abordara el IEE754.
En el Diseño del Prototipo del Sistema de Análisis de Señales Tipo Poliscopio de la figura 2.1 se muestran dos bloques de conversión de complemento a dos a punto flotante a la salida del bloque de la RAM que almacena los resultados del bloque FFT, esto es porque la FFT como ya se mencionó, entrega a la salida dos vectores, uno para la parte real y otro para la parte imaginaria, y es necesario realizar la conversión de ambas componentes.

Bloque de Memoria RAM.




Este bloque almacena la salida de la FFT para que luego sea entregada al bloque de conversión de complemento a dos a punto flotante. El tamaño es igual al tamaño de la transformada rápida de Fourier que se implemente.

Bloque FFT

La FFT (Fast Fourier Transform, Transformada rápida de Fourier) es un algoritmo de alta eficiencia para el cálculo de Transformada de Fourier de tiempo Discreto DFT. Es de alta eficiencia porque, como se expuso en el capítulo 1, en la sección 1.7, la FFT logra disminuir el número de operaciones necesarias con relación al a DFT de N2 a Nlog2N, siendo N el número de muestras de la Transformada o tamaño de la transformada.
Este bloque de FFT toma N número de muestras, con 14 bits de longitud por muestra, de acuerdo a lo que se obtiene del bloque ADC, y en la salida entrega dos vectores en complemento a dos, uno para la componente real y otro para la componente imaginaria, ambos de tamaño bxk=bxn+log2N+1, para una implementación de la FFT sin escalamiento[1], donde bxn es la longitud de cada muestra y N como ya se ha dicho, es el tamaño de la transformada. En este caso, como el ADC entrega 14 bits por muestra, bxn = 14, así que, por ejemplo, para una FFT de N= 512 tendremos que, el tamaño de las salidas, tanto la parte real como la parte imaginaria, será de 24bits.
El tamaño de la transformada no se define en esta etapa del diseño del prototipo debido a que es necesario realizar pruebas con los diferentes tamaños para determinar cuál es el más apropiado, que tenga el mayor rendimiento y un eficiente uso de recursos, ya que, en una implementación de este algoritmo de FFT se utilizan gran cantidad de recursos del dispositivo programable, en especial se utilizan muchos bloques multiplicadores y acumuladores, así que, si no se consideran los demás componentes de la implementación, como memorias, bloques de operaciones y los recursos utilizados en tiempo de ejecución, el sistema podría tener un mal desempeño, comportamiento errático (bloqueos, salidas inconsistentes, etc.), no podría funcionar al momento de procesar señales o  simplemente no sería sintetizado a componente hardware.


[1] en una implementación de un algoritmo de FFT, el escalamiento consiste en fijar las salidas en un tamaño igual al de la entrada y dividir estas salidas por un vector de escalamiento cuyo máximo valor  se calcula con 2log2N para evitar que las salidas excedan el tamaño fijado. Tiene múltiples inconvenientes, por ejemplo problemas de desbordamiento y menor exactitud que otros tipos de implementación de FFT.

Bloque FIFO

Esta memoria consiste en un bloque de memoria de acceso secuencial con registros de 14 bits para almacenar cada una de las muestras del ADC. El número de registros, es decir la profundidad de la memoria, depende del tamaño de FFT que se quiera para el sistema. La característica más importante de esta memoria es que conserva el orden de las muestras que recibe, en el ciclo de escritura la primera muestra se almacena en el primer registro, la segunda en el segundo registro y así sucesivamente. En el ciclo de lectura pasa lo mismo, la primera muestra leída es la del primer registro, la segunda es la del segundo registro, etc. Con esto se consigue que lo primero que fue guardado en la memoria sea lo primero que sea leído, es decir, el comportamiento FIFO (First In, First Out). Este comportamiento por parte de la memoria es necesario para mantener el orden de las muestras de la señal y con esto la forma de la señal muestreada