Estou experimentando dizimar um sinal, neste caso, um impulso unitário.
Estou usando Python, com pylab. Primeiro, eu crio um impulso unitário e o dizimo 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))))
Isso resulta com os seguintes gráficos
Em seguida, adiciono algumas amostras de atraso antes do impulso, alterando x para:
x = r_[zeros(3), 1, zeros(100)]
Isso resulta nos seguintes gráficos
No segundo conjunto de gráficos, o sinal dizimado resultante não é mais uma amostra única, mas foi distorcido.
Se eu atrasar o sinal com 5 - e qualquer múltiplo de q - amostras, recebo o primeiro conjunto de gráficos novamente.
O código fonte da função dizimar é 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]
Eu estou usando um filtro passa baixo de abeto antes de dizimar, a resposta de impulso do filtro é
Isso explica por que o impulso é distorcido quando há um atraso, a dizimação está selecionando partes da resposta ao impulso, quando o atraso é múltiplo da dizimação, ele seleciona apenas os zeros da resposta ao impulso e uma amostra diferente de zero em o pico.
Existe uma maneira de dizimar uma amostra de unidade com um atraso arbitrário, o que resulta em uma saída de amostra de unidade dimensionada?