Ich experimentiere mit der Dezimierung eines Signals, in diesem Fall eines Einheitsimpulses.
Ich benutze Python mit Pylab. Zuerst erstelle ich einen Einheitsimpuls und dezimiere ihn um 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))))
Dies ergibt sich mit den folgenden Darstellungen
Ich füge dann vor dem Impuls ein paar Abtastwerte für die Verzögerung hinzu, indem ich x in: ändere.
x = r_[zeros(3), 1, zeros(100)]
Dies führt zu den folgenden Darstellungen
In der zweiten Reihe von Diagrammen ist das resultierende dezimierte Signal nicht länger ein einzelner Abtastwert, sondern wurde verzerrt.
Wenn ich das Signal mit 5 - und einem Vielfachen von q - Samples verzögere, erhalte ich den ersten Satz von Plots erneut.
Der Quellcode für die Dezimierungsfunktion lautet 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]
Ich benutze ein Tannen-Tiefpassfilter vor dem Dezimieren, die Impulsantwort des Filters ist
Dies erklärt, warum der Impuls verzerrt ist, wenn es eine Verzögerung gibt, die Dezimierung Teile der Impulsantwort auswählt, wenn die Verzögerung ein Vielfaches der Dezimierung ist, sie nur die Nullen der Impulsantwort auswählt und eine Nicht-Null-Abtastung bei der Spitzer.
Gibt es eine Möglichkeit, ein Unit-Sample mit einer willkürlichen Verzögerung zu dezimieren, was zu einer skalierten Unit-Sample-Ausgabe führt?