2. HERRAMIENTA PARA EL DISEÑO DE...

24
2. HERRAMIENTA PARA EL DISEÑO DE FILTROS 2.1 Introducción El procedimiento a seguir en el diseño de filtros será el que sigue: Definir especificaciones deseadas, que cumpla un filtro ideal de precisión infinita o ilimitada, es decir representado mediante un número ilimitado de bits. Definir un filtro de precisión finita o limitada, es decir representado mediante un número finito y fijo de bits y al que se denominará filtro cuantizado, cuyo comportamiento sea lo más cercano posible al filtro ideal. Este filtro cuantizado podrá venir implementado tanto en punto fijo como en punto flotante. Diseño del filtro en punto fijo, tarea que simplifica la herramienta de diseño de filtros. El diseño de filtros en punto fijo en el que se centra este capítulo será posible gracias al trabajo conjunto de esta herramienta de diseño de filtros con la herramienta en punto fijo vista en el apartado anterior. Este proceso de diseño de filtros digitales no va a ser sencillo. Cuando el filtro va a ser usado en cualquier aplicación software, toda la información que maneja como la que genera tiene que venir representada por valores discretos. Esto es debido a que la memoria disponible para almacenar datos en cualquier aplicación de procesamiento digital de señales va a ser finita, y por lo tanto números de precisión infinita no van a tener cabida. La herramienta de diseño de filtros de MATLAB proporciona técnicas para diseñar, simular y analizar filtros digitales tanto en punto fijo como en punto flotante, usando métodos de diseño avanzado que facilitan este proceso. Además permitirá el análisis de los efectos de cuantización en el comportamiento de los filtros. Los efectos de la cuantización en filtros en punto flotante se consideran poco significativos, no ocurre lo mismo con filtros en punto fijo donde sus efectos no pueden ser ignorados. Esto es debido en gran medida al rango dinámico que ofrecen cada uno de ellos. La herramienta de diseño de filtros permitirá estudiar estos efectos de cuantización en filtros en punto fijo mediante el uso de objetos ‘dfilt’. Estos objetos ‘dfilt’, junto con sus propiedades asociadas será lo que centrará el estudio de los siguientes apartados. Los objetos ‘dfilt’ van a implementar el diseño de los filtros en punto fijo, ofreciendo numerosas estructuras para su realización. Sus propiedades asociadas permitirán controlar el modo de almacenar y trabajar con la información necesaria para llevar a cabo el diseño. Además, la herramienta de diseño de filtros permite una sencilla interacción con los lenguajes de diseño en hardware o lenguajes xHDL. Así se podrá mandar directamente las salidas de los algoritmos generadas tras del diseño a DSP en punto fijo, FPGA o ASIC. En todo el proceso de realización del filtro en el entorno MATLAB se va a permitir interactuar fácilmente con el diseño antes de llevar a cabo la implementación final en hardware. Esto es

Transcript of 2. HERRAMIENTA PARA EL DISEÑO DE...

2. HERRAMIENTA PARA EL DISEÑO DE FILTROS 2.1 Introducción El procedimiento a seguir en el diseño de filtros será el que sigue:

• Definir especificaciones deseadas, que cumpla un filtro ideal de precisión infinita o ilimitada, es decir representado mediante un número ilimitado de bits.

• Definir un filtro de precisión finita o limitada, es decir representado mediante un número finito y fijo de bits y al que se denominará filtro cuantizado, cuyo comportamiento sea lo más cercano posible al filtro ideal. Este filtro cuantizado podrá venir implementado tanto en punto fijo como en punto flotante.

• Diseño del filtro en punto fijo, tarea que simplifica la herramienta de diseño de filtros.

El diseño de filtros en punto fijo en el que se centra este capítulo será posible gracias al trabajo conjunto de esta herramienta de diseño de filtros con la herramienta en punto fijo vista en el apartado anterior.

Este proceso de diseño de filtros digitales no va a ser sencillo. Cuando el filtro va a ser usado en cualquier aplicación software, toda la información que maneja como la que genera tiene que venir representada por valores discretos. Esto es debido a que la memoria disponible para almacenar datos en cualquier aplicación de procesamiento digital de señales va a ser finita, y por lo tanto números de precisión infinita no van a tener cabida.

La herramienta de diseño de filtros de MATLAB proporciona técnicas para diseñar, simular y analizar filtros digitales tanto en punto fijo como en punto flotante, usando métodos de diseño avanzado que facilitan este proceso. Además permitirá el análisis de los efectos de cuantización en el comportamiento de los filtros.

Los efectos de la cuantización en filtros en punto flotante se consideran poco significativos, no ocurre lo mismo con filtros en punto fijo donde sus efectos no pueden ser ignorados. Esto es debido en gran medida al rango dinámico que ofrecen cada uno de ellos. La herramienta de diseño de filtros permitirá estudiar estos efectos de cuantización en filtros en punto fijo mediante el uso de objetos ‘dfilt’. Estos objetos ‘dfilt’, junto con sus propiedades asociadas será lo que centrará el estudio de los siguientes apartados. Los objetos ‘dfilt’ van a implementar el diseño de los filtros en punto fijo, ofreciendo numerosas estructuras para su realización. Sus propiedades asociadas permitirán controlar el modo de almacenar y trabajar con la información necesaria para llevar a cabo el diseño. Además, la herramienta de diseño de filtros permite una sencilla interacción con los lenguajes de diseño en hardware o lenguajes xHDL. Así se podrá mandar directamente las salidas de los algoritmos generadas tras del diseño a DSP en punto fijo, FPGA o ASIC. En todo el proceso de realización del filtro en el entorno MATLAB se va a permitir interactuar fácilmente con el diseño antes de llevar a cabo la implementación final en hardware. Esto es

necesario debido a la dependencia entre las distintas fases de implementación del filtro hasta su descripción en lenguaje hardware y posterior síntesis. Esta dependencia entre fases se puede observar en el Esquema 2. 1, donde se presenta el proceso de implementación de un filtro en una FPGA en este caso:

Diseño del filtro en punto flotante. No No

Esquema 2. 1 Implementación en una FPGA

Los siguientes apartados se centrarán en la implementación de filtros FIR en punto fijo. Una de las mayores desventajas que presentan los filtros FIR es que ante las mismas especificaciones exigidas, su implementación suele requerir órdenes mucho mayores que las implementaciones de filtros IIR con las mismas especificaciones. Como características positivas, los filtros FIR son siempre estables y tienen un buen comportamiento en cuanto al ruido de redondeo, además pueden ofrecer una fase lineal. En cuanto a los efectos de la cuantificación sobre cada uno de ellos, en general un filtro FIR tiende a ser menos sensible a la cuantización de coeficientes que los filtros IIR.

Diseño hardware del filtro en xHDL.

Programar la FPGA

¿Resultados buenos?

Finalizado proceso

Diseño del filtro en punto fijo.

Evaluar el diseño en punto fijo en términos de exactitud y de eficiencia hardware (tamaño, latencia, potencia,...).

