Я экспериментирую с прореживанием сигнала, в данном случае единичного импульса.
Я использую 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)]
Это приводит к следующим участкам
Во втором наборе графиков результирующий прореженный сигнал больше не является единичным сэмплом, а искажен.
Если я задержу сигнал с 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]
Я использую фильтр нижних частот пихты перед тем, как уничтожить, импульсная характеристика фильтра
Это объясняет, почему импульс искажается при наличии задержки, при прореживании выбираются части импульсного отклика, когда задержка кратна децимации, он выбирает только нули импульсного отклика и одну ненулевую выборку при Пик.
Есть ли способ прореживания единичной выборки с произвольной задержкой, что приводит к масштабированному выводу единичной выборки?