Bitácora · DCSS · Concepto

Polos y ceros

Unidad 1 · Filtrado digital · H(z) factorizada, la lectura geométrica de |H|, la estabilidad y el FIR todo ceros

Un filtro LTI con ecuación en diferencias tiene una función de transferencia que es un cociente de dos polinomios. Las raíces de arriba son los ceros; las de abajo, los polos. Con esa lista de puntos en el plano complejo, más una ganancia, está todo el filtro: el módulo de su respuesta en frecuencia se lee como un cociente de distancias, la fase como una suma de ángulos, y la estabilidad como una sola pregunta sobre los polos.

01 · La definición

La ecuación en diferencias, pasada a z, convierte cada retardo en un factor z−1 y deja un cociente:

H(z)=Y(z)X(z)=B(z)A(z)=∑k=0Qbkz−k1+∑k=1Pakz−k

Los bk son la parte no recursiva y los ak la recursiva, como en filter(b, a, x) y en los scripts de la clase. La filmina los nombra al revés —ak arriba, bk abajo—; la cuenta es la misma.

Todo polinomio se factoriza por sus raíces. Hacerlo arriba y abajo da la forma en polos y ceros:

H(z)=b0·∏i=1Q(1−ciz−1)∏i=1P(1−piz−1)

Los ci son los ceros: donde H(z)=0. Los pi son los polos: donde H(z) se va a infinito. Con coeficientes reales, los que no son reales vienen de a pares conjugados. Los ceros salen de los coeficientes que multiplican a la entrada; los polos, de los que multiplican a la salida realimentada. Sin realimentación no hay de dónde sacar un polo, salvo el caso trivial del origen, que tiene su propia sección más abajo.

02 · Cómo se obtienen

El ejemplo es el IIR del script Clase.m, con b = [1 1] y a = [1 -sqrt(2)/2]:

H(z)=1+z−11−22z−1

Paso 1: pasar a potencias positivas. Las raíces de un polinomio en z−1 se buscan mejor en z. Se multiplica arriba y abajo por zL, con L la mayor de las dos potencias negativas, que acá es 1:

H(z)=z+1z−22

Paso 2: las raíces. Arriba, z=−1: un cero. Abajo, z=2/2≈0,7071: un polo. Es lo que devuelven roots(b) y roots(a).

Paso 3: contar. En potencias positivas, el numerador y el denominador quedan del mismo grado L, así que siempre hay tantos polos como ceros. Si Q y P son distintos, el que tiene menos recibe |Q−P| raíces en z=0. Esas raíces en el origen no se ven en roots, que sólo mira un polinomio por vez, y son el origen de la confusión de la sección 06.

Un ejemplo con pares conjugados, el del apunte: b = [1 0 1] y a = [1 -1.6 0.8], o sea H(z)=(1+z−2)/(1−1,6z−1+0,8z−2). Los ceros son ±j, sobre el círculo unitario. Los polos son 0,8±0,4j, de módulo 0,8≈0,8944 y ángulo ±arctan(0,5)≈±0,1476π. tf2zpk los devuelve así, con ganancia 1.

03 · La lectura geométrica

La respuesta en frecuencia es H(z) evaluada sobre el círculo unitario, en z=ejω. Recorrer las frecuencias de 0 a π es recorrer la mitad de arriba del círculo, de z=1 a z=−1.

Paso 1: sacar z de cada factor. Como 1−cz−1=z−1(z−c), la forma factorizada queda

H(z)=b0zP−Q·∏i(z−ci)∏i(z−pi)

Paso 2: tomar módulo en z=ejω. El módulo de un producto es el producto de los módulos, y |ejω(P−Q)|=1. Cada factor |ejω−c| es la distancia entre el punto del círculo y la raíz:

|H(ejω)|=|b0|·∏i|ejω−ci|∏i|ejω−pi|=|b0|·producto de distancias a los cerosproducto de distancias a los polos

Paso 3: tomar ángulo. El ángulo de un producto es la suma de los ángulos, y el de un cociente, la resta. Cada factor aporta el ángulo del segmento que va de la raíz al punto ejω:

∠H(ejω)=∠b0+(P−Q)ω+∑i∠(ejω−ci)−∑i∠(ejω−pi)

Con el ejemplo de los ceros en ±j y los polos en 0,8±0,4j, en ω=0,15π: las distancias a los ceros son 1,0450 y 1,7053, y a los polos, 0,1058 y 0,8588. El cociente da 19,61, y freqz da 19,6088. Sobre 200 001 frecuencias entre 0 y π, el cociente de distancias y freqz difieren en 4,3×10⁻¹⁴ como máximo en el módulo y en 1,2×10⁻¹² en la fase. Es la misma función, calculada por otro camino.

De la fórmula salen tres lecturas que se usan todo el tiempo:

