Downsampling một tín hiệu với decimate


12

Tôi đang thử nghiệm với việc xác định tín hiệu, trong trường hợp này là một xung đơn vị.

Tôi đang sử dụng Python, với pylab. Đầu tiên, tôi tạo một xung đơn vị và xác định nó bằng 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))))

Kết quả này với các ô sau

Xung đơn vị với độ trễ bằng 0 và tín hiệu giảm dần

Sau đó tôi thêm một vài mẫu độ trễ trước xung lực, bằng cách thay đổi x thành:

x = r_[zeros(3), 1, zeros(100)]

Điều này dẫn đến các lô sau

Xung đơn vị với độ trễ 3 mẫu và tín hiệu giảm dần

Trong tập hợp các ô thứ hai, tín hiệu bị suy giảm kết quả không còn là một mẫu đơn lẻ mà đã bị biến dạng.

Nếu tôi trì hoãn tín hiệu với 5 - và bất kỳ bội số q - mẫu nào, tôi sẽ nhận được bộ ô đầu tiên.

Mã nguồn cho hàm decimate là, 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]

Tôi đang sử dụng bộ lọc thông thấp trước khi xác định, đáp ứng xung của bộ lọc là

đáp ứng xung của bộ lọc thông thấp

Điều này giải thích tại sao xung bị biến dạng khi có độ trễ, số thập phân đang chọn các phần của đáp ứng xung, khi độ trễ là bội số của số thập phân, nó chỉ chọn số 0 của đáp ứng xung và một mẫu khác không tại đỉnh.

Có cách nào để ước lượng một mẫu đơn vị với độ trễ tùy ý, dẫn đến đầu ra mẫu đơn vị được chia tỷ lệ không?


Bạn hiểu rằng xung "mẫu đơn" thực sự đại diện cho một chức năng chân thành, phải không? Bởi vì bạn phải lọc bộ lọc bí danh trước khi lấy mẫu và hàm xung toán học lý tưởng của bạn thay đổi thành hàm chân khi được lọc. Nó chỉ xảy ra rằng các mẫu rơi chính xác vào số không của chân, vì vậy nó không giống như vậy, nhưng nếu độ chân được dịch chuyển ít hơn một mẫu trong thời gian, bạn sẽ thấy nó.
endolith

Câu trả lời:


11

x[n]

x[n]=δ[n]

h[n]

xf[n]=x[n]h[n]=δ[n]h[n]=h[n]

Tiếp theo, tín hiệu được lọc được ghép xuống theo hệ số q5

xd[n]=xf[qn]=h[qn]

Như bạn đã lưu ý, đối với các bộ lọc FIR có đơn hàng là bội số của qq2qnq0xd[n]n=0

x[n]

xf[n]=h[nD]

xd[n]=xf[qn]=h[qnD]

Một lần nữa, như bạn đã lưu ý, điều này có tác dụng rút ra một bộ vòi khác với phản hồi của bộ lọc, sao cho tín hiệu đầu ra bị suy giảm không còn là 0 đối với tất cả ngoại trừ một mẫu (nghĩa là nó không còn giống như một xung lực nữa ). Điều này là để được mong đợi. Tại sao?

xd[n]

xd[n]=h[qnD]ejωDH(ωq)

H(ω)xd[n]

Vì bộ lọc là nguồn gốc của "biến dạng" mà bạn không muốn, bạn có thể xem xét thử lại quy trình mà không có bộ lọc. Nhưng, hãy xem xét những gì bạn sẽ nhận được sau đó:

xf[n]=x[n]=δ[nD]

xd[n]=xf[qn]=δ[qnD]

qDxd[n]=0  n

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.