私は信号、この場合は単位インパルスを間引く実験をしています。
pylabでPythonを使用しています。最初に、単位インパルスを作成し、それを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))))
これは、次のプロットで発生します
次に、xを次のように変更して、インパルスの前にいくつかの遅延サンプルを追加します。
x = r_[zeros(3), 1, zeros(100)]
これにより、次のプロットが得られます。
2番目のプロットセットでは、結果として得られるデシメートされた信号は単一のサンプルではなく、歪んでいます。
5-およびq-の倍数のサンプルで信号を遅延させると、最初のプロットセットが再び取得されます。
デシメート関数のソースコードは、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]
間引きする前にfirローパスフィルターを使用しています。フィルターのインパルス応答は
これは、遅延がある場合にインパルスが歪む理由を説明し、間引きはインパルス応答の一部を選択し、遅延が間引きの倍数である場合、インパルス応答のゼロのみを選択し、ピーク。
任意の遅延で単位サンプルを間引く方法はありますか?