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 . 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 de la ventana decide dónde caen los ceros de esa sinc y qué tan angosto es el lóbulo que deja pasar.
La ecuación en diferencias, en su versión causal:
Es el promediador del apunte, , con —no mira muestras futuras, así que es causal— y . Es lineal, porque es una suma con pesos fijos, e invariante en el tiempo, porque la ventana tiene la misma forma en cada . Por ser LTI queda descripto entero por su respuesta al impulso.
Cómo se obtiene: se pone un impulso a la entrada, , y lo que sale es por definición:
Cada término de la suma es un impulso corrido: vale 1 sólo en . Entre los términos cubren una vez cada uno, y el les pone la altura. Queda un rectángulo de muestras de alto . 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.
La DTFT de es la suma de siempre. Como sólo es distinta de cero entre y , la suma infinita se corta ahí:
Paso 1: es una serie geométrica. Con razón y , que vale mientras , o sea para :
Paso 2: sacar el ángulo mitad. Es el truco que convierte una resta de exponenciales en un seno. Para cualquier :
Paso 3: aplicarlo arriba y abajo. Con en el numerador y en el denominador, los se cancelan y las dos exponenciales se juntan en una sola, :
En la fórmula da , pero el límite es 1, que es la suma de : la ganancia en continua de la sección anterior. Contra freqz, sobre 4096 frecuencias del círculo entero y con , 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, , es real y cambia de signo. Así que , y todo lo que el filtro hace con las amplitudes está en ese cociente de senos.
A 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 , , y queda la sinc de verdad:
Lejos del origen la aproximación se rompe, y se rompe por la razón de siempre: es discreta, así que es periódica de período . La sinc de verdad decae para siempre; la de Dirichlet vuelve a subir y repite su lóbulo principal en cada múltiplo de . Evaluada con freqz en y en , la diferencia es de 9×10⁻¹⁵. Medida la distancia entre las dos curvas:
| M | de 0 a 2π/M | de 0 a π |
|---|---|---|
| 4 | 0,020 | 0,061 |
| 8 | 0,0048 | 0,037 |
| 16 | 0,0012 | 0,020 |
| 30 | 0,0003 | 0,011 |
| 64 | 0,0001 | 0,0055 |
Diferencia máxima entre y , en MATLAB sobre 4000 y 40 000 puntos. En el lóbulo principal el error cae como : con grande, la parte que importa es una sinc. En las colas cae sólo como , y en las dos curvas se separan por una cuenta exacta: , que es para par y para impar.
Todo lo que importa de depende de un solo número, , y casi todo escala como .
Los ceros. El numerador se anula cuando , o sea en
El no cuenta porque ahí también se anula el denominador. Son ceros por período, equiespaciados, y son ceros exactos: freqz evaluado en ellos, con , da de 3,3×10⁻¹⁶ o menos. Tienen una lectura directa: una sinusoide de frecuencia completa 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 a : mide . Duplicar la ventana lo parte a la mitad.
El corte a −3 dB no tiene forma cerrada: hay que despejar numéricamente (con fzero). Medido como fracción del primer cero, da 0,4554 con , 0,4460 con 8, 0,4437 con 16 y 0,4432 con 30, y se clava en 0,4430 para grande. O sea, . Con el 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:
| M | altura | posición ÷ (2π/M) |
|---|---|---|
| 3 | −9,54 dB | 1,500 |
| 4 | −11,30 dB | 1,465 |
| 8 | −12,80 dB | 1,438 |
| 16 | −13,15 dB | 1,432 |
| 30 | −13,23 dB | 1,431 |
| 64 | −13,25 dB | 1,430 |
| 512 | −13,26 dB | 1,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 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 sin el , y por eso su rizado tampoco baja con más taps.
Al subir 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 . Abajo la pendiente de la fase se empina, porque el retardo crece. Con la sinc no periódica superpuesta y 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 .
De la forma cerrada, la fase es , una recta, más un salto de en cada cero, donde cambia de signo. Esos saltos no atrasan nada: son un que multiplica a una frecuencia que el filtro igual anula. Por eso, con grande, la fase del gráfico parece un diente de sierra casi plano: entre dos ceros la recta baja , 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:
Es constante: todas las frecuencias salen atrasadas lo mismo, y la forma de la señal no se deforma. grpdelay con 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.
El análisis completo, con . 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:
freqz no es una frecuencia. freqz(h, 1, 0.3) no evalúa en : lee el escalar como la cantidad de puntos, así que con 0,3 da error y con 3 devuelve tres puntos cualesquiera sin avisar. grpdelay(h, 1, 0.3) es peor, porque devuelve un vector vacío sin error. Con hay un solo cero, así que el bloque 6 le pasaría un escalar. Hay que pasarles al menos dos frecuencias.freqz devuelve sólo . Para real alcanza, porque es par. Para ver el lóbulo principal entero, centrado, va 'whole' y el corrimiento del bloque 3.NaN en , que es y no el límite. Hay que poner el 1 a mano. Y en dB, los ceros exactos dan -Inf: sin el ylim el gráfico se aplasta.