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?
quelle
Antworten:
Sie scheinen richtig zu verstehen, was los ist. Ich bin mir jedoch nicht sicher, was Sie erwarten. Nehmen Sie Ihr erstes Beispiel. Lassen Sie Ihr Eingangssignal :x [ n ]
Der erste Schritt im Dezimierungsprozess besteht darin, dass das Eingangssignal mit der Impulsantwort des Anti-Aliasing-Filters gefaltet wird :h [ n ]
Als nächstes wird das gefilterte Signal um einen Faktor von ( in Ihrem Beispiel) herabgetastet .q 5
Wie Sie bemerkt, sind für FIR - Filter , deren Aufträge ein Vielfaches von (eigentlich, da der Filter linear-Phase ist, nur die Reihenfolge Bedarf , ein Vielfaches von ), die Wasserhähne zu Zeitverzögerungen sind Null für alle . Daher ist nur bei ungleich Null , wie Sie festgestellt haben.q qnq≤0xd[n]n=0q2 qn q≠ 0 xd[ n ] n = 0
Wie Sie bereits bemerkt haben, hat dies wiederum den Effekt, dass ein anderer Satz von Abgriffen aus der Filterantwort herausgefiltert wird, sodass das dezimierte Ausgangssignal nicht mehr für alle außer einem Sample null ist (dh es sieht nicht mehr wie ein Impuls aus) ). Dies ist zu erwarten. Warum?
Da der Filter die Quelle der "Verzerrung" ist, die Sie nicht möchten, können Sie den Vorgang ohne Filter wiederholen. Aber überlegen Sie, was Sie dann bekommen würden:
quelle