¿Resultados buenos?

Dentro de los filtros FIR, se encuentran los que tienen fase lineal. Este tipo de filtros presentan en sus coeficientes una simetría o asimetría que les confiere su característica de fase lineal. Según el orden y el tipo de coeficientes resultan distintos tipos de filtros FIR lineales:

- Tipo I: Presenta orden del filtro par y coeficientes simétricos. - Tipo II: Presenta orden del filtro impar y coeficientes simétricos. - Tipo III: Presenta orden del filtro par y coeficientes asimétricos. - Tipo IV: Presenta orden del filtro impar y coeficientes asimétricos.

El retraso de fase y retraso de grupo de un filtro de fase lineal es igual y constante en toda la banda de frecuencia. Para un filtro FIR de fase lineal y orden ‘n’, su retraso de grupo viene dado por ‘n/2’. Esto quiere decir, que la señal filtrada será retrasada ‘n/2’ pasos por igual, a todas sus frecuencias, lo que permite que no sufra ninguna distorsión de fase y mantenga su forma original. Su magnitud en cambio, si puede ser modificada por la magnitud de la respuesta en frecuencia del filtro. 2.2 Diseño de filtros FIR en punto flotante en MATLAB Como se comentó previamente, en el diseño de filtros se parte de unas especificaciones exigidas en el comportamiento del filtro que se deben cumplir con el diseño. Estas especificaciones se cumplirán con más facilidad usando un diseño en punto flotante, ya que este diseño se aproxima en gran medida al comportamiento ideal o de precisión infinita. Esto es debido a que MATLAB trabaja en todas sus operaciones con 64 bits en punto flotante y precisión doble por defecto, siendo este formato de representación de una precisión mucho mayor de la que cualquier implementación hardware real puede ofrecer. Se muestran a continuación algunas funciones que permiten el diseño de filtros FIR en punto flotante:

‘fir1’ Esta función implementa el método clásico de diseño por ventanas de filtros FIR digitales y de fase lineal. Por defecto crea un filtro paso de baja usando la ventana de Hamming, aunque esto se puede variar cambiando sus especificaciones en la llamada. ‘fir2’ Esta función diseña un filtro FIR usando el método de ventanas, como la función ‘fir1’, pero permite una respuesta en frecuencia más arbitraria pudiendo diseñar filtros multibanda, con respuesta en frecuencia cuya magnitud vaya cambiando a lo largo de la frecuencia. ‘firls’,‘firpm’ Para el diseño de multibanda con regiones de transición tenemos las funciones ‘firls’ y ‘firpm’. Estas son funciones que proporcionan maneras más generales de especificar el diseño del filtro ideal deseado que las anteriores funciones. ‘firlpnorm’ Diseña una solución ‘minimax’ para filtros FIR usando el algoritmo ‘least-pth’. ‘firgr’ Usa el algoritmo generalizado de intercambio ‘Parks-McClellan’ para diseñar soluciones óptimas de filtros FIR con respuesta en frecuenta arbitraria.

‘fircband’ Diseña filtros FIR con restricciones establecidas en las bandas de frecuencia usando el algoritmo ‘Remez’. ‘firceqrip’ Diseño de un filtro FIR con respuesta en frecuencia finita, igual rizado y restricciones en el diseño. ‘firequint’ Diseño de filtros FIR interpolados de igual rizado. ‘firgr’ Diseño de filtros FIR usando técnicas de Remez generalizado. ‘firhalfband’ Diseño de filtros FIR de media banda. ‘firnyquist’ Diseño de filtros FIR’ Nyquist’ de igual rizado. ‘ifir’ Diseña filtros FIR interpolados. ‘equiripple’ Diseña un filtro que tiene igual rizado y cumple con las especificaciones exigidas.

Se pueden encontrar muchas más, aquí sólo se comentan algunas de las más significativas. 2.3 Diseño de filtros en punto fijo. El proceso de diseño de filtros en punto fijo ofrece mayor complejidad que el diseño en punto flotante, debido al formato de representación en punto fijo. Tanto el proceso de conversión de posibles valores infinitos a un conjunto de posibles valores finitos representables, como la probabilidad de desbordamientos internos en las operaciones aritméticas, son causa de errores en la implementación de filtros digitales. Estos errores pueden llevar a que las cosas no funcionen como se desea y que la respuesta en frecuencia del filtro difiera de la deseada, por lo tanto es importante tenerlos en cuenta y evitarlos en la medida de lo posible. Todos estos factores se tienen que tener en cuenta en el diseño de un filtro de estas características. 2.3.1 Cuantización. Efectos sobre el diseño Se presentan en la Tabla 2. 1 algunas fuentes de error causadas por la cuantización y sus efectos.

Errores derivados de la

cuantización Consecuencias

coeficientes del filtro La cuantización provoca un movimiento de los polos y ceros de la función de

transferencia a diferentes zonas del plano z de los inicialmente deseados y diseñados.

El movimiento de polos y ceros provoca que la respuesta en frecuencia del filtro obtenida no sea la deseada.

En el caso de los filtros IIR también puede llevar a un filtro a la situación inestable.

Error producido al

representar infinitos valores posibles por un conjunto finito de

valores. Esto llevará consigo

una pérdida de información y por

tanto la suma de una señal de error en la

señal original.

señal de entrada

Se parte de una señal analógica que se somete a un proceso de conversión A/D. Esta conversión consiste en el muestreo y posterior cuantización de la

señal, obteniéndose una señal digital. Este proceso de conversión introduce un error en la señal de entrada que provoca que se trabaje con valores de señal que no son los deseados y que

repercuta también en la señal de salida del filtro. El efecto del error sobre la señal se modela de la siguiente manera:

^x[n]=e[n]+x[n]

Error producido por la

cuantización en operaciones aritméticas.

De las operaciones pueden surgir

resultados cuyo tamaño exceda el permitido por los

registros internos de la realización hardware.

Esto ocurre sobre todo en las multiplicaciones, ya que el resultado de la

multiplicación ocupará el doble de espacio que cada uno de los operandos iniciales.

Esto dará lugar a lo que denominamos desbordamiento y que tendremos que controlar mediante ‘saturación’ o ‘wrap’.

Estos métodos modificarán dichos resultados para que sean compatibles con la realización, lo que provocará errores.

Otro error que puede aparecer es el llamado ‘ciclo límite’, debido a la no

linealidad de las operaciones aritméticas cuantizadas. Se da en casos de ausencia de señal de entrada o cuando ésta es una constante

o una señal sinusoidal. Este error afecta a la señal de salida del filtro.

Tabla 2. 1 Fuentes de error debidas a la cuantización

2.4 Diseño de filtros en punto fijo en MATLAB. Se ha visto cuales son los factores que hay que tener en cuenta en el diseño de filtros en punto fijo. Se presenta a continuación como MATLAB permite trabajar con este tipo de filtros

