我正在尝试抽取信号,在这种情况下为单位脉冲。
我在pylab中使用Python。首先,我创建一个单位冲量,并将其减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-的任意倍数,则将再次获得第一组曲线图。
十进制函数的源代码为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函数,对吗?因为您必须在采样前进行抗锯齿滤波器,并且理想的数学脉冲函数在滤波后会变为正弦函数。碰巧样本恰好落在正弦的零点上,因此看起来并不像它,但是如果正弦在时间上的偏移少于一个样本,您会看到它。
—
endlith 2012年