J'expérimente la décimation d'un signal, dans ce cas une impulsion unitaire.
J'utilise Python, avec pylab. Tout d'abord, je crée une impulsion unitaire et je la décime de 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))))
Cela se traduit par les tracés suivants
J'ajoute ensuite quelques échantillons de délai avant l'impulsion, en changeant x en:
x = r_[zeros(3), 1, zeros(100)]
Il en résulte les tracés suivants
Dans le deuxième ensemble de tracés, le signal décimé résultant n'est plus un seul échantillon, mais a été déformé.
Si je retarde le signal avec 5 - et n'importe quel multiple de q - échantillons, j'obtiens à nouveau le premier ensemble de tracés.
Le code source de la fonction de décimation est, 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]
J'utilise un filtre passe-bas en sapin avant de décimer, la réponse impulsionnelle du filtre est
Cela explique pourquoi l'impulsion est déformée lorsqu'il y a un retard, la décimation sélectionne des parties de la réponse impulsionnelle, lorsque le retard est un multiple de la décimation, elle ne sélectionne que les zéro de la réponse impulsionnelle et un échantillon non nul à le sommet.
Existe-t-il un moyen de décimer un échantillon unitaire avec un retard arbitraire, ce qui se traduit par une sortie d'échantillon unitaire mise à l'échelle?