Downsampling sinyal dengan decimate

12

Saya bereksperimen dengan menghilangkan sinyal, dalam hal ini impuls unit.

Saya menggunakan Python, dengan pylab. Pertama, saya membuat impuls satuan, dan memusnahkannya dengan 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))))

Ini hasil dengan plot berikut

Unit impuls dengan zero delay, dan sinyal yang dihancurkan

Saya kemudian menambahkan beberapa sampel penundaan sebelum impuls, dengan mengubah x ke:

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

Ini menghasilkan plot berikut

Unit impuls dengan 3 keterlambatan sampel, dan sinyal yang dihancurkan

Pada set plot kedua, sinyal yang dihancurkan tidak lagi menjadi sampel tunggal, tetapi telah terdistorsi.

Jika saya menunda sinyal dengan 5 - dan kelipatan q - sampel, saya mendapatkan set plot yang pertama lagi.

Kode sumber untuk fungsi decimate adalah, 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]

Saya menggunakan filter low pass fir sebelum menipiskan, respon impuls filter adalah

respon impuls filter low pass

Ini menjelaskan mengapa impuls terdistorsi ketika ada penundaan, penipisan memilih bagian dari respon impuls, ketika penundaan adalah kelipatan dari penipisan, itu hanya memilih nol dari respon impuls, dan satu sampel tidak nol pada puncaknya.

Apakah ada cara untuk memusnahkan sampel unit dengan penundaan sewenang-wenang, yang menghasilkan output sampel unit skala?

Tombak
sumber
Anda mengerti bahwa impuls "sampel tunggal" sebenarnya mewakili fungsi sinc, bukan? Karena Anda harus filter anti-alias sebelum pengambilan sampel, dan fungsi impuls matematika ideal Anda berubah menjadi fungsi sinc ketika difilter. Kebetulan sampel jatuh tepat di nol dari sinc, sehingga tidak terlihat seperti itu, tetapi jika sinc digeser kurang dari satu sampel dalam waktu, Anda akan melihatnya.
endolith

Jawaban:

11

Anda sepertinya mengerti benar apa yang sedang terjadi. Namun, saya tidak yakin apa yang Anda harapkan. Ambil contoh awal Anda. Biarkan sinyal input Anda menjadi :x[n]

x[n]=δ[n]

Langkah pertama dalam proses penipisan adalah sinyal input dihubungkan dengan respons impuls filter anti-aliasing :h[n]

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

Selanjutnya, sinyal yang difilter downsampled oleh faktor ( pada contoh Anda).q5

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

Seperti yang Anda perhatikan, untuk filter FIR yang pesanannya merupakan kelipatan (sebenarnya, karena filter adalah fase-linier, pesanan hanya perlu kelipatan dari ), keran pada waktu tunda adalah nol untuk semua . Karenanya, bukan nol hanya pada , seperti yang Anda temukan.qq2qnq0xd[n]n=0

Ketika Anda menerapkan penundaan waktu pada impuls input , maka output yang difilter hanya ditunda dengan jumlah yang sama, karena filternya linier dan invarian waktu (LTI) :x[n]

xf[n]=h[nD]

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

Sekali lagi, seperti yang Anda catat, ini memiliki efek memetik set tap yang berbeda dari respons filter, sehingga sinyal output yang didekodisasi tidak lagi nol untuk semua kecuali satu sampel (yaitu tidak terlihat seperti impuls lagi ). Ini yang diharapkan. Mengapa?

Ingat bahwa transformasi Fourier diskrit-waktu (DTFT) dari impuls diskrit adalah datar (dalam magnitudo) dalam domain frekuensi. Jika harus setara dengan impuls yang tertunda, ia juga harus memiliki besaran rata dalam domain frekuensi. Namun, DTFT-nya hanya salinan skala respons respons filter:xd[n]

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

di mana adalah respons frekuensi filter. Agar output sama dengan impuls tertunda, filter harus memiliki respons dinding-bata yang rata sempurna di passband-nya (hingga frekuensi Nyquist pasca-decimation) dan nol di tempat lain (jadi tidak ada kebocoran kembali setelah downsampling, membuat hasilnya tidak rata). Ini tidak dapat diwujudkan kecuali Anda memiliki waktu dan sumber daya yang tak terbatas.H(ω)xd[n]

Karena filter adalah sumber "penyimpangan" yang tidak Anda inginkan, Anda dapat mempertimbangkan untuk mencoba proses itu lagi tanpa filter. Tapi, pertimbangkan apa yang akan Anda dapatkan:

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

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

Jika bukan kelipatan , maka , yang mungkin juga bukan yang Anda inginkan.D x d [ n ] = 0 nqDxd[n]=0  n

Jason R
sumber