controlando su diseño, además de las consecuencias del uso del punto fijo sobre el comportamiento inicial del sistema. El proceso de diseño comienza con unas características específicas que debe cumplir. A partir de éstas, se generan los coeficientes del filtro que más aproximen su comportamiento al deseado. Estos coeficientes por defecto serán elementos en punto flotante de precisión doble, valor por defecto de MATLAB, ocupando cada uno de ellos 64 bits. Basándose en los coeficientes obtenidos, la implementación del filtro en MATLAB se llevará a cabo generando un objeto ‘dfilt’, que será usado por la herramienta de diseño de filtro como base para los filtros cuantizados en punto fijo. Este objeto ‘dfilt’ tendrá asociadas una serie de propiedades con sus correspondientes valores. Serán estas propiedades las que determinen como se va a implementar el filtro. Recordar que cuando se usa aritmética en punto fijo, se especificará con dos cantidades la forma de cuantizar los números:

o La longitud de la fracción en bits o La longitud de la palabra en bits

Por tanto, al trabajar sobre objetos ‘fi’ en el diseño del filtro, el formato de representación [longitud de la palabra longitud de la fracción] será el usado para representar cualquier cantidad con la que trabaje el filtro. En siguiente ejemplo muestra el proceso de obtención de un filtro cuantizado en punto fijo haciendo uso de objetos ‘dfilt’ Ejemplo

Se diseña un filtro FIR en punto flotante paso

de baja, usando el método de ventanas. Se almacenan los coeficientes en la variable ‘b’

b = fir1(101, .45, 'low', kaiser(102, 7.8573));

A partir de los coeficientes, se pasa a la

implementación del filtro en tiempo discreto y punto flotante. Para ello se crea un objeto ‘dfilt’,

cuyas propiedades asociadas determinarán las características de implementación del filtro.

Junto a la orden ‘dfilt’ hay que especificar el tipo

de estructura para llevar a cabo el filtro, en este ejemplo se usa una estructura en forma directa.

hd = dfilt.dffir(b) hd =

FilterStructure: 'Direct-Form FIR' Arithmetic: 'double' Numerator: [1x102 double] ResetBeforeFiltering: 'on' States: [101x1 double] NumSamplesProcessed: 0

Se convierte el filtro de punto flotante a punto fijo. Para ello se modifica la propiedad ‘Arithmetic’ asociada al objeto ‘dfilt’ estableciendo su valor

asociado a ‘fixed’.

Esto va a permitir activar la cuantización y construir el filtro en punto fijo.

set(hd,'Arithmetic','fixed') hd hd = FilterStructure: 'Direct-Form FIR'

Arithmetic: 'fixed' Numerator: [1x102 double] ResetBeforeFiltering: 'on' States: [101x1 embedded.fi]

NumSamplesProcessed: 0 CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumMode: 'KeepMSB' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'

Tabla 2. 2 Obtención filtro cuantizado en punto fijo

Para establecer el nuevo valor de ‘arithmetic’ se ha usado el comando ‘set’ de MATLAB. Esta orden permite modificar y establecer las propiedades de un objeto cualquiera. En cuanto a las propiedades asociadas al objeto ‘dfilt’ (se pueden ver parte de ellas en la Tabla 2.2), serán objeto de apartados posteriores. Por otro lado, la función ‘dfilt’ que ha permitido crear el objeto del filtro en tiempo discreto, es decir el objeto ‘dfilt’, tiene como sintaxis: hd=dfilt.structure(input1,..) ‘hd’ es lo que devuelve la función ‘dfilt’, y será un objeto del filtro en tiempo discreto implementado usando la estructura del tipo ‘structure’. Se tienen las siguientes estructuras relacionadas con la implementación de filtros FIR:

Orden Definición

dfilt.dffir

FIR en forma directa

dfilt.dffirt

FIR en forma directa transpuesta.

dfilt.dfsymfir

FIR en forma directa simétrica

dfilt.dfasymfir

FIR en forma directa antisimétrica

dfilt.scalar

Escalar

Tabla 2. 3 Estructuras implementación del filtro

Cada uno de estas estructuras tendrá un efecto distinto en la cuantización. 2.5 Propiedades asociadas al objeto ‘dfilt’ o filtros en tiempo discreto Se ha visto como la función ‘dfilt’ devuelve un objeto que tendrá asociada una serie de propiedades. Los valores asignados a estas propiedades determinarán la forma de manejar los datos de entrada al filtro. Muchas de las propiedades asociadas al objeto ‘dfilt’ serán dinámicas, lo que significa que estarán disponibles dependiendo de los valores establecidos para otras propiedades del objeto ‘dfilt’. Una de las propiedades más importantes al trabajar con filtros es la propiedad ‘Arithmetic’. Esta propiedad define el tipo de aritmética usada en la implementación del filtro, pudiendo ser ésta:

• Aritmética en punto flotante de precisión simple (‘Arithmetic=single’) • Aritmética en punto flotante de precisión doble (‘Arithmetic=double’) • Aritmética en punto fijo (‘Arithmetic=fixed’)

Esta propiedad a su vez controlará algunas propiedades dinámicas del filtro. Así, si se cambia el valor de la propiedad ‘Arithmetic’, la lista de propiedades que aparece en la visualización del objeto ‘dfilt’ con la nueva configuración será distinta. Ejemplo Se visualizan las propiedades del objeto ‘dfilt’ en la Tabla 2. 4. En la columna de la derecha, la propiedad ‘arithmetic’ toma como valor ‘double’, en la de la izquierda toma valor ‘fixed’. Se podrá observar como el filtro posee muchas más propiedades asociadas para un valor de ‘arithmetic’ que para el otro. Todas las propiedades estarán inicializadas a sus valores por defecto:

‘Arithmetic’=’double’ ‘Arithmetic’=’fixed’

hd= dfilt.dffir hd =

FilterStructure: 'Direct-Form FIR' Arithmetic: 'double' Numerator: 1 ResetBeforeFiltering: 'on' States: [0x1 double] NumSamplesProcessed: 0

hd.arithmetic= 'fixed' hd =

FilterStructure: 'Direct-Form FIR' Arithmetic: 'fixed' Numerator: 1 ResetBeforeFiltering: 'on' States: [0x1 embedded.fi] NumSamplesProcessed: 0 CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumMode: 'KeepMSB' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent'

OverflowMode:'wrap'

RoundMode: 'convergent' OverflowMode: 'wrap'

Tabla 2. 4 Propiedad ‘Arithmetic’

Las propiedades que aparecen en la tabla y asociadas al objeto ‘dfilt’ son sólo algunas de las que se pueden encontrar, ya que como se ha comentado hay muchas propiedades dinámicas. La lista de propiedades con ‘arithmetic’ a ‘fixed’ aún no estaría completa. Cuando se cambia el valor de las propiedades ‘ProductMode’ o ‘CoeffAutoScale’, surgen otras propiedades dinámicas que controlan como trabaja el filtro al llevar a cabo productos o como trabaja con los coeficientes. Hay que mencionar que no se puede cambiar el valor de una propiedad a menos que sea visualizada en la lista de propiedades del filtro. Esta visualización se consigue introduciendo el nombre del filtro en la línea de comandos de MATLAB. Una función importante de MATLAB para el manejo de objetos es la invocada mediante el comando ‘get’, que devuelve el valor de la propiedad del objeto especificada en la llamada de la siguiente manera:

