Downsampling eines Signals mit Dezimierung


12

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

Einheitsimpuls ohne Verzögerung und das resultierende dezimierte Signal

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

Einheitsimpuls mit 3 Abtastwerten Verzögerung und das resultierende dezimierte Signal

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

Impulsantwort des Tiefpassfilters

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?


Sie verstehen, dass der "Single Sample" -Impuls tatsächlich eine sinc-Funktion darstellt, oder? Weil Sie vor dem Abtasten einen Anti-Alias-Filter verwenden müssen und Ihre ideale mathematische Impulsfunktion beim Filtern in eine sinc-Funktion umgewandelt wird. Es kommt einfach vor, dass die Samples genau auf die Nullen des Sinc fallen, so dass es nicht so aussieht, aber wenn der Sinc weniger als ein Sample zeitlich verschoben wäre, würden Sie es sehen.
Endolith

Antworten:


11

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]

x[n]=δ[n]

Der erste Schritt im Dezimierungsprozess besteht darin, dass das Eingangssignal mit der Impulsantwort des Anti-Aliasing-Filters gefaltet wird :h[n]

xf[n]=x[n]h[n]=δ[n]h[n]=h[n]

Als nächstes wird das gefilterte Signal um einen Faktor von ( in Ihrem Beispiel) herabgetastet .q5

xd[n]=xf[qn]=h[qn]

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 qnq0xd[n]n=0q2qnq0xd[n]n=0

x[n]

xf[n]=h[n-D]

xd[n]=xf[qn]=h[qn-D]

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?

xd[n]

xd[n]=h[qn-D]e-jωDH(ωq)

H(ω)xd[n]

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:

xf[n]=x[n]=δ[n-D]

xd[n]=xf[qn]=δ[qn-D]

qDxd[n]=0  n

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.