Unidad 1 · Filtrado digital · definición, estabilidad, fase lineal, los cuatro tipos, costo y diseño por ventanas
Un FIR calcula cada muestra de salida con las últimas muestras de entrada y nada más: no mira salidas anteriores. De esa sola restricción sale todo lo demás. Su respuesta al impulso dura muestras, así que no puede volverse inestable. Sus coeficientes son esa misma respuesta al impulso, así que se los puede elegir simétricos, y un FIR simétrico tiene fase exactamente lineal. El precio es el largo: una transición angosta pide muchos coeficientes, y cada uno es una multiplicación por muestra.
La ecuación en diferencias de un FIR de coeficientes, como está en la filmina:
Es la ecuación en diferencias general del apunte sin la parte recursiva: ningún término del lado derecho. Por eso en MATLAB se filtra con filter(h, 1, x): el denominador es 1.
Los coeficientes son la respuesta al impulso. Con , cada término de la suma vale , que es distinto de cero sólo en . Así que la salida en el instante es el coeficiente número . No hay nada que calcular para pasar de la ecuación a : se lee.
Dura muestras. Para ningún término de la suma alcanza al impulso, y . De ahí el nombre, respuesta al impulso finita. A cada coeficiente se le dice tap, derivación, por el hardware que lo implementa: una línea de retardos con una derivación por coeficiente, que es el FIR transversal. «Un FIR de 41 taps» es un FIR con .
El ejemplo más simple es la media móvil: coeficientes iguales a . El del script de la clase, Ejemplo_filtros.m, tiene siete: [0.1 0.2 0.3 0.4 0.3 0.2 0.1], dividido por su suma para que la ganancia en continua sea 1.
La transformada Z de tiene tantos términos como coeficientes:
No hay denominador: es un polinomio de grado en . Multiplicando y dividiendo por se ve qué raíces tiene:
Arriba, ceros, que pueden caer en cualquier lugar del plano. Abajo, polos, todos en . Todo lo que el filtro hace con las frecuencias lo deciden los ceros; los polos del origen sólo aportan retardo. Cómo leer esos ceros en el plano, y qué le hacen a según lo cerca que estén del círculo unitario, es de la nota de polos y ceros. La respuesta en frecuencia es este mismo polinomio evaluado en .
Un sistema LTI es estable BIBO si su respuesta al impulso es absolutamente sumable. Para un FIR la suma tiene términos finitos, así que es finita siempre, sean cuales sean los coeficientes. La cota sale directo de la ecuación: si la entrada cumple ,
Visto en el plano Z es lo mismo: la condición de estabilidad pide todos los polos adentro del círculo unitario, y los del FIR están en el origen. No hay coeficiente que los mueva. Lo que se pierde por no realimentar es la memoria larga barata: un IIR de un polo, , recuerda para siempre con una multiplicación, y a cambio puede explotar. Eso es de la nota del filtro IIR.
La filmina clasifica los FIR por la simetría de sus coeficientes. Simetría positiva es : el primero igual al último, el segundo igual al anteúltimo. Simetría negativa es . En los dos casos el centro de simetría está en
que cae sobre una muestra si es impar y entre dos si es par. Se parte de la DTFT, que para un FIR es una suma finita:
Paso 1: sacar la fase del centro. Se saca de factor común , y cada exponente queda medido desde el centro:
Paso 2: juntar cada coeficiente con su espejo. El coeficiente está a distancia del centro, y su espejo está a la misma distancia del otro lado, . Con simetría positiva los dos tienen el mismo valor, y el par suma dos exponenciales conjugadas:
Con impar sobra el coeficiente del centro, , que está a distancia cero y entra tal cual.
Paso 3: lo que queda es real. La suma de los pares es una suma de cosenos con coeficientes reales:
Toda la parte imaginaria de vive en el primer factor, que tiene módulo 1 y fase . es real pero puede cambiar de signo, y donde lo hace la fase salta : son los saltos que se ven en la banda suprimida de cualquier FIR simétrico, y no atrasan nada, porque caen en frecuencias que el filtro anula. Entre salto y salto la pendiente es siempre la misma, así que el retardo de grupo es constante:
Con simetría negativa el paso 2 cambia un signo: el par da , y el coeficiente del centro, que tendría que ser igual a menos sí mismo, es cero. Lo que queda es por una suma real de senos, y esa suma a la fase:
La pendiente es la misma, así que el retardo de grupo también es . Es fase lineal generalizada: la envolvente llega entera y a tiempo, y la portadora sale girada 90°. Y la conclusión no es una aproximación: es álgebra. En el ensayo del elíptico está la cuenta con los siete coeficientes de la filmina, y lo que le pasa a un filtro que no tiene esta simetría.
Signo de la simetría por paridad de dan los cuatro tipos de la filmina. Lo que los distingue está en las distancias al centro, : son enteras si es impar y semienteras si es par. Evaluando la suma de cosenos o de senos en y en aparecen ceros que ningún coeficiente puede evitar:
| tipo | simetría | N | fase | se anula en | no puede ser | ejemplo |
|---|---|---|---|---|---|---|
| 1 | positiva | impar | — | — | [1 2 3 2 1] | |
| 2 | positiva | par | pasaaltos, rechazabanda | [1 2 3 3 2 1] | ||
| 3 | negativa | impar | y | pasabajos, pasaaltos, rechazabanda | [1 2 0 -2 -1] | |
| 4 | negativa | par | pasabajos, rechazabanda | [1 2 3 -3 -2 -1] |
Con los ejemplos de la tabla las cuentas se hacen a mano, porque es la suma de los coeficientes y la suma con signos alternados. Dan 9 y 1 para el tipo 1, 12 y 0 para el tipo 2, 0 y 0 para el tipo 3, 0 y 4 para el tipo 4. Lo que la tabla dice es más fuerte que los ejemplos: esos ceros están para cualquier elección de coeficientes con esa simetría. Un pasaaltos de fase lineal tiene que ser tipo 1 o tipo 4. Los tipos 3 y 4, con su giro de y su cero en continua, son los naturales para diferenciadores y transformadores de Hilbert. Y el retardo es entero en los tipos 1 y 3 y semientero en los 2 y 4: la salida de un FIR de par cae entre dos muestras de la entrada, lo que complica alinearla con otra señal.
Ceros forzados sobre el círculo unitario en o en : es la misma afirmación leída en el plano Z, donde la simetría obliga además a que los ceros vengan en pares recíprocos. Eso se cuenta en polos y ceros.
El retardo. Un FIR de fase lineal atrasa todas las frecuencias muestras, o segundos. Un filtro de 41 taps atrasa 20 muestras. No deforma, porque es el mismo para todas, y se compensa descontándolo. Pero no se puede evitar: un filtro causal que promedia hacia atrás devuelve el promedio tarde, y por eso el suavizado se paga en retardo.
Las multiplicaciones. Cada muestra de salida es una suma de productos: multiplicaciones y sumas por muestra. Con coeficientes simétricos se pueden sumar primero las dos muestras que van a multiplicar al mismo coeficiente, y las multiplicaciones bajan a la mitad; esa estructura, y la línea de retardos que la sostiene, son del FIR transversal. Lo que no baja es el crecimiento: para una misma atenuación, el largo crece como la inversa del ancho de transición. Por eso un IIR, que con un polo cerca del círculo hace una transición angosta en pocas multiplicaciones, puede ser mucho más barato, y cuánto más depende de la transición: el «diez veces» no es constante.
Diseñar un FIR es elegir sus coeficientes. El método que la filmina desarrolla, y el que hace fir1 por dentro, son tres pasos.
Paso 1: la respuesta ideal. Se escribe la que se querría y se anti-transforma. Para un pasabajos de corte sale un sinc:
Es infinito hacia los dos lados y no causal: ningún filtro real lo implementa.
Paso 2: truncar y correr. Se toman las muestras centrales y se corren para que el filtro sea causal. El sinc es par, así que lo que queda es simétrico, y el corrimiento es justamente el retardo de la sección 04.
Paso 3: multiplicar por una ventana. Truncar de golpe deja un rizado junto al corte que no baja con más coeficientes. Para suavizarlo se multiplica por una ventana que cae a cero de a poco:
Las ventanas de la cátedra —rectangular, Hamming, Blackman— son simétricas, así que el producto también lo es: la fase lineal sale gratis, sin pedirla. Con impar el resultado es tipo 1; con par, tipo 2, con su cero en . La ventana se elige por la atenuación que pide la máscara de tolerancias, y por el ancho de transición: más coeficientes angostan la transición, pero no bajan el rizado, que depende sólo de la ventana. Por qué pasa eso, y cuánto atenúa cada ventana, es del fenómeno de Gibbs.
En MATLAB los tres pasos son una línea: fir1(N-1, wc/pi, ventana). Pide el orden, , no la cantidad de coeficientes; el corte va normalizado a ; y si no se le pasa ventana usa Hamming. Hace una sola cosa más que la receta: divide por la suma de los coeficientes, para que la ganancia en continua sea exactamente 1. Con 41 coeficientes y corte en , la receta sin normalizar suma 0,998433, y una vez normalizada coincide con fir1 hasta 1,1×10⁻¹⁶.
Mientras los coeficientes sean espejo unos de otros, el retardo de grupo es una recta horizontal en , se muevan como se muevan: el módulo cambia, el retardo no. La simetría la tienen los valores, no el botón: con «Ninguna» y los coeficientes todavía espejados, nada cambia hasta que se toca uno. Tocarlo basta. En fir1(8, 0.4), llevar de −0,0136 a 0,09 hace que el retardo vaya de 0,49 a 4,77 muestras según la frecuencia, medido donde supera el 1 % de su máximo. Y con par y simetría positiva, se queda en cero por más que se arrastre: el tipo 2 no llega a .
Un pasabajos de 41 coeficientes con corte en , diseñado, medido y usado. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% 1. El diseño: 41 coeficientes, corte en 0,4π, Hamming (la ventana por omisión) N = 41; h = fir1(N-1, 0.4); % pide el ORDEN, N-1, y el corte normalizado a π fprintf('taps = %d suma = %.4f asimetria = %g\n', length(h), sum(h), max(abs(h - fliplr(h)))) % taps = 41 suma = 1.0000 asimetria = 0 %% 2. Es la receta: sinc ideal por ventana, normalizado a ganancia 1 en continua n = -(N-1)/2 : (N-1)/2; hD = sin(0.4*pi*n) ./ (pi*n); hD(n == 0) = 0.4; % L'Hôpital: wc/pi hw = hD .* hamming(N).'; % hamming devuelve una columna fprintf('max |fir1 - receta| = %.1e\n', max(abs(h - hw/sum(hw)))) % max |fir1 - receta| = 1.1e-16 %% 3. La respuesta al impulso son los coeficientes hi = impz(h, 1); fprintf('largo de impz = %d max |impz - h| = %g\n', length(hi), max(abs(hi.' - h))) figure; stem(0:N-1, h, 'filled'); grid on; xlabel('n'); ylabel('h[n]') % largo de impz = 41 max |impz - h| = 0 %% 4. El módulo w = linspace(0, pi, 200001); H = freqz(h, 1, w); HdB = 20*log10(abs(H)); figure; plot(w/pi, HdB); grid on; ylim([-90 5]); xlabel('\omega / \pi'); ylabel('|H| [dB]') Hc = freqz(h, 1, [0.4*pi, pi]); fprintf('|H| en 0.4pi = %.2f dB en pi = %.2f dB\n', 20*log10(abs(Hc))) fprintf('desvio maximo en [0, 0.3pi] = %.4f\n', max(abs(abs(H(w <= 0.3*pi)) - 1))) fprintf('peor valor en [0.5pi, pi] = %.2f dB\n', max(HdB(w >= 0.5*pi))) % |H| en 0.4pi = -6.01 dB en pi = -61.16 dB % desvio maximo en [0, 0.3pi] = 0.0033 % peor valor en [0.5pi, pi] = -53.60 dB %% 5. El retardo de grupo: constante, (N-1)/2 disp(grpdelay(h, 1, [0.1 0.2 0.3 0.35]*pi).') % 20 20 20 20 %% 6. filter: un coseno en la banda de paso y otro en la suprimida nn = 0:199; x = cos(0.1*pi*nn) + cos(0.7*pi*nn); y = filter(h, 1, x); figure; plot(nn, x, ':', nn, y); grid on; xlabel('n') e = y(41:end) - cos(0.1*pi*(nn(41:end) - 20)); fprintf('max |y[n] - cos(0.1pi(n-20))| para n >= 40: %.4f\n', max(abs(e))) % max |y[n] - cos(0.1pi(n-20))| para n >= 40: 0.0011 %% 7. Los cuatro tipos: qué fuerza cada simetría en 0 y en π T = {[1 2 3 2 1], [1 2 3 3 2 1], [1 2 0 -2 -1], [1 2 3 -3 -2 -1]}; for t = 1:4 Ht = freqz(T{t}, 1, [0 pi]); g = grpdelay(T{t}, 1, [0.2 0.6]*pi); fprintf('tipo %d: |H(0)| = %.3g |H(pi)| = %.3g retardo = %.1f\n', ... t, abs(Ht(1)), abs(Ht(2)), g(1)) end % tipo 1: |H(0)| = 9 |H(pi)| = 1 retardo = 2.0 % tipo 2: |H(0)| = 12 |H(pi)| = 2.45e-16 retardo = 2.5 % tipo 3: |H(0)| = 0 |H(pi)| = 0 retardo = 2.0 % tipo 4: |H(0)| = 0 |H(pi)| = 4 retardo = 2.5 %% 8. fir1 no te deja hacer un pasaaltos de tipo 2 hp = fir1(41, 0.4, 'high'); fprintf('fir1(41, 0.4, ''high'') devuelve %d coeficientes\n', length(hp)) % Warning: Odd order symmetric FIR filters must have a gain of zero at the % Nyquist frequency. The order is being increased by one. % fir1(41, 0.4, 'high') devuelve 43 coeficientes
Lo que dice cada bloque:
impz devuelve los mismos 41 números: la respuesta al impulso de un FIR no se calcula, se lee.fir1 es el punto de −6 dB, mitad de amplitud, no el de −3 dB: en da −6,01 dB. Hasta el módulo se aparta de 1 en 0,0033 como mucho, y desde atenúa al menos 53,60 dB. La transición entre los dos niveles de rizado, medida entre donde baja de y donde baja de , con el peor lóbulo de la banda suprimida, va de a : mide .Y los detalles que muerden:
fir1 pide el orden. fir1(40, ...) da 41 coeficientes. Y si el orden es impar y se pide un pasaaltos, lo sube solo, con un aviso (bloque 8): con par el filtro sería tipo 2, y el tipo 2 no puede dejar pasar .freqz o grpdelay no es una frecuencia. freqz(h, 1, 0.4*pi) lee el tercer argumento como la cantidad de puntos. Por eso los bloques 4, 5 y 7 le pasan siempre un vector de al menos dos frecuencias.hamming(N) es una columna y fir1 devuelve una fila: sin la trasposición del bloque 2, el producto elemento a elemento arma una matriz de 41 por 41 sin avisar.filter no descuenta el retardo. La salida está corrida muestras respecto de la entrada, y para compararlas hay que correr una de las dos, como hace el bloque 6.fir1(N-1, wc/pi, ventana), normalizado a ganancia 1 en continua, con el corte en −6 dB.