Unidad 1 · Filtrado digital · la convolución con la ventana, el límite de la integral seno, las ventanas y el análisis en MATLAB
Cuando una función con un salto se arma con una cantidad finita de términos, la suma no llega al salto derecho: se pasa, vuelve y oscila a los dos lados. Eso es el fenómeno de Gibbs. En filtros aparece cada vez que se corta la respuesta al impulso de un filtro ideal, y deja un sobrepico que tiende a un 8,95 % del salto, sin importar cuántos coeficientes se usen.
Sea una función con una discontinuidad de salto , y una aproximación que la reconstruye con términos: una serie de Fourier truncada, o un filtro con la respuesta al impulso ideal cortada a muestras. El fenómeno de Gibbs es que, cerca del salto, la aproximación se pasa del valor de llegada y oscila alrededor de él. El sobrepico es cuánto se pasa, medido como fracción del salto:
En el pasabajos el salto es el de la plantilla ideal en , de 1 a 0, así que y el sobrepico es directamente cuánto se pasa de 1 en la banda de paso.
Las dos situaciones son la misma. La respuesta en frecuencia de un filtro discreto es periódica de período , y la DTFT es su serie de Fourier: los coeficientes de la serie son las muestras . Quedarse con muestras es quedarse con términos de la serie de un rectángulo, que es el caso clásico en el que se descubrió el fenómeno.
El punto de partida es el de la filmina del método de ventana: el pasabajos ideal vale 1 entre y y 0 en el resto del período. Su respuesta al impulso sale de la DTFT inversa:
Es la de la filmina, con , y el valor en sale por L'Hôpital. Es infinita hacia los dos lados. Para usarla hay que cortarla, y el corte es lo que produce el rizado.
Paso 1: truncar es multiplicar por una ventana. Quedarse con las muestras centrales (con impar) es multiplicar por una ventana que vale 1 para y 0 afuera. Es la ventana rectangular: no usar ventana es usar la más brusca de todas.
Después se corre muestras para que sea causal. El corrimiento sólo agrega una fase lineal y no toca el módulo, así que todo lo que sigue se hace con la versión centrada, cuya es real.
Paso 2: multiplicar en el tiempo es convolucionar en frecuencia. Con la DTFT de la ventana, la convolución es circular, sobre un período:
Es el panel (c) de la filmina: sale de pasar por encima de . Para la rectangular centrada, es una serie geométrica que se suma igual que la de la media móvil:
Es el núcleo de Dirichlet, derivado paso a paso en la media móvil: la misma sinc periódica, sin el y sin la fase porque acá está centrada. Tiene un lóbulo principal de alto con ceros en , y lóbulos laterales que alternan de signo y cuyo primero está a −13,26 dB.
Paso 3: contra un rectángulo, la convolución es una integral entre dos bordes. vale 1 en y 0 afuera, así que sólo recorta el intervalo de integración. Cambiando la variable a :
es el área de que cae adentro de una ventana de ancho . Contra freqz, con y , esta integral hecha con integral da lo mismo en cinco frecuencias con una diferencia de 7×10⁻¹⁶ como máximo.
Paso 4: cerca del borde sólo importa el borde. La integral de sobre un período entero vale , porque de toda la suma sólo sobrevive el término . Cuando está cerca de , el límite de arriba, , cae lejos del lóbulo principal, donde ya es una cola chica que alterna. Despreciándola, y usando que es par:
Cerca del corte, es la integral acumulada de la transformada de la ventana, hasta la distancia que queda al borde. Lejos adentro de la banda de paso esa integral ya juntó casi toda el área y vale casi 1; justo en juntó la mitad; lejos afuera, casi nada. Cada lóbulo lateral de que entra o sale suma o resta un poco, y eso es el rizado.
Paso 1: con N grande el núcleo es una sinc. El lóbulo principal y los primeros laterales viven en del orden de , donde :
Paso 2: cambiar a la variable del lóbulo. Con es y . Las se cancelan todas:
Paso 3: la integral acumulada es la integral seno. El límite de abajo, , pasa a , que para grande es . Con y :
Paso 4: el máximo cae en el primer cero. La derivada respecto de es , que se anula en . De todos esos extremos el mayor es el primero, : hasta ahí se sumó todo el lóbulo principal y nada del primer lóbulo negativo. Vale
Un sobrepico de 8,95 % del salto. no tiene forma más simple, pero se calcula a cualquier precisión: integral(@(x) sin(x)./x, 0, pi) da 1,8519, y con él 1,0895. El 9 % que dice el apunte es este número redondeado.
De la misma cuenta salen dos cosas más. Dónde está el pico: es , una mitad de lóbulo principal antes del corte. Cuánto rechaza la banda suprimida: del otro lado del corte, el extremo más grande es , y como es impar vale . El primer lóbulo de la banda suprimida tiene exactamente la altura del sobrepico:
Los −21 dB de la ventana rectangular no son un dato de tabla: son el mismo 8,95 % visto del otro lado del salto. Y no son los −13 dB del primer lóbulo lateral de . El filtro no copia la altura de los lóbulos de la ventana: acumula su área, y el área de un lóbulo lateral es mucho más chica que su pico.
En la forma de la sección anterior, sólo aparece adentro de . Cambiar estira o comprime el eje de frecuencia, pero la curva tiene siempre la misma altura. Más taps no bajan el pico: lo acercan al corte, como . La tesis entera, con su propio widget, está en el ensayo sobre el rizado. Acá van los números. Pasabajos de con ventana rectangular, medido en MATLAB sobre 262 145 frecuencias entre 0 y :
| N | sobrepico | pico antes del corte ÷ (2π/N) | banda suprimida |
|---|---|---|---|
| 13 | 6,83 % | 0,94 | −19,08 dB |
| 21 | 9,67 % | 1,05 | −21,30 dB |
| 25 | 10,38 % | 1,00 | −22,29 dB |
| 41 | 9,26 % | 1,03 | −21,17 dB |
| 81 | 9,09 % | 1,01 | −21,08 dB |
| 161 | 9,02 % | 1,01 | −21,02 dB |
| 321 | 8,98 % | 1,00 | −21,00 dB |
| 1001 | 8,96 % | 1,00 | −20,97 dB |
| ∞ | 8,95 % | 1 | −20,96 dB |
La columna del medio es la distancia del pico al corte, medida en mitades de lóbulo principal: se clava en 1, como predice el paso 4. La primera y la última columna se van a los valores de la integral seno. Pero no bajan de a poco: oscilan. De a , los dos casos de la filmina, el sobrepico sube de 6,83 % a 10,38 %. Barriendo todos los impares de un tramo:
| N impares | sobrepico mínimo | sobrepico máximo |
|---|---|---|
| 11 a 31 | 6,83 % | 11,46 % |
| 101 a 121 | 8,69 % | 9,27 % |
| 1001 a 1021 | 8,92 % | 8,98 % |
Con finito el paso 4 no es exacto: la cola de en el otro borde, a de distancia, suma o resta un poco según dónde caiga el corte respecto de los ceros de . Con esos ceros se repiten cada 2,5 muestras, y el patrón se repite cada 10 valores de . Un caso extremo lo muestra: y dan el mismo 9,67 %, porque las dos muestras que agrega el 21 son : es el mismo filtro. La franja se cierra sobre 8,95 % al crecer , pero no se cierra hacia cero.
Si el rizado es la integral acumulada de , para bajarlo hay que cambiar . El método de la filmina es el mismo , con una ventana que en vez de cortar de golpe baja hasta casi cero en los bordes. Las dos de la cátedra, escritas para como las genera MATLAB:
Un corte suave tiene una transformada con lóbulos laterales mucho más bajos, que es lo que baja el rizado. Pero el lóbulo principal se ensancha: con su primer cero cae en 1,00, 2,00 y 3,00 veces para la rectangular, Hamming y Blackman. La transición de dura lo que tarda ese lóbulo en cruzar el borde, así que se ensancha con él. Las filminas 28 y 29 lo muestran con . Medido sobre el pasabajos, con y el mismo para las tres:
| ventana | sobrepico | banda suprimida | transición ÷ (2π/N) | lóbulo de W |
|---|---|---|---|---|
| rectangular | 9,26 % | −21,17 dB | 0,95 | −13,24 dB |
| Hamming | 0,168 % | −53,61 dB | 3,41 | −42,12 dB |
| Blackman | 0,018 % | −75,30 dB | 5,73 | −58,12 dB |
La transición se midió como la distancia entre el último punto de la banda de paso con y el primero de la suprimida con , con el peor lóbulo de la banda suprimida. En unidades de es casi constante: con da 0,93, 3,35 y 5,62. La banda suprimida, en cambio, casi no se mueve con para ninguna de las tres: −53,61 dB con 21 taps y −53,97 dB con 161 para Hamming, −74,36 y −75,29 dB para Blackman. El canje queda así: la ventana decide cuánto rechaza el filtro, y decide qué tan angosta es la transición. Por eso con Blackman, para la misma transición que la rectangular, hacen falta unas seis veces más taps. Cómo se usa eso para cumplir una máscara es tema del diseño del FIR.
La última columna es el peor lóbulo lateral de la ventana sola, que es el número de las tablas. El apunte da −13, −41 y −57 dB. El de Hamming depende de : medido, va de −40,64 dB con a −42,67 dB con . El de Blackman se queda entre −58,1 y −58,3 dB. En los tres casos el filtro rechaza bastante más de lo que dice ese lóbulo, por la razón de la sección 03: el filtro acumula áreas, no alturas. Y ojo al medirlo: con Hamming y Blackman el primer lóbulo lateral no es el peor, así que hay que tomar el máximo de toda la banda.
Lo que conviene mirar es el borde derecho del rectángulo, en , mientras se le acerca. Con la rectangular, el máximo de abajo llega cuando el primer cero de toca el borde, con la lectura del borde en 1: todo el lóbulo principal adentro, el primer lóbulo negativo afuera. Un poco más y el lóbulo negativo empieza a entrar y baja. Con otro todo pasa igual, más apretado contra . Con Hamming o Blackman y el mismo , los lóbulos laterales casi no se ven, la curva de abajo llega a 1 sin pasarse visiblemente, y el lóbulo principal tarda mucho más en cruzar el borde. Al llegar a las tres lecturas del recorrido dan los números de la tabla.
Las mediciones de la nota, con fir1 y las tres ventanas. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% 1. El valor límite, por la integral seno Si = integral(@(x) sin(x)./x, 0, pi); fprintf('Si(pi) = %.4f 1/2 + Si(pi)/pi = %.4f\n', Si, 0.5 + Si/pi) fprintf('lóbulo en banda suprimida: %.2f dB\n', 20*log10(Si/pi - 0.5)) % Si(pi) = 1.8519 1/2 + Si(pi)/pi = 1.0895 % lóbulo en banda suprimida: -20.96 dB %% 2. Sobrepico, atenuación y transición, para tres ventanas y cuatro N wc = 0.4; % corte, en unidades de pi w = linspace(0, pi, 2^18 + 1); % vector: nunca un escalar ventanas = {@rectwin, @hamming, @blackman}; for iv = 1:3 fprintf('%s\n', func2str(ventanas{iv})) for N = [21 41 81 161] h = fir1(N-1, wc, ventanas{iv}(N), 'noscale'); % orden N-1: N taps H = abs(freqz(h, 1, w)); sobrepico = (max(H(w <= wc*pi)) - 1) * 100; Hs = H(w > wc*pi); ws_ = w(w > wc*pi); k = find(diff(Hs) > 0, 1); % primer mínimo: ahí empieza el rizado d = max(Hs(k:end)); % el peor lóbulo, no el primero wp = w(find(H >= 1 - d & w <= wc*pi, 1, 'last')); ws = ws_(find(Hs <= d, 1)); fprintf(' N = %3d sobrepico %7.4f %% As %7.2f dB transición %.2f x 2pi/N\n', ... N, sobrepico, 20*log10(d), (ws - wp) * N / (2*pi)) end end % rectwin % N = 21 sobrepico 9.6716 % As -21.30 dB transición 0.98 x 2pi/N % N = 41 sobrepico 9.2573 % As -21.17 dB transición 0.95 x 2pi/N % N = 81 sobrepico 9.0905 % As -21.08 dB transición 0.94 x 2pi/N % N = 161 sobrepico 9.0167 % As -21.02 dB transición 0.93 x 2pi/N % hamming % N = 21 sobrepico 0.1643 % As -53.61 dB transición 3.50 x 2pi/N % N = 41 sobrepico 0.1680 % As -53.61 dB transición 3.41 x 2pi/N % N = 81 sobrepico 0.1834 % As -53.81 dB transición 3.37 x 2pi/N % N = 161 sobrepico 0.1900 % As -53.97 dB transición 3.35 x 2pi/N % blackman % N = 21 sobrepico 0.0338 % As -74.36 dB transición 6.28 x 2pi/N % N = 41 sobrepico 0.0181 % As -75.30 dB transición 5.73 x 2pi/N % N = 81 sobrepico 0.0173 % As -75.30 dB transición 5.66 x 2pi/N % N = 161 sobrepico 0.0172 % As -75.29 dB transición 5.62 x 2pi/N %% 3. El sobrepico con la rectangular no baja: oscila y se cierra sobre 8,95 % for tramo = {11:2:31, 101:2:121, 1001:2:1021} s = zeros(size(tramo{1})); for i = 1:numel(tramo{1}) N = tramo{1}(i); H = abs(freqz(fir1(N-1, wc, rectwin(N), 'noscale'), 1, w(w <= wc*pi))); s(i) = (max(H) - 1) * 100; end fprintf('N de %4d a %4d: sobrepico entre %.2f %% y %.2f %%\n', ... tramo{1}(1), tramo{1}(end), min(s), max(s)) end % N de 11 a 31: sobrepico entre 6.83 % y 11.46 % % N de 101 a 121: sobrepico entre 8.69 % y 9.27 % % N de 1001 a 1021: sobrepico entre 8.92 % y 8.98 % %% 4. La trampa de la escala: fir1 por omisión normaliza la ganancia en continua h = fir1(20, wc, rectwin(21)); % sin 'noscale' H = abs(freqz(h, 1, w)); fprintf('N = 21 con escala: sobrepico %.2f %%, suma de h = %.4f\n', ... (max(H(w <= wc*pi)) - 1) * 100, sum(fir1(20, wc, rectwin(21), 'noscale'))) % N = 21 con escala: sobrepico 14.63 %, suma de h = 0.9568
Cuatro detalles que muerden si no se los conoce:
fir1 pide el orden, no los taps. fir1(N-1, ...) da coeficientes, y la ventana que se le pasa tiene que medir : hamming(N), no hamming(N-1). Y el corte va normalizado a : el 0.4 es .fir1 escala el filtro. Divide por su suma para que la ganancia en continua dé exactamente 1. Con la rectangular eso cambia el sobrepico, porque en el rizado no vale 1: con la suma es 0,9568, y el sobrepico escalado da 14,63 % en vez de 9,67 %. Para ver el fenómeno como es, 'noscale'. Con Hamming y Blackman la suma ya es casi 1 (0,9980 y 1,0003 con ) y el sobrepico cambia dos décimas de punto o menos.freqz(h, 1, 512) y cae un solo punto en el lóbulo del pico, y el sobrepico sale 6,26 % en vez de 8,96 %; con , 8,83 % en vez de 9,02 %. Por eso el vector w de puntos, que además es un vector: un escalar como tercer argumento freqz lo lee como cantidad de puntos, no como frecuencia.fir1(N-1, wc/pi, ventana(N), 'noscale') para ver el fenómeno sin la normalización.