我正在尝试抽取信号,在这种情况下是单位脉冲。

我在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 />

这解释了为什么在有延迟的情况下,脉冲会失真,当延迟多时,抽取会选择部分脉冲响应在抽取的过程中,它仅选择脉冲响应的零,在峰值处选择一个非零样本。

是否有一种方法可以任意延迟抽取一个单位样本,从而导致标定单位样本输出?

评论

您了解“单一样本”脉冲实际上代表了一个Sinc函数,对吗?因为您必须在采样之前进行抗锯齿滤波器,并且理想的数学脉冲函数在滤波后会变为正弦函数。碰巧样本恰好落在sinc的零点上,因此看起来并不像它,但是如果sinc的时间偏移少于一个样本,您会看到它。

#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 $,这可能也不是您想要的。