04 · Cómo cambia con el radio del polo

Un par de polos en re±jπ/3, con numerador 1. En ω=π/3 la distancia al polo de arriba es exactamente 1−r, y la del de abajo tiende a 2sen(π/3)=3:

|H(ejθ)|=1(1−r)|1−re−j2θ|≈1(1−r)2senθ

Medido con freqz sobre 2 000 001 frecuencias entre 0 y π, con el ancho a −3 dB medido respecto del pico:

rpicodónde cae (ω/π)|H| en π/3ancho a −3 dB2(1 − r)
0,503,75 dB0,28513,59 dBno hay1,00
0,8010,12 dB0,328710,11 dB0,46250,40
0,9015,67 dB0,332315,67 dB0,21230,20
0,9521,47 dB0,333121,47 dB0,10280,10
0,9935,27 dB0,333335,27 dB0,02010,02

Cada vez que la distancia 1−r se parte a la mitad, el pico sube casi 6 dB —que es un factor 2 en el denominador— y el ancho se parte a la mitad. El ancho tiende a 2(1−r) radianes. Con r=0,5 no hay ancho que medir: |H(ej0)| está apenas 1,25 dB debajo del pico, y el pico mismo se corre hasta 0,285π, porque el polo de abajo pesa casi lo mismo que el de arriba. Con r chico el máximo no está en el ángulo del polo; con r cerca de 1, sí. Así consigue un IIR una transición angosta con dos coeficientes, casi gratis contra un FIR.

05 · La estabilidad

Un sistema LTI causal con H(z) racional, sin polos y ceros que se cancelen, es estable BIBO si y sólo si todos sus polos están adentro del círculo unitario: |pi|<1 para todo i.

Paso 1: fracciones parciales. Con polos simples y Q<P, el cociente se abre en una suma de términos de un solo polo:

H(z)=∑i=1PAi1−piz−1

Paso 2: antitransformar cada término. 1/(1−pz−1)=∑n≥0pnz−n es una serie geométrica, así que la parte causal de cada término es una exponencial:

h[n]=∑i=1PAipinu[n]

Paso 3: sumar los módulos. Estable BIBO es ∑n|h[n]|<∞, y ∑n|p|n converge a 1/(1−|p|) sólo si |p|<1. Un solo polo afuera alcanza para que la suma diverja. Con polos repetidos aparecen factores nmpn, que con |p|<1 también se apagan: la condición es la misma.

Con un polo real, h[n]=pn. Con p=0,95 la suma de módulos es 1/0,05=20. Con p=1 es el acumulador: h[n]=1 para siempre, marginal y no estable. Con p=1,05, h[60]=1,0560≈18,68, y sigue creciendo.

|H| no avisa. Reflejar un polo del otro lado del círculo, p→1/p*, cambia cada distancia por el mismo factor para todo ω:

|ejω−1/p*|=|ejω−p||p|

Así que la forma de |H| no cambia: sólo la escala. Con el par 0,8e±j0,3π y su reflejo en 1,25e±j0,3π, el cociente de los dos módulos de freqz vale 1,5625 en las 4096 frecuencias, igual hasta el decimal doce: es 1/0,82. Pero en las primeras 60 muestras, la h[n] del original nunca pasa de 1 y la del reflejado llega a 4,18×10⁵. La estabilidad se lee en el plano z o en h[n], no en el módulo.

06 · Un FIR tiene sólo ceros

Es al revés de lo que parece a veces: un FIR es un filtro todo ceros. No tiene denominador, A(z)=1, y sin realimentación no hay de dónde salgan polos. Lo que sí tiene son polos en el origen, y vale la pena ver de dónde vienen.

Paso 1: el FIR en potencias negativas. Con N coeficientes:

H(z)=∑k=0N−1bkz−k

Paso 2: pasarlo a potencias positivas. Es el paso 1 de la sección 02: se multiplica arriba y abajo por zN−1. Arriba queda un polinomio en z; abajo, lo que era un 1 pasa a ser zN−1:

H(z)=b0zN−1+b1zN−2+⋯+bN−1zN−1

Paso 3: leer las raíces. Arriba hay N−1 ceros, donde caigan. Abajo, zN−1=0 tiene una sola raíz, z=0, con multiplicidad N−1. Esos son todos los polos de un FIR, y los tres hechos que importan salen de la lectura geométrica:

La media móvil, en polos y ceros. Con M coeficientes iguales a 1/M, el numerador en potencias positivas es una serie geométrica:

H(z)=1M·zM−1+zM−2+⋯+1zM−1=1M·zM−1zM−1(z−1)

