間引きによる信号のダウンサンプリング


12

私は信号、この場合は単位インパルスを間引く実験をしています。

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

これにより、次のプロットが得られます。

3サンプル遅延のユニットインパルス、および結果として得られるデシメートされた信号

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ローパスフィルターを使用しています。フィルターのインパルス応答は

ローパスフィルターのインパルス応答

これは、遅延がある場合にインパルスが歪む理由を説明し、間引きはインパルス応答の一部を選択し、遅延が間引きの倍数である場合、インパルス応答のゼロのみを選択し、ピーク。

任意の遅延で単位サンプルを間引く方法はありますか?


「単一サンプル」インパルスが実際にsinc関数を表していることを理解していますか?サンプリングの前にアンチエイリアスフィルターを使用する必要があり、理想的な数学的インパルス関数はフィルター処理されるとsinc関数に変化するためです。サンプルがsincのゼロに正確に当たるのはたまたま起こるので、それはそのようには見えませんが、sincが時間内に1サンプル未満シフトした場合、それを見るでしょう。
エンドリス

回答:


11

バツ[n]

バツ[n]=δ[n]

h[n]

バツf[n]=バツ[n]h[n]=δ[n]h[n]=h[n]

q5

バツd[n]=バツf[qn]=h[qn]

qq2qnq0バツd[n]n=0でます。

バツ[n]

バツf[n]=h[nD]

バツd[n]=バツf[qn]=h[qnD]

繰り返しになりますが、これには、フィルターの応答から異なるタップのセットを抜き取る効果があります。その結果、デシメートされた出力信号は、1サンプルを除いてすべてゼロではなくなります(つまり、インパルスのようには見えなくなります) )。これは予想されることです。どうして?

バツd[n]

バツd[n]=h[qnD]ejωDHωq

Hωバツd[n]が遅延インパルスに等しくなるためには、フィルターは、通過帯域全体で(間引き後のナイキスト周波数まで)完全にフラットなブリックウォール応答を持ち、それ以外はゼロでなければなりません(そのため、ダウンサンプリング後にエイリアシングが漏れることはなく、結果は平坦ではありません)。無限の時間とリソースがない限り、これは実現できません。

フィルターは望ましくない「歪み」の原因であるため、フィルターなしでプロセスを再試行することを検討できます。ただし、その場合に何が得られるかを検討してください。

バツf[n]=バツ[n]=δ[nD]

バツd[n]=バツf[qn]=δ[qnD]

がの倍数でない場合qDバツd[n]=0  n

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.