Reduzir a amostragem de um sinal com dizimar

12

Estou experimentando dizimar um sinal, neste caso, um impulso unitário.

Estou usando Python, com pylab. Primeiro, eu crio um impulso unitário e o dizimo por 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))))

Isso resulta com os seguintes gráficos

Impulso unitário com atraso zero e o sinal dizimado resultante

Em seguida, adiciono algumas amostras de atraso antes do impulso, alterando x para:

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

Isso resulta nos seguintes gráficos

Impulso unitário com atraso de 3 amostras e o sinal dizimado resultante

No segundo conjunto de gráficos, o sinal dizimado resultante não é mais uma amostra única, mas foi distorcido.

Se eu atrasar o sinal com 5 - e qualquer múltiplo de q - amostras, recebo o primeiro conjunto de gráficos novamente.

O código fonte da função dizimar é 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]

Eu estou usando um filtro passa baixo de abeto antes de dizimar, a resposta de impulso do filtro é

resposta de impulso do filtro passa-baixo

Isso explica por que o impulso é distorcido quando há um atraso, a dizimação está selecionando partes da resposta ao impulso, quando o atraso é múltiplo da dizimação, ele seleciona apenas os zeros da resposta ao impulso e uma amostra diferente de zero em o pico.

Existe uma maneira de dizimar uma amostra de unidade com um atraso arbitrário, o que resulta em uma saída de amostra de unidade dimensionada?

Lança
fonte
Você entende que o impulso "amostra única" está realmente representando uma função sinc, certo? Como você precisa filtrar o anti-alias antes da amostragem, e sua função ideal de impulso matemático muda para uma função sinc quando filtrada. Acontece que as amostras caem exatamente nos zeros do sinc, por isso não se parece, mas se o sinc mudou menos de uma amostra no tempo, você o veria.
Endolith 27/08

Respostas:

11

x[n]

x[n]=δ[n]

h[n]

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

q5

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

qq2qnq0xd[n]n=0

x[n] linear e invariável no tempo (LTI) :

xf[n]=h[nD]

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

Novamente, como você observou, isso tem o efeito de extrair um conjunto diferente de toques da resposta do filtro, de modo que o sinal de saída dizimado não seja mais zero para todos, exceto uma amostra (ou seja, não parece mais um impulso) ) Isto é esperado. Por quê?

xd[n]

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

H(ω)xd[n]

Como o filtro é a fonte da "distorção" que você não deseja, considere tentar o processo novamente sem um filtro. Mas considere o que você obteria então:

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

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

qDxd[n]=0  n

Jason R
fonte