Desmuestreo de una señal con diezmado

12

Estoy experimentando con diezmar una señal, en este caso un impulso unitario.

Estoy usando Python, con pylab. Primero, creo un impulso unitario y lo diezmo 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))))

Esto resulta con las siguientes parcelas

Impulso de la unidad con retraso cero y la señal diezmada resultante

Luego agrego algunas muestras de retraso antes del impulso, cambiando x a:

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

Esto da como resultado las siguientes parcelas

Impulso de la unidad con 3 muestras de retraso, y la señal diezmada resultante

En el segundo conjunto de gráficos, la señal diezmada resultante ya no es una sola muestra, sino que se ha distorsionado.

Si retraso la señal con 5 - y cualquier múltiplo de q - muestras, obtengo el primer conjunto de gráficos nuevamente.

El código fuente de la función diezmar es 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]

Estoy usando un filtro de paso bajo de abeto antes de diezmar, la respuesta al impulso del filtro es

respuesta al impulso del filtro de paso bajo

Esto explica por qué el impulso se distorsiona cuando hay un retraso, la aniquilación está seleccionando partes de la respuesta al impulso, cuando el retraso es un múltiplo de la aniquilación, solo selecciona los ceros de la respuesta al impulso y una muestra distinta de cero en el pico.

¿Hay alguna manera de diezmar una muestra unitaria con un retraso arbitrario, lo que resulta en una salida de muestra unitaria escalada?

lanza
fuente
Usted comprende que el impulso de "muestra única" en realidad representa una función sinc, ¿verdad? Debido a que tiene que filtrar el anti-alias antes del muestreo, y su función de impulso matemático ideal cambia a una función sinc cuando se filtra. Simplemente sucede que las muestras caen exactamente en los ceros del sinc, por lo que no se ve así, pero si el sinc se desplazara menos de una muestra a tiempo, lo verías.
endolito

Respuestas:

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]

xf[n]=h[nD]

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

Nuevamente, como notó, esto tiene el efecto de extraer un conjunto diferente de tomas de la respuesta del filtro, de modo que la señal de salida diezmada ya no sea cero para todas las muestras, excepto una (es decir, ya no parece un impulso). ) Esto es de esperar. ¿Por qué?

xd[n]

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

H(ω)xd[n]

Dado que el filtro es la fuente de la "distorsión" que no desea, puede considerar intentar el proceso nuevamente sin un filtro. Pero, considere lo que obtendría entonces:

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

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

qDxd[n]=0  n

Jason R
fuente