Bitácora · DCSS · Concepto

El fenómeno de Gibbs

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.

01 · La definición

Sea una función con una discontinuidad de salto J, y una aproximación que la reconstruye con N términos: una serie de Fourier truncada, o un filtro con la respuesta al impulso ideal cortada a N 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:

sobrepico=máxH−1J

En el pasabajos el salto es el de la plantilla ideal en ωc, de 1 a 0, así que J=1 y el sobrepico es directamente cuánto se pasa |H| de 1 en la banda de paso.

Las dos situaciones son la misma. La respuesta en frecuencia HD(ω) de un filtro discreto es periódica de período 2π, y la DTFT HD(ω)=∑nhD[n]e−jωn es su serie de Fourier: los coeficientes de la serie son las muestras hD[n]. Quedarse con N muestras es quedarse con N términos de la serie de un rectángulo, que es el caso clásico en el que se descubrió el fenómeno.

02 · De dónde sale en un filtro

El punto de partida es el de la filmina del método de ventana: el pasabajos ideal vale 1 entre −ωc y ωc y 0 en el resto del período. Su respuesta al impulso sale de la DTFT inversa:

hD[n]=12π∫−ωcωcejωndω=sen(ωcn)πn,hD[0]=ωcπ

Es la 2fcsen(nωc)/(nωc) de la filmina, con ωc=2πfc, y el valor en n=0 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 N muestras centrales (con N impar) es multiplicar hD por una ventana w[n] que vale 1 para |n|≤(N−1)/2 y 0 afuera. Es la ventana rectangular: no usar ventana es usar la más brusca de todas.

h[n]=hD[n]w[n]

Después se corre (N−1)/2 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 H(ω) es real.

Paso 2: multiplicar en el tiempo es convolucionar en frecuencia. Con W(ω) la DTFT de la ventana, la convolución es circular, sobre un período:

H(ω)=12π∫−ππHD(θ)W(ω−θ)dθ

Es el panel (c) de la filmina: |H(ω)| sale de pasar W(ω) por encima de HD(ω). Para la rectangular centrada, W es una serie geométrica que se suma igual que la de la media móvil:

WR(ω)=∑n=−(N−1)/2(N−1)/2e−jωn=sen(ωN/2)sen(ω/2)

Es el núcleo de Dirichlet, derivado paso a paso en la media móvil: la misma sinc periódica, sin el 1/N y sin la fase porque acá está centrada. Tiene un lóbulo principal de alto N con ceros en ±2π/N, 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. HD vale 1 en [−ωc,ωc] y 0 afuera, así que sólo recorta el intervalo de integración. Cambiando la variable a φ=ω−θ:

H(ω)=12π∫ω−ωcω+ωcW(φ)dφ

H(ω) es el área de W que cae adentro de una ventana de ancho 2ωc. Contra freqz, con N=21 y ωc=0,4π, 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 WR sobre un período entero vale 2π, porque de toda la suma sólo sobrevive el término n=0. Cuando ω está cerca de ωc, el límite de arriba, ω+ωc, cae lejos del lóbulo principal, donde W ya es una cola chica que alterna. Despreciándola, y usando que W es par:

H(ω)≈12π∫−πωc−ωW(φ)dφ

Cerca del corte, H 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 ωc juntó la mitad; lejos afuera, casi nada. Cada lóbulo lateral de W que entra o sale suma o resta un poco, y eso es el rizado.

03 · El valor límite: la integral seno

Paso 1: con N grande el núcleo es una sinc. El lóbulo principal y los primeros laterales viven en |φ| del orden de 2π/N, donde sen(φ/2)≈φ/2:

WR(φ)≈sen(Nφ/2)φ/2

Paso 2: cambiar a la variable del lóbulo. Con u=Nφ/2 es dφ=2du/N y φ/2=u/N. Las N se cancelan todas:

12π·senuu/N·2duN=1πsenuudu

Paso 3: la integral acumulada es la integral seno. El límite de abajo, −π, pasa a −Nπ/2, que para N grande es −∞. Con Si(x)=∫0xsenu/udu y Si(∞)=π/2:

H(ω)≈1π∫−∞xsenuudu=12+Si(x)π,x=N(ωc−ω)2

Paso 4: el máximo cae en el primer cero. La derivada respecto de x es senx/(πx), que se anula en x=kπ. De todos esos extremos el mayor es el primero, x=π: hasta ahí se sumó todo el lóbulo principal y nada del primer lóbulo negativo. Vale

Hmáx=12+Si(π)π=12+1,8519π≈1,0895

Un sobrepico de 8,95 % del salto. Si(π) 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: x=π es ωc−ω=2π/N, 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 x=−π, y como Si es impar vale 12−Si(π)π=−0,0895. El primer lóbulo de la banda suprimida tiene exactamente la altura del sobrepico:

20log100,0895≈−20,96 dB

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 WR. 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.

04 · Por qué no baja con N