V= get(H,’nombre de la propiedad’) Si se usa el comando ‘get’ como sigue:

get(H)

Lo que se obtiene es un listado completo de las propiedades del objeto ‘H’ y sus valores asociados para el filtro dado. Esta lista de propiedades del filtro ‘H’ incluirá tanto las modificables como las no modificables que aún no estarán disponibles. La implementación en punto fijo de los distintos tipos de filtros pasa por una cuantización de los datos como de los coeficientes del filtro. Los datos al ir continuamente cambiando van a ser cuantizados en distintas partes de los filtros, teniendo entonces propiedades asociados a los datos de entrada al filtro, a la salida del filtro, al resultado de las multiplicaciones y sumas, etc.... En cambio los coeficientes son cuantizados una vez al ser fijos y no variar durante la implementación del filtro.

El efecto de la cuantización sobre los datos y sobre los coeficientes es distinto y por tanto deben ser tratados de distinta forma. En los siguientes subapartados se hace una presentación de las propiedades asociadas a los coeficientes, señal de entrada, señal de salida, etc.. asociadas al objeto ‘dfilt’ que describe el filtro en punto fijo. De cada propiedad se dará una descripción, y de las más interesantes se adjuntará un ejemplo.

2.5.1 Propiedades del objeto ‘dfilt’ asociadas al formato de representación de los coeficientes

‘CoeffWordLength’ Determina la longitud de la palabra usada para almacenar los coeficientes del filtro. Cualquier valor entero positivo, establecido por defecto a 16 bits. ‘NumFracLength’ Determina la longitud de la fracción usada para la representación de los coeficientes. No estará disponible hasta que no se establezca la propiedad ‘CoeffAutoScale’ al valor ‘false’. Puede tomar cualquier valor entero positivo o negativo, por defecto tendrá 14 bits.

‘CoeffAutoScale’ Como el filtro represente sus coeficientes dependerá del valor de la propiedad ‘CoeffAutoScale’. Cuando se crea un objeto ‘dfilt’, se usan coeficientes que están en formato de doble precisión. Convertir el objeto ‘dfilt’ a un aritmética en punto fijo fuerza a que los coeficientes tenga que ser representados también en punto fijo. Sus posibles valores ‘true’ o ‘false’.

‘CoeffAutoScale’ = ‘true’ ‘CoeffAutoScale’ = ‘false’

Cuantización de los coeficientes de manera automática. El filtro asigna automáticamente la longitud de la fracción (‘CoeffFracLength’) en función de la longitud de la palabra (‘CoeffWordLength’) con el fin de mantener el valor de los coeficientes lo más cercano posible a sus valores en doble precisión, sin que ocurra desbordamientos.

Cuantización de los coeficientes de manera manual. Se deshabilita el escalado automático de la longitud de la fracción de los coeficientes y por tanto se permite que la propiedad que maneja esta longitud de fracción, ‘CoeffFracLength’, pueda ser modificada.

Tabla 2. 5 Propiedad ‘CoeffAutoScale’

Coeficientes de referencia para filtros en punto fijo

Cuando se establece la propiedad ‘arithmetic’ al valor ‘fixed’, es decir se lleva a cabo la cuantización, los coeficientes del filtro en punto fijo que se obtienen son aproximaciones de los coeficientes en doble precisión originales. Estas aproximaciones pueden llegar a ser exactas dependiendo del formato de representación que se tenga en la implementación del filtro. Si se tiene la suficiente precisión en el formato se podrá llegar a almacenar en punto fijo los valores exactos de los coeficientes en punto flotante. Por otro lado, si la precisión proporcionada en punto fijo no es la suficiente, los valores almacenados diferirán de los originales. Los filtros cuantizados almacenan tanto los coeficientes cuantizados que resultan del cambio de la propiedad ‘Arithmetic’ como los coeficientes de referencia, que son lo que se tenían antes de la cuantización y que estaban almacenados en punto flotante de doble precisión. Se puede acceder tanto a un tipo de coeficiente como a otro desde la línea de comando. Ejemplo 1 En la creación de cualquier filtro, se encontrará la propiedad ‘CoeffAutoScale’ inicializada al valor ‘true’ por defecto. Al cambiar el valor de la propiedad ‘CoeffAutoScale’ al valor ‘false’, la propiedad ‘NumFracLength’ se hará visible y por tanto modificable.

f = [0 0.6 0.6 1]; m = [1 1 0 0]; b = fir2(5,f,m); hd = dfilt.dffir(b); hd.arithmetic='fixed'; hd. Numerator ans = -0.0101 0.0262 0.4695 0.4695 0.0262 -0.0101

hd.CoeffWordLength ans = 16 hd.NumFracLength ans = 16 hd.CoeffWordLength = 24; hd.NumFracLength ans =

24 hd.CoeffAutoScale= false; hd.numfraclength=15; hd.coeffwordlength=5; hd.numerator ans = 1.0e-003 * -0.4883 0.4578 0.4578 0.4578 0.4578 -0.4883

Cuadro 2. 1 Ejemplo propiedad ‘CoeffAutoScale’

En el ejemplo se observar como al estar la propiedad ‘CoeffAutoScale’ al valor ‘true’, ‘numFracLength’ se inicializa automáticamente en función del valor que tenga ‘CoeffWordLength’ con el fin de representar los coeficientes con la mejor precisión posible. Con la propiedad ‘CoeffAutoScale’ al valor ‘false’ se tiene acceso a la propiedad ‘numFraclength’ y por tanto es modificable su valor. En este caso del ejemplo, se cambia la longitud de la palabra de coeficiente a 5 bits y la longitud de la fracción a 15 bits, es decir se establece un formato de representación [5 15] para los coeficientes del filtro. Se observa entonces que los valores que presentan los coeficientes distan bastante de los que se tenían inicialmente.

Ejemplo 2 En el Cuadro 2. 2 se muestra como trabajar con los coeficientes de referencia. Para ello se usa la función ‘reffilter’, que permite obtener los coeficientes de referencia del filtro original de doble precisión. En el ejemplo se empieza creando un filtro inicialmente en punto flotante en forma directa, llamado ‘hd’. Después se cuantiza para pasarlo a punto fijo.

b=fir1(5,0.45); hd = dfilt.dffir(b); hd.numerator ans =

-0.0044 0.0808 0.4235 0.4235 0.0808 -0.0044

hd.arithmetic='fixed'; hd.numerator ans =

-0.0044 0.0808 0.4235 0.4235 0.0808 -0.0044

