Bitácora · DCSS · Concepto

El filtro de media móvil

Unidad 1 · Filtrado digital · respuesta al impulso, DTFT y análisis en MATLAB

La media móvil reemplaza cada muestra por el promedio de las últimas M. Todo lo demás sale de ahí: su respuesta al impulso es un rectángulo, la DTFT de un rectángulo es una sinc periódica, y el largo M de la ventana decide dónde caen los ceros de esa sinc y qué tan angosto es el lóbulo que deja pasar.

01 · La definición

La ecuación en diferencias, en su versión causal:

y[n]=1M∑k=0M−1x[n−k]

Es el promediador del apunte, 1M1+M2+1∑k=−M1M2x[n−k], con M1=0 —no mira muestras futuras, así que es causal— y M2=M−1. Es lineal, porque es una suma con pesos fijos, e invariante en el tiempo, porque la ventana tiene la misma forma en cada n. Por ser LTI queda descripto entero por su respuesta al impulso.

02 · La respuesta al impulso

Cómo se obtiene: se pone un impulso a la entrada, x[n]=δ[n], y lo que sale es h[n] por definición:

h[n]=1M∑k=0M−1δ[n−k]={1M0≤n≤M−10en otro caso

Cada término de la suma es un impulso corrido: δ[n−k] vale 1 sólo en n=k. Entre los M términos cubren n=0,…,M−1 una vez cada uno, y el 1/M les pone la altura. Queda un rectángulo de M muestras de alto 1/M. Tres cosas se leen directo de él:

En MATLAB se obtiene igual que en papel: filter(ones(1,8)/8, 1, [1 zeros(1,15)]) devuelve 0.1250 ocho veces y después ceros. Es el rectángulo, medido.

03 · La DTFT, paso a paso

La DTFT de h[n] es la suma de siempre. Como h sólo es distinta de cero entre 0 y M−1, la suma infinita se corta ahí:

H(ejω)=∑n=−∞∞h[n]e−jωn=1M∑n=0M−1(e−jω)n

Paso 1: es una serie geométrica. Con razón r=e−jω y ∑n=0M−1rn=1−rM1−r, que vale mientras r≠1, o sea para ω≠0:

H(ejω)=1M·1−e−jωM1−e−jω

Paso 2: sacar el ángulo mitad. Es el truco que convierte una resta de exponenciales en un seno. Para cualquier θ:

1−e−jθ=e−jθ/2(ejθ/2−e−jθ/2)=e−jθ/2·2jsen(θ/2)

Paso 3: aplicarlo arriba y abajo. Con θ=ωM en el numerador y θ=ω en el denominador, los 2j se cancelan y las dos exponenciales se juntan en una sola, e−jωM/2/e−jω/2=e−jω(M−1)/2:

H(ejω)=e−jω(M−1)/2⏟fase lineal·sen(ωM/2)Msen(ω/2)⏟amplitud real,DM(ω)

En ω=0 la fórmula da 0/0, pero el límite es 1, que es la suma de h[n]: la ganancia en continua de la sección anterior. Contra freqz, sobre 4096 frecuencias del círculo entero y con M=8, la forma cerrada difiere en 3,4×10⁻¹⁵ como máximo: es la misma función.

La fórmula tiene dos factores con papeles distintos. El primero tiene módulo 1 siempre: no toca la amplitud de nada, sólo atrasa. El segundo, DM(ω), es real y cambia de signo. Así que |H|=|DM|, y todo lo que el filtro hace con las amplitudes está en ese cociente de senos.

04 · Una sinc, pero periódica

A DM(ω) se le dice sinc y se parece a una, pero no es: es el núcleo de Dirichlet, o sinc periódica. La diferencia está en el denominador. Cerca de ω=0, sen(ω/2)≈ω/2, y queda la sinc de verdad:

DM(ω)≈sen(ωM/2)ωM/2para ω chico

Lejos del origen la aproximación se rompe, y se rompe por la razón de siempre: h[n] es discreta, así que H(ejω) es periódica de período 2π. La sinc de verdad decae para siempre; la de Dirichlet vuelve a subir y repite su lóbulo principal en cada múltiplo de 2π. Evaluada con freqz en ω y en ω+2π, la diferencia es de 9×10⁻¹⁵. Medida la distancia entre las dos curvas:

Mde 0 a 2π/Mde 0 a π
40,0200,061
80,00480,037
160,00120,020
300,00030,011
640,00010,0055

Diferencia máxima entre DM(ω) y sen(ωM/2)/(ωM/2), en MATLAB sobre 4000 y 40 000 puntos. En el lóbulo principal el error cae como 1/M2: con M grande, la parte que importa es una sinc. En las colas cae sólo como 1/M, y en ω=π las dos curvas se separan por una cuenta exacta: DM(π)=sen(Mπ/2)/M, que es 0 para M par y ±1/M para M impar.

05 · Cómo la cambia la ventana

Todo lo que importa de |H| depende de un solo número, M, y casi todo escala como 1/M.

Los ceros. El numerador se anula cuando ωM/2=kπ, o sea en

ωk=2πkM,k=1,…,M−1

El k=0 no cuenta porque ahí también se anula el denominador. Son M−1 ceros por período, equiespaciados, y son ceros exactos: freqz evaluado en ellos, con M=8, da |H| de 3,3×10⁻¹⁶ o menos. Tienen una lectura directa: una sinusoide de frecuencia 2πk/M completa k ciclos enteros dentro de la ventana, y el promedio de ciclos enteros es cero.

El lóbulo principal va del primer cero negativo al primero positivo, de −2π/M a 2π/M: mide 4π/M. Duplicar la ventana lo parte a la mitad.

El corte a −3 dB no tiene forma cerrada: hay que despejar |DM(ω)|=1/2 numéricamente (con fzero). Medido como fracción del primer cero, ω3dB/(2π/M) da 0,4554 con M=4, 0,4460 con 8, 0,4437 con 16 y 0,4432 con 30, y se clava en 0,4430 para M grande. O sea, ω3dB≈2,78/M. Con el M=30 del script de la cátedra da 0,0928 rad.

El primer lóbulo lateral es el pico entre el primer cero y el segundo. Su altura en dB respecto del lóbulo principal, y dónde cae:

Malturaposición ÷ (2π/M)
3−9,54 dB1,500
4−11,30 dB1,465
8−12,80 dB1,438
16−13,15 dB1,432
30−13,23 dB1,431
64−13,25 dB1,430
512−13,26 dB1,430

Los −13 dB de la tabla de ventanas del apunte son el límite de esta fila, no un valor fijo: con ventanas cortas el lóbulo lateral está más alto. Y al revés de lo que pasa con el ancho, no baja agregando muestras, porque para M grande la forma del lóbulo ya no cambia, sólo se angosta. Es el mismo núcleo que aparece al truncar una respuesta ideal con ventana rectangular: la ventana rectangular es este mismo h[n] sin el 1/M, y por eso su rizado tampoco baja con más taps.

Simulación El rectángulo y su sinc periódica — arriba, h[n]; al medio, |H(e^jω)| entre −2π y 2π, con los ceros marcados; abajo, la fase. Con M = 1 el filtro no hace nada: movelo.
altura 1/M — primer cero — ancho a −3 dB — lóbulo lateral — |H(π)| — forma cerrada − suma directa —

Al subir M pasan tres cosas juntas y ninguna se puede separar de las otras. Arriba el rectángulo se ensancha y baja, porque su área sigue siendo 1. Al medio el lóbulo principal se angosta y aparecen más ceros, siempre equiespaciados cada 2π/M. Abajo la pendiente de la fase se empina, porque el retardo crece. Con la sinc no periódica superpuesta y M chico se ve dónde se despegan: cerca de ±π, y del todo pasado π, donde la de Dirichlet vuelve a subir para repetir su lóbulo en ±2π.

06 · La fase

De la forma cerrada, la fase es −ω(M−1)/2, una recta, más un salto de π en cada cero, donde DM cambia de signo. Esos saltos no atrasan nada: son un −1 que multiplica a una frecuencia que el filtro igual anula. Por eso, con M grande, la fase del gráfico parece un diente de sierra casi plano: entre dos ceros la recta baja π(M−1)/M, casi π, y el salto lo repone. Es lo mismo que devuelve angle en MATLAB. Lo que cuenta es la pendiente de cada tramo, y el retardo de grupo es menos la pendiente:

τ(ω)=−d∠Hdω=M−12

Es constante: todas las frecuencias salen atrasadas lo mismo, y la forma de la señal no se deforma. grpdelay con M=8 da 3,5 muestras en las cuatro frecuencias en que se lo pregunta. Cuánto cuesta ese retardo, y por qué no hay manera de suavizar sin pagarlo, está en la nota del promediador.

07 · El análisis en MATLAB

El análisis completo, con M=8. Lo que figura como comentario es la salida real de correrlo en R2026a. El bloque 8 es el barrido que hace el script Ejemplo_filtros.m de la clase.

%% 1. El filtro: M coeficientes iguales a 1/M
M = 8;
h = ones(1, M) / M;

%% 2. La respuesta al impulso, obtenida: se le mete un delta
d = [1, zeros(1, 15)];
h_medida = filter(h, 1, d);
figure; stem(0:15, h_medida, 'filled'); grid on
xlabel('n'); ylabel('h[n]')
% 0.1250 ... 0.1250 (ocho veces), después 0

%% 3. La DTFT evaluada por MATLAB
Nw = 4096;
[H, w] = freqz(h, 1, Nw, 'whole');      % w en [0, 2*pi)
w = w - 2*pi*(w >= pi);                 % pasar a [-pi, pi)
[w, orden] = sort(w);  H = H(orden);

%% 4. La misma DTFT, por la forma cerrada
Hc = exp(-1j*w*(M-1)/2) .* sin(w*M/2) ./ (M*sin(w/2));
Hc(w == 0) = 1;                         % el límite 0/0 en w = 0
fprintf('max |freqz - cerrada| = %.1e\n', max(abs(H - Hc)))
% max |freqz - cerrada| = 3.4e-15

%% 5. Módulo, en veces y en dB, y fase
figure
subplot(311); plot(w/pi, abs(H)); grid on; ylabel('|H|')
subplot(312); plot(w/pi, 20*log10(abs(H))); grid on; ylabel('|H| [dB]'); ylim([-50 3])
subplot(313); plot(w/pi, angle(H)); grid on; ylabel('\angle H [rad]'); xlabel('\omega / \pi')

%% 6. Los ceros caen en 2*pi*k/M
wk = 2*pi*(1:M-1)/M;
fprintf('max |H| en los ceros = %.1e\n', max(abs(freqz(h, 1, wk))))
% max |H| en los ceros = 3.3e-16

%% 7. Retardo de grupo: constante e igual a (M-1)/2
disp(grpdelay(h, 1, [0.1 0.5 1.5 2.5]).')
% 3.5000    3.5000    3.5000    3.5000

%% 8. El barrido de M, como en el script de la cátedra
figure; hold on
for M = [4 8 16 32]
    [H, w] = freqz(ones(1, M)/M, 1, 8192);
    plot(w/pi, 20*log10(abs(H)), 'DisplayName', sprintf('M = %d', M))
end
yline(-3, '--k', 'HandleVisibility', 'off')
grid on; ylim([-50 3]); legend; xlabel('\omega / \pi'); ylabel('|H| [dB]')

Tres detalles que muerden si no se los conoce:

Para tener a mano

  1. h[n]=1/M para 0≤n≤M−1: un rectángulo de área 1. Se obtiene metiendo un δ[n].
  2. La DTFT sale de la serie geométrica más el ángulo mitad:H(ejω)=e−jω(M−1)/2·sen(ωM/2)/(Msen(ω/2))
  3. Es una sinc periódica (núcleo de Dirichlet): sinc cerca del origen, periódica de 2π como toda DTFT.
  4. Ceros en 2πk/M. Lóbulo principal de 4π/M. Corte a −3 dB en ≈2,78/M. Todo escala como 1/M.
  5. El primer lóbulo lateral tiende a −13,26 dB y no baja con M. Con ventanas cortas está más alto: −11,30 dB con M=4.
  6. La fase es lineal, con saltos de π en los ceros. El retardo de grupo es constante, (M−1)/2.
← Anterior Siguiente → Inicio
Relacionados El filtro FIR Polos y ceros El fenómeno de Gibbs El promediador y su retardo