Eksperymentuję z zdziesiątkowaniem sygnału, w tym przypadku impulsu jednostkowego.
Używam Pythona z pylab. Najpierw tworzę impuls jednostkowy i zliczam go o 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))))
Wynika to z następujących wykresów
Następnie dodaję kilka próbek opóźnienia przed impulsem, zmieniając x na:
x = r_[zeros(3), 1, zeros(100)]
Powoduje to następujące wykresy
W drugim zestawie wykresów uzyskany zdziesiątkowany sygnał nie jest już pojedynczą próbką, ale został zniekształcony.
Jeśli opóźnię sygnał o 5 - i dowolną wielokrotność q - próbek, ponownie otrzymam pierwszy zestaw wykresów.
Kod źródłowy funkcji dziesiętnej to 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]
Używam jodłowego filtra dolnoprzepustowego przed zdziesiątkowaniem, odpowiedź impulsowa filtra to
To wyjaśnia, dlaczego impuls jest zniekształcony, gdy występuje opóźnienie, decymacja wybiera części odpowiedzi impulsowej, gdy opóźnienie jest wielokrotnością decymacji, wybiera tylko zero odpowiedzi impulsowej i jedną niezerową próbkę przy szczyt.
Czy istnieje sposób na zdziesiątkowanie próbki jednostkowej z dowolnym opóźnieniem, co skutkuje skalowaniem wyjściowej próbki jednostkowej?