Professional Documents
Culture Documents
2.1 Introducción
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.
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.
No
¿Resultados
buenos?
Programar la FPGA
No
¿Resultados
buenos?
Finalizado proceso
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.
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:
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.
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.
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.
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.
^x[n]=e[n]+x[n]
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.
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:
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.
Ejemplo
Se diseña un filtro FIR en punto flotante paso b = fir1(101, .45, 'low', kaiser(102, 7.8573));
de baja, usando el método de ventanas.
Se almacenan los coeficientes en la variable ‘b’
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'
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’.
Orden Definición
dfilt.dfasymfir
FIR en forma directa antisimétrica
dfilt.scalar Escalar
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:
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 podrá observar como el filtro posee muchas más propiedades asociadas para un valor de
‘arithmetic’ que para el otro.
‘Arithmetic’=’double’ ‘Arithmetic’=’fixed’
hd= dfilt.dffir hd.arithmetic= 'fixed'
hd = hd =
FilterStructure: 'Direct-Form FIR' FilterStructure: 'Direct-Form FIR'
Arithmetic: 'double' Arithmetic: 'fixed'
Numerator: 1 Numerator: 1
ResetBeforeFiltering: 'on' ResetBeforeFiltering: 'on'
States: [0x1 double] States: [0x1 embedded.fi]
NumSamplesProcessed: 0 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'
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.
V= get(H,’nombre de la propiedad’)
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.
‘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’.
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
hd.CoeffWordLength
ans =
16
f = [0 0.6 0.6 1]; m = [1 1 0 0];
hd.NumFracLength
b = fir2(5,f,m);
ans =
16
hd = dfilt.dffir(b);
hd.CoeffWordLength = 24;
hd.arithmetic='fixed';
hd.NumFracLength
ans =
hd. Numerator
24
ans =
-0.0101 0.0262 0.4695 0.4695
hd.CoeffAutoScale= false;
0.0262 -0.0101
hd.numfraclength=15;
hd.coeffwordlength=5;
hd.numerator
ans =
1.0e-003 *
-0.4883 0.4578 0.4578 0.4578
0.4578 -0.4883
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.
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
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.
‘AccumWordLength’
Longitud de la palabra usada para almacenar los resultados del acumulador.
Cualquier valor entero positivo de bits, tomando por defecto el valor 40. Resultados
de
‘AccumFracLength’ sumas
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
‘ProductWordLength’
Longitud de la palabra usada para almacenar los resultados de las operaciones de
multiplicación.
Resultados Puede tomar valores positivos de bits. Por defecto toma valores de 16 ó 32 dependiendo
de del tipo de estructura usada en el filtro.
productos.
‘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.
‘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.
Etapas de
‘TapSumFracLength’ un filtro
Longitud de la fracción usada para representar los valores de una etapa del filtro en FIR
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.
‘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.
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.
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’.
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.
Single
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.
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..
Fixed ‘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.
‘CastBeforeSum’
Esta propiedad determina como el filtro maneja los valores de entrada en las operaciones de suma. Sus
posibles valores son ‘true’ y ‘false’.
Convierte el formato de los operandos al formato Los operandos mantienen el formato que traían
de la salida de la suma antes de llevar a cabo la de operaciones anteriores y son convertidos tras
operación de suma. realizar la suma.
Realizar la conversión antes de sumar los En este caso se tienen menos operaciones de
sumandos añade uno o dos operaciones de cuantización que en el caso anterior.
cuantización adicionales que pueden añadir Hay que elegir los formatos de entrada para
fuentes de error a los resultados de nuestro filtro. obtener la mayor exactitud en los resultados de
las sumas.
La suma de los elementos viene representada La suma de los elementos en el filtro viene
por el siguiente diagrama: representado en el siguiente diagrama:
AccumFormat
Cast
Muestra que los datos de entrada en las
operaciones de suma, es decir los sumandos,
Muestra que los datos de entrada se obtienen mantienen su formato, longitud de palabra y
de convertir al formato de salida cada uno de longitud de fracción, de operaciones
los sumandos antes de realizar la operación de anteriores. El proceso de suma usa el formato
suma. existente en las entradas, después se
El valor de salida de la operación de suma convierten al formato de salida definido por
tendrá una longitud de palabra y longitud de ‘AccumFormat’. El dato de salida tiene su
fracción definidas por ‘AccumWordLength’, longitud de palabra y longitud de fracción
‘AccumFracLength’ y ‘AccumMode’. definidas por ‘AccumWordLength’,
‘AccumFracLength’ y ‘AccumMode’.
‘TapSumMode’
Especifica como el acumulador almacena las salidas de las operaciones de suma que
involucran las etapas del filtro FIR. Resultado de
Como valores posibles se tiene ‘FullPrecision’, ‘KeepLSB’, ‘KeepMSB’, y sumas de las
‘SpecifyPrecision’. etapas de
Los filtros FIR simétricos ( dfilt.dfsymfir ) y antisimétricos ( dfilt.dfasymfir ) son los que filtros FIR
incluyen esta propiedad.
Toma como valor por defecto el valor ‘KeepMSB’.
Cuadro 2. 6 Propiedades de las etapas del filtro FIR
‘ AccumMode’ y ‘ProductMode’
Resultado Ambas propiedades estarán disponibles cuando se establezca aritmética en punto fijo.
de sumas y Determina como el acumulador y el multiplicador respectivamente almacenan el resultado
productos obtenido de las operaciones aritméticas que llevan a cabo sumas y productos.
Los valores que puede tomar son ‘FullPrecision’, ‘KeepMSB’, ‘KeepLSB’ y
‘SpecifyPrecision’.
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
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’
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’.
hd.ProductMode= 'FullPrecision';
hd.ProductWordLength
hd.ProductFracLength
b = fir1(101, .45,
ans =
'low', kaiser(102, 7.8573));
32
hd = dfilt.dffir(b);
ans =
31
set(‘Arithmetic’,’fixed’);
hd.AccumMode = 'FullPrecision';
hd.AccumWordLength
hd.AccumFracLength
ans =
40
ans =
31
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.
‘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
Valores de dependiendo de la estructura del filtro.
salida 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.
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
b = ellip(6,3,50,300/500);
hd=dfilt.dffir(b) hd.states
hd = ans =
FilterStructure: 'Direct-Form FIR'
Arithmetic: 'double' 0
Numerator: [0.0773 0.2938 0.5858 0.7239 0
0.5858 0.2938 0.0773] 0
ResetBeforeFiltering: 'on' 0
States: [6x1 double] 0
NumSamplesProcessed: 0 0
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 = hd.states
FilterStructure: 'Direct-Form FIR' ans =
Arithmetic: 'fixed'
Numerator: [0.0773 0.2938 0.5858 0
0.7239 0.5858 0.2938 0.0773] 0
ResetBeforeFiltering: 'on' 0
States: [1x1 embedded.fi] 0
NumSamplesProcessed: 0 0
0
CoeffWordLength: 16
CoeffAutoScale: 'on' DataType: Fixed
Signed: 'on' Scaling: BinaryPoint
Signed: true
InputWordLength: 16 WordLength: 16
InputFracLength: 15 FractionLength: 15
RoundMode: 'convergent'
OverflowMode: 'wrap'
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’
‘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.
Redondeo ‘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.
Cuadro 2. 13 Redondeo
.
‘OverflowMode’
Establece como el filtro responde al desbordamiento en condiciones de aritmética en punto
fijo. Desbordami
Sus posibles valores son ‘saturate’ que limita la salida a los valores representables máximos ento
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.
Cuadro 2. 14 Desbordamiento
‘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.
Input b1 + +
Output
Cast z-1 NumFormat Cast
ProductFormat
b2
NumFormat
z-1
ProductFormat
b3
NumFormat
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:
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.
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.