Bir sinyali decimate ile küçültme


12

Ben bir sinyal, bu durumda bir birim dürtü decim deney ediyorum.

Pylab ile Python kullanıyorum. İlk olarak, bir birim dürtü yaratıyorum ve 5 ile tahmin ediyorum.

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))))

Bu, aşağıdaki grafiklerle sonuçlanır

Sıfır gecikmeli birim impuls ve sonuçta ortaya çıkan azaltılmış sinyal

Daha sonra x'i değiştirerek dürtüden önce birkaç gecikme örneği ekliyorum:

x = r_[zeros(3), 1, zeros(100)]

Bu, aşağıdaki grafiklerle sonuçlanır

3 örnek gecikmesi ve sonuçta ortaya çıkan azaltılmış sinyal ile birim dürtü

İkinci grafik kümesinde, sonuçta ortaya çıkan azalan sinyal artık tek bir örnek değildir, ancak bozulmuştur.

Sinyali 5 - ve q - numunelerinden herhangi bir katıyla geciktirirsem, ilk grafik setini tekrar alırım.

Decimate işlevi için kaynak kodu, 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]

Ben karar vermeden önce bir köknar düşük geçiş filtresi kullanıyorum, filtrenin dürtü yanıtı

alçak geçiren filtrenin dürtü yanıtı

Bu, bir gecikme olduğunda dürtü neden bozuluyor, decimation dürtü tepkisinin parçalarını seçiyor, gecikme decimasyonun bir katı olduğunda, sadece dürtü tepkisinin sıfırını ve sıfır olmayan bir örneği zirve.

Ölçekli birim örnek çıktısıyla sonuçlanan bir birim örneğini keyfi bir gecikmeyle sonlandırmanın bir yolu var mı?


"Tek örnek" dürtü aslında samimi bir işlevi temsil ettiğini anlıyorsunuz, değil mi? Çünkü örneklemeden önce kenar yumuşatma filtresi uygulamanız gerekir ve ideal matematiksel dürtü işleviniz filtrelendiğinde samimi bir işleve dönüşür. Sadece numunelerin tam olarak içkinin sıfırları üzerine düştüğü olur, bu yüzden öyle görünmüyor, ancak içgüdü zaman içinde birden fazla örnekten kaymış olsaydı, bunu görürdünüz.
endolith

Yanıtlar:


11

Neler olup bittiğini doğru anlıyorsunuz. Ancak, ne beklediğinizden emin değilim. İlk örneğinizi alın. Giriş sinyalinizin olmasına izin verin :x[n]

x[n]=δ[n]

Decimation sürecindeki ilk adım, giriş sinyalinin kenar yumuşatma filtresinin dürtü yanıtı ile kıvrılmasıdır :h[n]

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

Daha sonra, filtrelenmiş sinyal faktörü ( örneğinizde ) ile örneklenir .q5

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

Eğer işaret edildiği gibi, emirlerine katları olan FIR filtresi (aslında, filtre doğrusal fazlı olduğundan, sırası ihtiyaç sadece katları ), sürelerde musluklar olan tüm için sıfır . Bu nedenle, bulduğunuz gibi yalnızca değerinde sıfır değildir .qq2qnq0xd[n]n=0

Giriş impulsuna bir zaman gecikmesi uyguladığınızda , filtre doğrusal ve zamanla değişmeyen (LTI) olduğundan, filtrelenmiş çıkış aynı miktarda geciktirilir :x[n]

xf[n]=h[nD]

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

Yine, belirttiğiniz gibi, bu, filtrenin tepkisinden farklı bir musluk seti koparma etkisine sahiptir, böylece azalan çıkış sinyali bir örnek hariç tümü için artık sıfır olmayacaktır (yani artık bir dürtü gibi görünmemektedir) ). Bu beklenen bir şey. Neden?

Unutmayın Fourier dönüşümü ayrık zamanlı (DTFT) ayrı bir dürtünün frekans alanında (miktar olarak) düzdür. Eğer gecikmeli bir dürtü ile eşdeğer olacaksa, frekans alanında da düz büyüklüğe sahip olmalıdır. Bununla birlikte, DTFT'si filtrenin frekans yanıtının yalnızca ölçeklendirilmiş bir kopyasıdır:xd[n]

xd[n]=h[qnD]ejωDH(ωq)

burada filtrenin frekans cevabıdır. çıktının gecikmeli bir dürtü ile eşit olması için, filtrenin geçiş bandında (desimasyon sonrası Nyquist frekansına kadar) mükemmel bir şekilde düz olan ve diğer her yerde sıfır olan bir tuğla duvar tepkisi olmalıdır. altörneklemeden sonra hiçbir örtüşme sızıntısı olmaz ve sonuç düz olmaz). Sonsuz miktarda zamanınız ve kaynaklarınız olmadığı sürece bu gerçekleştirilemez.H(ω)xd[n]

Filtre, istemediğiniz "bozulmanın" kaynağı olduğu için, işlemi filtre olmadan tekrar denemeyi düşünebilirsiniz. Ancak, ne alacağınızı düşünün:

xf[n]=x[n]=δ[nD]

xd[n]=xf[qn]=δ[qnD]

Eğer bir katı değil , ardından ya isterdi muhtemelen değildir.D x d [ n ] = 0 nqDxd[n]=0  n

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.