Las raíces de zM=1 son las M raíces de la unidad, ej2πk/M, repartidas parejo sobre el círculo. La de k=0, z=1, se cancela con el (z−1) de abajo. Quedan M−1 ceros sobre el círculo en los ángulos 2πk/M, k=1,…,M−1: son exactamente los ceros de la sinc periódica de la media móvil, vistos desde el plano z. Y M−1 polos en el origen. Con M=8, tf2zpk da 7 ceros cuyos ángulos difieren de 2πk/8 en 8,9×10⁻¹⁶ como máximo, y 7 polos en exactamente 0. Y el módulo de freqz contra (1/8)∏k|ejω−ck|, sin ningún polo, difiere en 1,2×10⁻¹⁵ sobre 4096 frecuencias.

El contraste: el IIR todo polos. Es el caso espejo, con el numerador constante. El IIR de Ejemplo_filtros.m tiene b = 0.1 y a = [1 -0.9]:

H(z)=0,11−0,9z−1=0,1zz−0,9

Un polo en 0,9, que es el que hace todo el trabajo, y un cero trivial en el origen, que aparece por la misma cuenta y tampoco toca el módulo. El FIR tiene sus ceros donde quiera y los polos amontonados en 0; el IIR todo polos, al revés.

De dónde sale la confusión. Hay tres lugares donde un FIR parece tener polos:

Los ceros de un FIR de fase lineal vienen en pares recíprocos. Si h[n]=h[N−1−n], invertir el orden de los coeficientes no cambia nada, y eso dice H(z)=z−(N−1)H(z−1). Entonces si c es cero, 1/c también; y con coeficientes reales, sus conjugados. Cada cero c0 fuera del círculo viene con su espejo 1/c0*, al mismo ángulo y a radio inverso; los que están sobre el círculo son su propio espejo. Con fir1(10, 0.3), 11 coeficientes simétricos, los 10 ceros son: 4 sobre el círculo (en ±0,899π y ±0,674π), un par real en 3,2352 y 0,3091, y cuatro en ±0,654π de radios 1,7253 y 0,5796. Cada cero está a 9,3×10⁻¹⁵ o menos del recíproco conjugado de algún cero de la lista. El control: con 11 coeficientes al azar (rand, semilla 1), sin simetría, el peor cero queda a 0,382 del espejo más cercano.

El FIR de Ejemplo_filtros.m, h = [1 2 3 4 3 2 1]/16, es el caso extremo: los seis ceros están sobre el círculo, dobles, en −1 y en ±j. Es que h es la media móvil de 4 convolucionada consigo misma, [1111]∗[1111]/16, así que tiene los ceros de 2πk/4 dos veces cada uno. Y seis polos en el origen. Qué más hace un FIR como filtro, y cómo se diseña, está en el filtro FIR; lo mismo para el IIR en el filtro IIR.

Simulación El plano z y el punto que recorre el círculo — un par de ceros (○) y un par de polos (×) conjugados. Arrastrá el polo, el cero o el punto azul del círculo; el conjugado sigue solo. Con el teclado: tabulá hasta el plano, la barra espaciadora cambia entre polo y cero, y las flechas lo mueven. Arranca con todo cerca del origen, donde |H| cambia poco.
distancias a los ceros — distancias a los polos — |H(e^jω)| = cociente — fase = Σ∠ceros − Σ∠polos — |p| — desde los coeficientes —

Llevá el polo hacia el círculo y mirá cómo sale el pico en su ángulo: el punto azul, al pasarle cerca, divide por una distancia chica. Llevá el cero encima del círculo y el valle baja hasta el fondo del gráfico. Después prendé «FIR»: los polos se van al origen, la distancia a ellos se clava en 1 para todo ω, y |H| queda hecho sólo de ceros. Y con el polo cerca del círculo, reflejalo: la curva de |H| sube o baja entera sin cambiar de forma, mientras h[n], abajo, explota. El botón del ejemplo deja las raíces del apunte; en ω=0,15π las lecturas dan el 19,6088 de freqz.

07 · El análisis en MATLAB

Un FIR y un IIR de los scripts de la clase, de punta a punta. Lo que figura como comentario es la salida real de correrlo en R2026a.

