我在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]
抽取前我使用的是冷杉低通滤波器,该滤波器的脉冲响应为br />
这解释了为什么在有延迟的情况下,脉冲会失真,当延迟多时,抽取会选择部分脉冲响应在抽取的过程中,它仅选择脉冲响应的零,在峰值处选择一个非零样本。
是否有一种方法可以任意延迟抽取一个单位样本,从而导致标定单位样本输出?
#1 楼
您似乎正确理解了正在发生的事情。但是,我不确定您期望得到什么。以您最初的例子为例。让您的输入信号为$ x [n] $:$$
x [n] = \ delta [n]
$$
抽取过程的第一步是使输入信号与抗混叠滤波器的脉冲响应$ h [n] $:
$$
x_f [n]&= x [n] * h [n] \\
&= \ delta [n] * h [n] \\
&= h [n]
\ end {align}
$$
接下来,将对滤波后的信号进行$ q $降采样(在本例中为$ 5 $)。 $$
x_d [n] = x_f [qn] = h [qn]
$$
您已注意到,对于阶数为$ q $倍数的FIR滤波器(实际上,由于滤波器是线性相位,因此阶数只需为$ \ frac {q} {2} $的倍数),则对于所有$ q \ ne 0 $,在时间延迟$ qn $处的抽头均为零。因此,正如您所发现的,$ x_d [n] $仅在$ n = 0 $处为非零。输出只是延迟相同的量,因为滤波器是线性的并且是时不变的(LTI):
$$
x_d [n] = x_f [qn] = h [qn-D]
$$
又如您所述,这具有从滤波器的响应中抽出一组不同的抽头的效果,这样抽取后的输出信号对于一个采样,对于所有采样而言,不再是零,也就是说,它不再像脉冲一样。这是预料之中的。为什么?
请记住,离散脉冲的离散时间傅立叶变换(DTFT)在频域内是平坦的(幅度)。如果$ x_d [n] $等效于延迟脉冲,则它在频域中也必须具有平坦的幅度。但是,其DTFT只是滤波器频率响应的缩放副本:
$$
x_d [n] = h [qn-D] \ Leftrightarrow e ^ {-j \ omega D} H \ left(\ frac {\ omega} {q} \ right)
$$
其中$ H(\ omega)$是滤波器的频率响应。为了使抽取的输出$ x_d [n] $等于延迟的脉冲,滤波器的砖墙响应必须在通带范围内完全平坦(直到抽取后的奈奎斯特频率),而其他地方均为零(因此,在下采样后不会混叠泄漏,从而使结果不平坦)。除非您有无限的时间和资源,否则这是无法实现的。
由于过滤器是不需要的“失真”的来源,因此您可以考虑再次尝试该过程,一个过滤器。但是,请考虑一下您将得到什么:
$$
x_f [n] = x [n] = \ delta [nD]
$$
$$
x_d [n] = x_f [qn] = \ delta [qn-D]
$$
如果$ q $不是$ D的倍数$,然后$ x_d [n] = 0 \ \ forall \ n $,这可能也不是您想要的。
评论
您了解“单一样本”脉冲实际上代表了一个Sinc函数,对吗?因为您必须在采样之前进行抗锯齿滤波器,并且理想的数学脉冲函数在滤波后会变为正弦函数。碰巧样本恰好落在sinc的零点上,因此看起来并不像它,但是如果sinc的时间偏移少于一个样本,您会看到它。