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
Saya kemudian menambahkan beberapa sampel penundaan sebelum impuls, dengan mengubah x ke:
x = r_[zeros(3), 1, zeros(100)]
Ini menghasilkan plot berikut
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
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?
sumber
Jawaban:
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 ]
Langkah pertama dalam proses penipisan adalah sinyal input dihubungkan dengan respons impuls filter anti-aliasing :h[n]
Selanjutnya, sinyal yang difilter downsampled oleh faktor ( pada contoh Anda).q 5
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.q q2 qn q≠0 xd[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]
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]
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:
Jika bukan kelipatan , maka , yang mungkin juga bukan yang Anda inginkan.D x d [ n ] = 0 ∀ nq D xd[n]=0 ∀ n
sumber