En la forma de la sección anterior, N sólo aparece adentro de x=N(ωc−ω)/2. Cambiar N estira o comprime el eje de frecuencia, pero la curva 12+Si(x)/π tiene siempre la misma altura. Más taps no bajan el pico: lo acercan al corte, como 2π/N. La tesis entera, con su propio widget, está en el ensayo sobre el rizado. Acá van los números. Pasabajos de ωc=0,4π con ventana rectangular, medido en MATLAB sobre 262 145 frecuencias entre 0 y π:

Nsobrepicopico antes del corte ÷ (2π/N)banda suprimida
136,83 %0,94−19,08 dB
219,67 %1,05−21,30 dB
2510,38 %1,00−22,29 dB
419,26 %1,03−21,17 dB
819,09 %1,01−21,08 dB
1619,02 %1,01−21,02 dB
3218,98 %1,00−21,00 dB
10018,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 N=13 a N=25, los dos casos de la filmina, el sobrepico sube de 6,83 % a 10,38 %. Barriendo todos los N impares de un tramo:

N imparessobrepico mínimosobrepico máximo
11 a 316,83 %11,46 %
101 a 1218,69 %9,27 %
1001 a 10218,92 %8,98 %

Con N finito el paso 4 no es exacto: la cola de W en el otro borde, a 2ωc de distancia, suma o resta un poco según dónde caiga el corte respecto de los ceros de hD. Con ωc=0,4π esos ceros se repiten cada 2,5 muestras, y el patrón se repite cada 10 valores de N. Un caso extremo lo muestra: N=19 y N=21 dan el mismo 9,67 %, porque las dos muestras que agrega el 21 son hD[±10]=sen(4π)/(10π)=0: es el mismo filtro. La franja se cierra sobre 8,95 % al crecer N, pero no se cierra hacia cero.

05 · Lo que sí lo baja: la ventana

Si el rizado es la integral acumulada de W, para bajarlo hay que cambiar W. El método de la filmina es el mismo h[n]=hD[n]w[n], 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 n=0,…,N−1 como las genera MATLAB:

wHamming[n]=0,54−0,46cos2πnN−1 wBlackman[n]=0,42−0,5cos2πnN−1+0,08cos4πnN−1

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 N=1001 su primer cero cae en 1,00, 2,00 y 3,00 veces 2π/N para la rectangular, Hamming y Blackman. La transición de H 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 N=57. Medido sobre el pasabajos, con ωc=0,4π y el mismo N=41 para las tres:

ventanasobrepicobanda suprimidatransición ÷ (2π/N)lóbulo de W
rectangular9,26 %−21,17 dB0,95−13,24 dB
Hamming0,168 %−53,61 dB3,41−42,12 dB
Blackman0,018 %−75,30 dB5,73−58,12 dB

La transición se midió como la distancia entre el último punto de la banda de paso con |H|≥1−δ y el primero de la suprimida con |H|≤δ, con δ el peor lóbulo de la banda suprimida. En unidades de 2π/N es casi constante: con N=161 da 0,93, 3,35 y 5,62. La banda suprimida, en cambio, casi no se mueve con N 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 N 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 N: medido, va de −40,64 dB con N=21 a −42,67 dB con N=1001. 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.

Simulación La convolución, punto por punto — arriba, el pasabajos ideal H_D(θ) y la ventana W(ω − θ) centrada en ω, con el área que queda adentro sombreada; abajo, H(ω), que es esa área dividida por 2π. Con ω = 0 el lóbulo principal queda entero adentro: corré ω hacia ω_c.
H(ω) por la integral — borde − ω, en 2π/N — sobrepico recorrido — banda suprimida recorrida — transición ÷ (2π/N) — integral − suma directa —

Lo que conviene mirar es el borde derecho del rectángulo, en ωc, mientras W se le acerca. Con la rectangular, el máximo de abajo llega cuando el primer cero de W 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 H baja. Con otro N todo pasa igual, más apretado contra ωc. Con Hamming o Blackman y el mismo N, 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.

06 · El análisis en MATLAB

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:

Para tener a mano

  1. Truncar hD[n]=sen(ωcn)/(πn) es multiplicar por una ventana, y eso es convolucionar HD con W. Con la rectangular, W es el núcleo de Dirichlet.
  2. Contra el rectángulo ideal, H(ω) es el área de W adentro de [ω−ωc,ω+ωc], dividida por 2π. Cerca del corte, la integral acumulada de W.
  3. El sobrepico tiende a Si(π)/π−12≈0,0895: 8,95 % del salto, a 2π/N antes del corte.
  4. El primer lóbulo de la banda suprimida tiene la misma altura: −20,96 dB. No es el −13 dB de la ventana: el filtro acumula áreas, no alturas.
  5. Más taps no bajan el sobrepico: lo comprimen contra el corte. Con N chico oscila, de 6,83 % a 11,46 % entre 11 y 31 taps.
  6. Lo baja la ventana, a costa de transición. Con N=41: rectangular −21 dB y 0,95 · 2π/N; Hamming −54 dB y 3,4 · 2π/N; Blackman −75 dB y 5,7 · 2π/N.
  7. En MATLAB: fir1(N-1, wc/pi, ventana(N), 'noscale') para ver el fenómeno sin la normalización.
← Anterior Siguiente → Inicio
Relacionados El filtro de media móvil El filtro FIR El rizado de Gibbs no baja