%% 1. Un FIR: el de Ejemplo_filtros.m
h = [1 2 3 4 3 2 1] / 16;
[z, p, k] = tf2zpk(h, 1);
disp(round(z.', 4))
disp(p.')
fprintf('k = %g\n', k)
fprintf('max ||z| - 1| = %.1e\n', max(abs(abs(z) - 1)))
% -1.0000 + 0.0000i  -1.0000 + 0.0000i   0.0000 + 1.0000i   0.0000 - 1.0000i   0.0000 + 1.0000i   0.0000 - 1.0000i
%      0     0     0     0     0     0
% k = 0.0625
% max ||z| - 1| = 2.9e-08

%% 2. tf2zp no es para filtros digitales
try
    tf2zp(h, 1);
catch e
    disp(e.message)
end
[z2, p2] = tf2zp(h, [1 zeros(1, 6)]);   % mismo largo arriba y abajo: ahí sí
fprintf('%d ceros, %d polos\n', numel(z2), numel(p2))
% Transfer function not proper.
% 6 ceros, 6 polos

%% 3. La media móvil de 8: ceros en 2*pi*k/8, polos en el origen
M = 8;
[zm, pm] = tf2zpk(ones(1, M) / M, 1);
ang = sort(mod(angle(zm), 2*pi)).';
fprintf('max |arg - 2*pi*k/M| = %.1e\n', max(abs(ang - 2*pi*(1:M-1)/M)))
fprintf('%d polos, max |p| = %g\n', numel(pm), max(abs(pm)))
% max |arg - 2*pi*k/M| = 8.9e-16
% 7 polos, max |p| = 0

%% 4. Un IIR: el de Clase.m
b = [1 1];
a = [1 -sqrt(2)/2];
[zc, pc, kc] = tf2zpk(b, a);
fprintf('cero %g, polo %.4f, k = %g, estable: %d\n', zc, pc, kc, all(abs(pc) < 1))
% cero -1, polo 0.7071, k = 1, estable: 1

%% 5. Un IIR todo polos: el de Ejemplo_filtros.m
[zt, pt] = tf2zpk(0.1, [1 -0.9]);
fprintf('cero %g, polo %g\n', zt, pt)
% cero 0, polo 0.9

%% 6. zplane: fila o columna no es lo mismo
figure; [hz, hp] = zplane(h, 1);
fprintf('fila:    %d ceros, %d polos\n', numel(hz.XData), numel(hp.XData))
figure; [hz, hp] = zplane(h.', 1);
fprintf('columna: %d ceros, %d polos\n', numel(hz.XData), numel(hp.XData))
% fila:    6 ceros, 6 polos
% columna: 7 ceros, 1 polos

%% 7. freqz contra la lectura geométrica, con el IIR de Clase.m
w = [0 0.25 0.5 0.75 1] * pi;           % un vector, nunca un escalar
H = freqz(b, a, w);
E = exp(1j * w);
G = abs(kc) * abs(E - zc) ./ abs(E - pc);
disp(round(abs(H), 4))
fprintf('max | |H| - por distancias | = %.1e\n', max(abs(abs(H) - G)))
%     6.8284    2.6131    1.1547    0.4841         0
% max | |H| - por distancias | = 2.2e-16

%% 8. Los polos en el origen no tocan el módulo del FIR
w = linspace(0, 2*pi, 4096);
E = exp(1j * w);
G = abs(k) * prod(abs(E - z), 1);       % sólo los ceros
fprintf('max | |H| - desde los ceros | = %.1e\n', max(abs(abs(freqz(h, 1, w)) - G)))
% max | |H| - desde los ceros | = 2.8e-15

%% 9. Y de vuelta, con zp2tf
[b9, a9] = zp2tf(z, p, k);
disp(round(b9 * 16, 10)); disp(a9)
%      1     2     3     4     3     2     1
%      1     0     0     0     0     0     0

El |H(ej0)|=6,8284 del bloque 7 tiene forma cerrada: la distancia de z=1 al cero es 2 y al polo es 1−2/2, y 2/(1−2/2)=6,8284. Cinco detalles que muerden:

Para tener a mano

  1. Ceros: raíces de B(z). Polos: raíces de A(z). Se obtienen pasando a potencias positivas, y en MATLAB con roots o tf2zpk.
  2. |H(ejω)| es |b0| por el producto de distancias a los ceros sobre el producto de distancias a los polos, con ejω recorriendo el círculo. La fase es la suma de los ángulos a los ceros menos la de los ángulos a los polos.
  3. Un cero sobre el círculo anula esa frecuencia. Un polo a distancia 1−r del círculo hace un pico de alto ∝1/(1−r) y ancho ≈2(1−r).
  4. Causal y estable si y sólo si todos los polos cumplen |pi|<1. El módulo no lo muestra: reflejar un polo a 1/p* sólo cambia la escala de |H|.
  5. Un FIR tiene sólo ceros: N−1 ceros y N−1 polos triviales en z=0, que no tocan el módulo, restan (N−1)ω de fase y nunca desestabilizan. El IIR todo polos es el espejo: ceros triviales en el origen.
  6. La media móvil de M: ceros en ej2πk/M, k=1,…,M−1, y M−1 polos en el origen.
  7. FIR de fase lineal: ceros en grupos c0,c0*,1/c0,1/c0*; sobre el círculo, cada cero es su propio espejo.
  8. En MATLAB: tf2zpk y no tf2zp; zplane con vectores fila; freqz con un vector de frecuencias.
← Anterior Siguiente → Inicio
Relacionados El filtro de media móvil El filtro FIR El filtro IIR