对信号进行降采样


12

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

我在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)]

结果如下图

具有3个采样延迟的单位脉冲,以及产生的抽取信号

在第二组绘图中,所得的抽取信号不再是单个样本,而是失真了。

如果我将信号延迟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年

Answers:


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.