Понижение сигнала с помощью decimate

12

Я экспериментирую с прореживанием сигнала, в данном случае единичного импульса.

Я использую Python, с Pylab. Сначала я создаю импульс единицы и искажаю его на 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 сэмпла и результирующий прореженный сигнал

Во втором наборе графиков результирующий прореженный сигнал больше не является единичным сэмплом, а искажен.

Если я задержу сигнал с 5 - и любым кратным q - сэмплами, я снова получу первый набор графиков.

Исходный код функции decimate: 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]

Я использую фильтр нижних частот пихты перед тем, как уничтожить, импульсная характеристика фильтра

импульсный отклик фильтра нижних частот

Это объясняет, почему импульс искажается при наличии задержки, при прореживании выбираются части импульсного отклика, когда задержка кратна децимации, он выбирает только нули импульсного отклика и одну ненулевую выборку при Пик.

Есть ли способ прореживания единичной выборки с произвольной задержкой, что приводит к масштабированному выводу единичной выборки?

копье
источник
Вы понимаете, что импульс "единого образца" фактически представляет функцию sinc, верно? Потому что вы должны фильтровать псевдоним перед выборкой, и ваша идеальная математическая импульсная функция при фильтрации изменяется на sinc-функцию. Просто бывает, что сэмплы попадают точно в нули синка, поэтому это не похоже на это, но если бы синк был смещен менее чем на один сэмпл во времени, вы бы это увидели.
Эндолит

Ответы:

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]

Опять же, как вы заметили, это имеет эффект выдергивания другого набора отводов из отклика фильтра, так что прореженный выходной сигнал больше не равен нулю для всех, кроме одного сэмпла (т.е. он больше не выглядит как импульс ). Этого следовало ожидать. Почему?

xd[n]

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

H(ω)xd[n]

Поскольку фильтр является источником нежелательных искажений, вы можете попробовать повторить процесс без фильтра. Но подумайте, что вы получите тогда:

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

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

qDxd[n]=0  n

Джейсон Р
источник