Sous-échantillonnage d'un signal avec décimation

12

J'expérimente la décimation d'un signal, dans ce cas une impulsion unitaire.

J'utilise Python, avec pylab. Tout d'abord, je crée une impulsion unitaire et je la décime de 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))))

Cela se traduit par les tracés suivants

Impulsion de l'unité avec un retard nul et le signal décimé résultant

J'ajoute ensuite quelques échantillons de délai avant l'impulsion, en changeant x en:

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

Il en résulte les tracés suivants

Impulsion unitaire avec un retard de 3 échantillons et le signal décimé résultant

Dans le deuxième ensemble de tracés, le signal décimé résultant n'est plus un seul échantillon, mais a été déformé.

Si je retarde le signal avec 5 - et n'importe quel multiple de q - échantillons, j'obtiens à nouveau le premier ensemble de tracés.

Le code source de la fonction de décimation est, 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]

J'utilise un filtre passe-bas en sapin avant de décimer, la réponse impulsionnelle du filtre est

réponse impulsionnelle du filtre passe-bas

Cela explique pourquoi l'impulsion est déformée lorsqu'il y a un retard, la décimation sélectionne des parties de la réponse impulsionnelle, lorsque le retard est un multiple de la décimation, elle ne sélectionne que les zéro de la réponse impulsionnelle et un échantillon non nul à le sommet.

Existe-t-il un moyen de décimer un échantillon unitaire avec un retard arbitraire, ce qui se traduit par une sortie d'échantillon unitaire mise à l'échelle?

Lance
la source
Vous comprenez que l'impulsion "échantillon unique" représente en fait une fonction sinc, non? Parce que vous devez filtrer l'anti-alias avant l'échantillonnage, et votre fonction d'impulsion mathématique idéale se transforme en fonction sinc lorsqu'elle est filtrée. Il se trouve que les échantillons tombent exactement sur les zéros du sinc, donc cela ne lui ressemble pas, mais si le sinc était décalé de moins d'un échantillon dans le temps, vous le verriez.
endolith

Réponses:

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]

Encore une fois, comme vous l'avez noté, cela a pour effet d'extraire un ensemble différent de prises de la réponse du filtre, de sorte que le signal de sortie décimé n'est plus nul pour tous les échantillons sauf un (c'est-à-dire qu'il ne ressemble plus à une impulsion ). C'est à prévoir. Pourquoi?

xd[n]

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

H(ω)xd[n]

Étant donné que le filtre est la source de la "distorsion" dont vous ne voulez pas, vous pourriez envisager de réessayer le processus sans filtre. Mais réfléchissez à ce que vous obtiendriez alors:

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

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

qDxd[n]=0  n

Jason R
la source