set(hd,'coeffWordLength',14'); hd.numerator ans =

-0.0044 0.0808 0.1250 0.1250 0.0808 -0.0044

hdref=reffilter(hd) hdref =

FilterStructure: 'Direct-Form FIR' Arithmetic: 'double' Numerator: [-0.0044 0.0808 0.4235 0.4235 0.0808 -0.0044] ResetBeforeFiltering: 'on' States: [5x1 double] NumSamplesProcessed: 0

Cuadro 2. 2 Coeficientes de referencia

Se observa como inicialmente, los coeficientes del filtro en punto fijo son exactamente iguales a los coeficientes en punto flotante, ya que su formato de representación ofrece el número de bits suficiente para representar exactamente los valores iniciales. Posteriormente se cambia la longitud de la palabra del filtro usado para representar los coeficientes y la se establece a un valor de ‘14’, obteniéndose en este caso valores distintos para algunos coeficientes del filtro. Una vez cambiado el valor de los coeficientes del filtro ‘hd’, se puede usar la función ‘reffilter’ para obtener de nuevo los coeficientes de referencia como se puede observar en el Cuadro 2.2. El filtro ‘hdref‘obtenido será el filtro original en punto flotante de doble precisión del que se partió, con los coeficientes de referencia originales. 2.5.2 Propiedades del objeto ‘dfilt’ asociadas al formato de representación del resultado de sumas, productos y etapas. Resultados

de sumas

‘AccumWordLength’ Longitud de la palabra usada para almacenar los resultados del acumulador. Cualquier valor entero positivo de bits, tomando por defecto el valor 40. ‘AccumFracLength’ Longitud de la fracción usada para interpretar el dato de salida del acumulador. Se podrá cambiar el valor de esta propiedad después de establecer la propiedad ‘AccumMode’ al valor ‘SpecifyPrecision’. Cualquier valor entero positivo o negativo de bits, tomando por defecto el valor 29.

Cuadro 2. 3 Propiedades asociadas con las sumas

Cuadro 2. 4 Propiedades asociadas con los productos

Cuadro 2. 5 Propiedades asociadas con las etapas de un filtro FIR

2.5.3 Propiedades aritméticas asociadas al objeto ‘dfilt’

‘Arithmetic’ Quizás la propiedad más importante cuando se trabaja con objetos ‘dfilt’ es la propiedad ‘Arithmetic’. Esta propiedad determina el tipo de aritmética que el filtro usa. La propiedad ‘Arithmetic’ puede tomar como valores las cadenas dadas en la Tabla 2. 6.

La Tabla 2. 6 muestra, para cada posible valor de la propiedad ‘Arithmetic’, información de lo que ocurrirá cuando se seleccione un valor u otro.

Valores Descripción del efecto sobre el filtro

Double Con el valor ‘double’ se especifica que el filtro va a usar aritmética de doble precisión en punto flotante para todas las operaciones realizadas durante el filtrado.

Etapas de un filtro FIR

‘TapSumWordLength’ Longitud de la palabra que se usa para representar la etapa del filtro durante la suma Los filtros FIR simétricos y antisimétricos son los que incluyen esta propiedad. Puede tomar valores enteros positivos de bits. Por defecto toma el valor de 17. ‘TapSumFracLength’ Longitud de la fracción usada para representar los valores de una etapa del filtro en operaciones de suma. Para poder modificar esta propiedad se tiene que establecer la propiedad ‘TapSumMode’ a ‘SpecifyPrecision’. Los filtros FIR simétricos y antisimétricos son los que incluyen esta propiedad. Cualquier valor entero positivo o negativo de bits. Por defecto toma el valor de 15.

Resultados de productos.

‘ProductWordLength’ Longitud de la palabra usada para almacenar los resultados de las operaciones de multiplicación. Puede tomar valores positivos de bits. Por defecto toma valores de 16 ó 32 dependiendo del tipo de estructura usada en el filtro. ‘ProductFracLength’ Longitud de la fracción usada para interpretar el dato numérico del resultado de las operaciones de multiplicación. Se podrá cambiar el valor de esta propiedad después de establecer la propiedad ‘ ProductMode’ al valor ‘SpecifyPrecision’. Puede tomar valores enteros positivos o negativos de bits. Por defecto toma el valor de 29.

Los coeficientes, datos de entrada al filtro deben ser de tipo doble, así como los estados y salidas del filtro. Cuando se usa este tipo de dato, los coeficientes del filtro de referencia y los cuantizados son idénticos. ‘double’ es el valor por defecto para la propiedad ’Arithmetic’.

Single

Con este valor toda la aritmética que se lleva a cabo en el proceso de filtrado se ve restringida al tipo de dato en punto flotante y precisión simple. Los datos de entrada deben ser datos en formato simple ya que otro tipo de dato nos daría error. Los estados del filtro así como sus salidas también tienen que venir dados como datos de tipo simple. Los coeficientes del filtro pueden venir dados de dos maneras:

• Coeficientes de tipo flotante pero de precisión doble, que con la propiedad ‘Arithmetic’ establecida a ‘single’ hará que el filtro convierta los datos a tipo simple.

• Coeficientes en tipo simple, en cuyo caso permanecerán inalterables cuando los use el filtro.

Fixed

El objeto ‘dfilt’ usa aritmética en punto fijo. Se usan objetos en punto fijo (objetos ‘fi’) para manejar la información con la que trabaja el filtro, coeficientes, entradas, estados etc.. Cuando se trabaja con aritmética en punto fijo, tendremos propiedades asociadas a la longitud de la palabra y a la longitud de la fracción para cada una de las porciones del filtro. El variar el valor de estas propiedades permitirá controlar la manera que tiene el filtro de realizar el filtrado. No se puede mezclar aritmética en punto fijo y aritmética en punto flotante. ‘fixed’ no permite el uso de datos sin signo, exceptuando los coeficientes sin signo cuando se especifica la propiedad ‘Signed’ a ‘false’. Cuando se trabaja con aritmética en punto fijo, se suponen una serie de factores:

• Longitud de palabra fija • Registros acumuladores y para el producto de tamaño fijo y dedicados.

El suponer esto simplifica el trabajo de crear filtros en punto fijo mediante la reducción de los procesos de construcción repetitivos, tales como por ejemplo pedir que se introduzca el tamaño de la palabra del acumulador una sola vez, en vez de introducirlo para cada paso de ejecución que use el acumulador.

Tabla 2. 6 Valores propiedad ‘Arithmetic’

El valor de la propiedad ‘Arithmetic’ determina el tipo de dato que el filtro en tiempo discreto va a manejar en las distintas áreas significativas del filtro. Estos datos pueden originalmente venir dado en varios formatos que son los que siguen:

Punto flotante de precisión doble Punto flotante de precisión simple Enteros con signo (int*) Enteros sin signo (uint*) Objetos ‘fi’

Todos los valores que se pueden establecer para la propiedad ‘Arithmetic’ (‘double’, ‘single’ o ‘fixed’), soportan estos tipos para los datos de entrada, estados y coeficientes. La propiedad ‘Arithmetic’ determina a que formato convertir cada uno de estos tipos para trabajar en la realización del filtro.

‘CastBeforeSum’ Esta propiedad determina como el filtro maneja los valores de entrada en las operaciones de suma. Sus posibles valores son ‘true’ y ‘false’.

‘CastBeforeSum’ = ‘true’ ‘CastBeforeSum’ = ‘false’

Convierte el formato de los operandos al formato de la salida de la suma antes de llevar a cabo la operación de suma. Realizar la conversión antes de sumar los sumandos añade uno o dos operaciones de cuantización adicionales que pueden añadir fuentes de error a los resultados de nuestro filtro.

Los operandos mantienen el formato que traían de operaciones anteriores y son convertidos tras realizar la suma. En este caso se tienen menos operaciones de cuantización que en el caso anterior. Hay que elegir los formatos de entrada para obtener la mayor exactitud en los resultados de las sumas.

Diagramas del establecimiento de ‘CastBeforeSum’

La suma de los elementos viene representada por el siguiente diagrama:

AccumFormat

AccumFormat AccumFormat

La suma de los elementos en el filtro viene representado en el siguiente diagrama:

Muestra que los datos de entrada se obtienen de convertir al formato de salida cada uno de los sumandos antes de realizar la operación de suma. El valor de salida de la operación de suma tendrá una longitud de palabra y longitud de fracción definidas por ‘AccumWordLength’, ‘AccumFracLength’ y ‘AccumMode’.

AccumFormat

Muestra que los datos de entrada en las operaciones de suma, es decir los sumandos, mantienen su formato, longitud de palabra y longitud de fracción, de operaciones anteriores. El proceso de suma usa el formato existente en las entradas, después se convierten al formato de salida definido por ‘AccumFormat’. El dato de salida tiene su longitud de palabra y longitud de fracción definidas por ‘AccumWordLength’, ‘AccumFracLength’ y ‘AccumMode’.

Tabla 2. 7 Propiedad ‘CastBeforeSum’

‘Signed’ Especifica si los coeficientes del filtro en punto fijo tienen o no tienen signo. Sus valores posibles son ‘true’ o ‘false’.

‘TapSumMode’ Especifica como el acumulador almacena las salidas de las operaciones de suma que involucran las etapas del filtro FIR. Como valores posibles se tiene ‘FullPrecision’, ‘KeepLSB’, ‘KeepMSB’, y ‘SpecifyPrecision’. Los filtros FIR simétricos ( dfilt.dfsymfir ) y antisimétricos ( dfilt.dfasymfir ) son los que incluyen esta propiedad. Toma como valor por defecto el valor ‘KeepMSB’.

Resultado de sumas de las etapas de filtros FIR

+ + Cast

Cast

Cuadro 2. 6 Propiedades de las etapas del filtro FIR

Cuadro 2. 7 Propiedades asociadas con sumas y productos

En la Tabla 2. 8 que se muestra a continuación se describen los valores que pueden tomar las propiedades definidas previamente en los

Valores asociados a ‘ AccumMode’ , ‘ProducMode’ y ‘TapSumMode’

‘FullPrecision’: El filtro escoge automáticamente la longitud de la fracción y la longitud de la palabra que se usará para representar los resultados de las operaciones de suma y multiplicación. Con esto se busca asignar espacio suficiente que evite eliminar bits del resultado, de manera que se evitan desbordamientos.

Cuando se cambia a aritmética en punto fijo, puede ocurrir que al llevar a cabo sumas o multiplicaciones se tengan que eliminar algunos de los bits del resultado porque el acumulador o multiplicador trabaje con más bits de los que el filtro usa para la representación interna. Se puede entonces elegir eliminar los bits menos significativos o más significativos del resultado.

‘KeepMSB’: El filtro establece automáticamente la longitud de la fracción para eliminar los LSBs del resultado. ‘KeepLSB’: El filtro establece automáticamente la longitud de la fracción para eliminar los MSBs del resultado.

En ambos casos el usuario debe especificar la longitud de la palabra usada para representar los resultados de la sumas y de los productos, definiendo los valores de las propiedades ‘accumWordLength’ y ‘ProducWordLength’ respectivamente. Eliminar los LSB del resultado tiene la ventaja de que el error de cuantización que se originará será menor ya que estos bits son los que tienen menor peso en la palabra. Se elige eliminar los MSB cuando estos bits sean valores pequeños en comparación con el rango que el formato puede representar.

‘SpecifyPrecision’: Con esta opción se debe especificar tanto la longitud de la palabra como la longitud de la fracción para almacenar los datos obtenidos a la salida del acumulador y del multiplicador.

El valor ‘KeepMSB’ será el valor tomado por defecto por ‘TapSumMode’ y ‘AccumMode’. Para ‘ProductMode’ el valor por defecto será ‘Fullprecision’

Cuadro 2. 6 y Cuadro 2.7.

‘ AccumMode’ y ‘ProductMode’

Ambas propiedades estarán disponibles cuando se establezca aritmética en punto fijo. Determina como el acumulador y el multiplicador respectivamente almacenan el resultado obtenido de las operaciones aritméticas que llevan a cabo sumas y productos. Los valores que puede tomar son ‘FullPrecision’, ‘KeepMSB’, ‘KeepLSB’ y ‘SpecifyPrecision’.

Resultado de sumas y productos

Tabla 2. 8 Valores asociados a propiedades de sumas y productos

Ejemplo Como se ha comentado, muchas operaciones aritméticas necesitan más bits para representar el resultado que los necesarios para representar cualquiera de los dos operandos, sea se el caso de la multiplicación, donde el multiplicar dos números de N bits requiere de 2N bits para representar el resultado perfectamente. El establecer el valor ‘FullPrecision‘ para estas dos propiedades permite evitar la pérdida de precisión y desbordamientos durante el filtrado manteniendo todos los bits del resultado, este valor es el asignado por defecto para las propiedades ‘ProductMode’ y ‘AccumMode’. En cambio cuando no se puedan mantener todos los bits del resultado, debido a que es muy costoso o no siempre es necesario en algunas aplicaciones, se debe llevar a cabo una cuantización con la consecuente introducción de error.

En el Cuadro 2. 8 se muestra el diseño del filtro FIR usando estructura en forma directa. En él se establece el modo de operación para las sumas y los productos al valor ‘FullPrecisión’.

b = fir1(101, .45, 'low', kaiser(102, 7.8573)); hd = dfilt.dffir(b); set(‘Arithmetic’,’fixed’);

hd.ProductMode= 'FullPrecision'; hd.ProductWordLength hd.ProductFracLength ans = 32 ans = 31 hd.AccumMode = 'FullPrecision'; hd.AccumWordLength hd.AccumFracLength ans = 40 ans = 31

Cuadro 2. 8 Diseño de filtro FIR

El valor asignado a la palabra del multiplicador ‘ProductWordLength’ viene del hecho de que el multiplicador, como previamente se comentó, necesita un registro para almacenar las multiplicaciones cuyo tamaño sea al menos el doble del tamaño usado para los coeficientes del filtro (‘CoeffWordLength’) o el doble del tamaño de la entrada (‘InputWordLength’). Al tener registros para los coeficientes de 16 bits, el tamaño del acumulador será de 32 bits. Al tamaño de la palabra que contiene las sumas, ‘AccumWordLength’, se le asignan más bits de los 32 asignados a ‘ProductWordLength’. Estos bits adicionales reciben el nombre de bits de guardia y permiten que crezca la cantidad si es necesario durante los procesos de suma. Gracias a la información que se tiene sobre el número de bits asignados a la parte de la fracción de la palabra que almacena los productos (‘ProductFracLength’) como de los bits asignados a la parte de la fracción de la palabra que almacena las sumas (‘AccumFraclength’), se puede determinar la posición del punto binario de cada uno de los registros. Los valores de los distintos registros que se han comentado y visto en el Cuadro 2. 8 anterior vienen dados por defecto y son los que permiten que el filtro trabaje de manera más exacta. 2.5.4 Valores de entrada y salida del filtro

Cuadro 2. 9 Propiedades de entrada y salida del filtro

‘InputWordLength’ La longitud de la palabra que se usa para representar los datos de entrada del filtro. Cualquier valor entero positivo de bits, cuyo valor por defecto es 16. ‘InputFracLength’ Determina la longitud de la fracción que el filtro usa para interpretar los datos que van a ser procesados por el filtro. Cualquier valor entero positivo o negativo de bits, cuyo valor por defecto es 15

‘OutputWordLength’ Determina el tamaño de la palabra usado para los datos filtrados. Cualquier valor entero positivo de bits, por defecto establecido a 16. ‘OutputFracLength’ Determina como el filtro debe interpretar los datos filtrados. Se podrá cambiar el valor de ‘OutputFracLength’ después de establecer la propiedad ‘OutputMode’ al valor ‘SpecifyPrecision’. Cualquier valor entero positivo o negativo de bits, por defecto toma el valor de 15 ó 12 bits dependiendo de la estructura del filtro.

Valores de entrada del filtro

‘OutputMode’ Establece el modo que usa el filtro para escalar los datos de salida del filtro. Puede tomar varios valores:

• ‘AvoidOverflow’: El filtro establece automáticamente la longitud de fracción del dato de salida para evitar el desbordamiento.

• ‘BestPrecision’: El filtro establece automáticamente la longitud de la fracción de los datos de salida para representar con la mejor precisión posible los datos de salida.

• ‘SpecifyPrecision’: Esta opción permite establecer la longitud de la fracción usada para los datos filtrados.

Todos los filtros suelen presentar esta propiedad, salvo los filtros en forma directa I que toman el formato de salida directamente de los estados del filtro.

Valores de salida del filtro

Cuadro 2. 10 Propiedades asociadas a la salida del filtro

2.5.5 Propiedades del objeto ‘dfilt’ asociadas a los estados del filtro. Los valores para los estados del filtro se almacenan en la propiedad ‘States’. Los filtros digitales son sistemas dinámicos y su comportamiento dependerá de las entradas del sistema (estímulos) y de los estados actuales o anteriores, luego se puede decir que el sistema tiene una memoria. Los filtros usan los estados para calcular la salida del filtro para cada una de las muestras de la entrada. La manera de poder usar los estados de los filtros entre iteraciones es el uso de bucles.

Todos los filtros digitales en punto fijo o en punto flotante de doble precisión, también los filtros analógicos, tiene estados. Pero no todos permiten modificar la representación de los estados, es decir la longitud de la palabra y la longitud de la fracción usada para su representación. El valor para las condiciones iniciales de los estados es cero, lo que quiere decir que el filtro dinámico está descansando y en ese momento no tendrá ningún efecto aritmético. Este será el valor que se encuentre la primera muestra de la señal de entrada. El número de estados será un número menor que el número de coeficientes del numerador y del denominador. Estos estados pueden ser valores de tipos diversos. Los más interesantes en el estudio de filtros en punto fijo serán los estados representados mediante objetos ‘fi’, con sus propiedades asociadas.

‘States [1x1 embedded fi]’ Contiene el número y tipo de los estados del filtro antes, durante y después de las operaciones de filtrado. En este caso el estado vendrá dado por un objeto ‘fi’ ‘StateWordLength’ Establece el valor de la longitud de la palabra usada para representar los estados del filtro. Cualquier entero positivo de bits. Por defecto tiene el valor de 16. ‘StateFracLength’ Permite establecer la longitud de la fracción para interpretar los estados del filtro.

Cualquier valor entero positivo o negativo de bits. Por defecto tiene valor de 15. Las siguientes estructuras de filtros son las que no proporcionan el control de la longitud de la palabra que almacenan los estados: df1, dfasymfir, dffir, dfsymfir 1. Para éstas el filtro deriva el formato del estado del formato del valor de entrada que se elija para el filtro, exceptuando para el caso del filtro ‘df1’ IIR, en cuyo caso el formato del numerador del estado viene del formato de la entrada y el formato del denominador del estado viene del formato de la salida del filtro. Las otras estructuras de los filtros permiten el control del formato del estado directamente.

‘StateAutoScale’ Aunque todos los filtros usan estados, no todos permiten que el filtro automáticamente escale el valor del estado para evitar errores aritméticos. Esta propiedad entonces puede tener los siguientes valores:

- ‘StateAutoScale’ = ‘true’: El filtro escoge una longitud de la fracción para mantener el valor de los estados lo más cercano posible a los valores de precisión doble. Cuando se cambien la longitud de la palabra aplicada a los estados ( en la estructura de filtro que nos lo permita), el objeto del filtro cambiará la longitud de la fracción para intentar acomodar el cambio. Su valor por defecto será ‘true’

- ‘StateAutoScale’ = ‘false’: Deshabilita el escalado automático de la longitud de la fracción para los estados y permite que la propiedad que controla la longitud de la fracción de los coeficientes entre etapas puede ser modificado.

Son las siguientes estructuras de filtros las que proporcionan la propiedad ‘StateAutoScale’: df1t, df1tsos, df2t, df2tsos, dffirt. Ejemplo Se muestra en el Cuadro 2.11 y 2.12 como afecta el tipo de dato establecido a los estados.

1 Algunos de estas estructuras están asociadas a filtros IIR. Ver anexo V

Cuadro 2. 11 Propiedad ‘states’

En la visualización de las propiedades de un objeto ’dfilt’, la propiedad de ‘states’ devolvía datos en punto flotante al trabajar con filtros en punto flotante. En cambio tenía asociado objetos ‘fi’ a los estados al trabajar con filtros en punto fijo.

hd.arithmetic='fixed' hd = FilterStructure: 'Direct-Form FIR' Arithmetic: 'fixed' Numerator: [0.0773 0.2938 0.5858 0.7239 0.5858 0.2938 0.0773] ResetBeforeFiltering: 'on' States: [1x1 embedded.fi] NumSamplesProcessed: 0

CoeffWordLength: 16 CoeffAutoScale: 'on' Signed: 'on' InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision'

AccumMode: 'KeepMSB' AccumWordLength: 40 CastBeforeSum: 'on'

RoundMode: 'convergent' OverflowMode: 'wrap'

hd.states ans =

0 0 0 0 0 0 DataType: Fixed Scaling: BinaryPoint Signed: true WordLength: 16 FractionLength: 15 RoundMode: round OverflowMode: saturate ProductMode: FullPrecision MaxProductWordLength: 128 SumMode: FullPrecision MaxSumWordLength: 128 CastBeforeSum: true

hd.states ans = 0 0 0 0 0 0

b = ellip(6,3,50,300/500); hd=dfilt.dffir(b) hd = FilterStructure: 'Direct-Form FIR' Arithmetic: 'double' Numerator: [0.0773 0.2938 0.5858 0.7239

0.5858 0.2938 0.0773] ResetBeforeFiltering: 'on' States: [6x1 double] NumSamplesProcessed: 0

Cuadro 2. 12 Propiedad ‘states’

En el caso de filtros en punto fijo, los estados vienen dados por:

States: [101x1 embedded.fi]

Se puede ver como los filtros en punto fijo dependen en gran parte de los objetos en punto fijo que se definían y con los que se trabajaba en la herramienta en punto fijo. En este caso, la propiedad ‘States’ permite usar un objeto ‘fi’ para definir como el filtro interpreta los estados del filtro.

2.5.6 Desbordamiento y redondeo asociados al objeto ‘dfilt’ Cuadro 2. 13 Redondeo

.

‘RoundMode’ Establece el modo en el que el filtro cuantiza los valores numéricos. Puede tomar varios valores:

• ‘convergent’: Redondea hacia el valor entero más cercano en cualquier dirección. En caso de empate, se redondea hacia el entero par más cercano.

• ‘ceil’: Redondea hacia el valor cuantizado representable más cercano por arriba. • ‘fix’: Redondea hacia el valor representable entero más cercano en la dirección

del cero. • ‘floor’: Redondea hacia abajo cogiendo el valor representable cuantizado más

cercano. • ‘round’: Redondea hacia el valor cuantizable más cercano. Si se tiene que el

número está justo en la mitad de dos valores cuantizables, los valores serán redondeados hacia el valor de arriba.

‘OverflowMode’ Establece como el filtro responde al desbordamiento en condiciones de aritmética en punto fijo. Sus posibles valores son ‘saturate’ que limita la salida a los valores representables máximos y mínimos del rango representable, o ‘wrap’ que establece los valores desbordados al valor más cercano representable usando aritmética en módulo.

Redondeo

Desbordamiento

Cuadro 2. 14 Desbordamiento

2.5.7 Propiedades varias asociadas a los objetos ‘dfilt’

‘NumSamplesProcessed’ Cuando la propiedad ‘ResetBeforeFiltering’ está establecida al valor ‘on’ indica el número de muestras filtradas para cada uno de los datos de entrada establecidos. Estableciendo la propiedad al valor ‘off’ de lo que informará será del número total de muestras procesadas para todos los datos establecidos, no de cada uno. Empieza desde 0 muestras y va creciendo hasta el número de muestras procesadas por el filtro. ‘ResetBeforeFiltering’ Especifica si reseteamos el estado del filtro y la memoria antes de cada operación de filtrado. Puede tomar valores ‘true’ o ‘false’ ‘FilterStructure’

Cada objeto ‘dfilt’ tiene asociada una propiedad denominada ‘FilterStructure’ que determina la forma de implementación del filtro, incluyendo todos los elementos activos que realizan operaciones durante el filtrado, como puede ser ganancias, retrasos, sumas, productos, salidas y entradas. Esta es una propiedad de solo lectura, es decir que una vez creado el objeto del filtro, no se puede modificar el valor de 8su propiedad ‘FilterStructure’ asociada. Además no tiene valor por defecto, se debe inicializar ya que al intentar definir un filtro sin estructura, MATLAB nos devolverá un error.

Sus posibles valores se vieron en la Tabla 2. 3

Ejemplo En la Figura 2. 1 se podrá ver el flujo que la señal sigue en la realización del filtro FIR de segundo orden usando una estructura en forma directa.

Estructura en forma directa de un filtro FIR

InputFormat ProductFormat AccumFormat AccumFormat OutputFormat Input Output Cast NumFormat Cast ProductFormat NumFormat ProductFormat NumFormat

z-1

z-1

b2

b1

b3

++

Figura 2. 1 Filtro FIR en forma directa

Los distintos procesos de cuantización que tienen lugar a lo largo de la implementación del filtro estarán especificados mediante etiquetas de formato, como se puede observar en la Figura 2. 1. Estas etiquetas, que tienen la forma ‘labelformat’, indican la existencia de un proceso de cuantización en ese punto de la estructura. El ‘format’ responde al formato usado para la representación del número en punto fijo, luego dicho formato está compuesto por la longitud de la palabra y la longitud de la fracción. ‘label’ responde al dato sobre el que se está efectuando la cuantización. Por ejemplo, las etiquetas:

• ‘Inputformat’: Cuantización aplicada a los datos de entrada del filtro en la posición donde está situada la etiqueta. Se refiere a las propiedades del filtro ‘InputWordLength’ y ‘InputFracLength’

• ‘Outputformat’: Cuantización aplicada a los datos de salida del filtro en la posición

donde está situada la etiqueta. Se refiere a las propiedades del filtro ‘OutputWordLength’ y ‘OutputFracLength’

• etc....

Donde quiera que aparezca un elemento del filtro en la estructura que se esté usando no hay que olvidar el proceso de cuantización que acompaña a cada uno de estos elementos, como se puede observar en la Figura 2. 1. En ella se observa como la cuantización del producto del coeficiente por la entrada viene seguida por la cuantización de la suma. La cuantización de los productos y sumas vendrán definidas por las etiquetas ‘ProductFormat’ y ‘AccumFormat’ respectivamente. Los coeficientes aparecen etiquetados como b(i), con i = 1, 2, 3, para indicar el orden en el que filtro procesa los datos. Se tienen numerosas estructuras para crear filtros cuantizados. Debido a que la cuantización es un proceso no lineal, dependiendo de la estructura que se aplique se tendrán unos efectos de cuantización u otros, como ya en un apartado previo se comentó. Pero todas las estructuras se pueden representar mediante un diagrama como el anterior, que muestre el formato de los elementos que definen la cuantización que se lleva a cabo a lo largo del flujo del filtro. 2.6 Conclusiones capítulo 2 En este segundo capítulo se ha presentado la herramienta de diseño de filtros de MATLAB con sus distintos objetos asociados. El objeto ‘dfilt’ ha sido la gran novedad del capítulo. A lo largo de éste se han ido definiendo las distintas propiedades asociadas a dicho objeto y relacionadas con la implementación de filtros FIR. Se han adjuntado diversos ejemplos junto con la definición de las propiedades, con el fin de ayudar a la asimilación de los nuevos conceptos. Aunque resulta un capítulo bastante teórico y tedioso, resulta una introducción útil para comprender el diseño de filtros en punto fijo sobre una FPGA que se llevará a cabo en capítulos posteriores.