Estoy experimentando con diezmar una señal, en este caso un impulso unitario.
Estoy usando Python, con pylab. Primero, creo un impulso unitario y lo diezmo por 5.
x = r_[zeros(0), 1, zeros(100)]
N = 2 ** 14
q = 5
y = decimate(x, q, ftype="fir")
subplot(211)
title("Original")
stem(range(len(x)), x)
subplot(212)
title("Decimated - FIR")
stem(range(len(y)), y)
figure()
subplot(211)
semilogx(log(abs(fft(x, N))))
subplot(212)
y = decimate(x, q, ftype="fir")
semilogx(log(abs(fft(y, N))))
Esto resulta con las siguientes parcelas
Luego agrego algunas muestras de retraso antes del impulso, cambiando x a:
x = r_[zeros(3), 1, zeros(100)]
Esto da como resultado las siguientes parcelas
En el segundo conjunto de gráficos, la señal diezmada resultante ya no es una sola muestra, sino que se ha distorsionado.
Si retraso la señal con 5 - y cualquier múltiplo de q - muestras, obtengo el primer conjunto de gráficos nuevamente.
El código fuente de la función diezmar es https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L1570.
def decimate(x, q, n=None, ftype='iir', axis=-1):
if not isinstance(q, int):
raise TypeError("q must be an integer")
if n is None:
if ftype == 'fir':
n = 30
else:
n = 8
if ftype == 'fir':
b = firwin(n + 1, 1. / q, window='hamming')
a = 1.
else:
b, a = cheby1(n, 0.05, 0.8 / q)
y = lfilter(b, a, x, axis=axis)
sl = [slice(None)] * y.ndim
sl[axis] = slice(None, None, q)
return y[sl]
Estoy usando un filtro de paso bajo de abeto antes de diezmar, la respuesta al impulso del filtro es
Esto explica por qué el impulso se distorsiona cuando hay un retraso, la aniquilación está seleccionando partes de la respuesta al impulso, cuando el retraso es un múltiplo de la aniquilación, solo selecciona los ceros de la respuesta al impulso y una muestra distinta de cero en el pico.
¿Hay alguna manera de diezmar una muestra unitaria con un retraso arbitrario, lo que resulta en una salida de muestra unitaria escalada?