Bộ lọc không pha: Xác định các điều kiện ban đầu để lọc tiến lùi


7

Có ai quen thuộc với thuật toán của Gustafson để giảm thiểu quá độ trong quá trình lọc lùi về phía trước [1] không? Tôi đang cố gắng thực hiện nó và dự đoán đầu tiên của tôi là kiểm tra bộ lọc của Matlab, vì họ đang tham khảo bài báo. Trong hàm Matlab cũng có một hệ phương trình tuyến tính được giải để tìm các điều kiện ban đầu zi nhằm giảm thiểu các quá trình khởi động, nhưng mối quan hệ giữa tham chiếu và mã không rõ ràng đối với tôi. Các dòng mã duy nhất liên quan đến tối thiểu hóa là (nfilt là chiều dài của vectơ hệ số):

zi = ( eye(nfilt-1) - [-a(2:nfilt), [eye(nfilt-2); zeros(1,nfilt-2)]] ) \...
 ( b(2:nfilt) - b(1)*a(2:nfilt) );

Bất cứ ai cũng có thể chỉ cho tôi đi đúng hướng về cách những dòng đó liên quan đến thuật toán được mô tả trong bài viết của Gustafson?

[1] Gustafsson, F. "Xác định các trạng thái ban đầu trong quá trình lọc tiến lùi." Giao dịch IEEE® về xử lý tín hiệu. Tập 44, tháng 4 năm 1996, trang 988 Từ 992.


trạng thái ban đầu của bất kỳ bộ lọc IIR nào phải bằng 0 khi bắt đầu vượt qua bộ lọc chuyển tiếp và phải bằng 0 khi bắt đầu vượt qua bộ lọc ngược. trong cả hai lần truyền, tệp tín hiệu (hoặc bộ đệm) được lọc sẽ dài hơn bởi độ dài rõ ràng của IIR (mất bao lâu để đầu ra phân rã đủ gần đến 0 mà bạn có thể chọn để cắt phần còn lại của phân rã) .
robert bristow-johnson

Trong bài báo, tác giả tuyên bố rằng các bộ lọc tiến và lùi khác nhau trong biểu diễn không gian trạng thái của chúng. Bạn có thể giải thích lý do tại sao?
Maxtron

tốt, như tôi hiểu việc sử dụng filtfilt()tôi không thể hiểu tại sao. Tôi chưa đọc bài viết của Gustafson (tôi không phải là IEEE và không thể nhận nó miễn phí, bất cứ ai có bản sao đều được gửi email cho tôi .pdf của nó). khi sử dụng khái niệm này filtfilt, người ta có thể thực hiện nó cho toàn bộ tệp mẫu (đối với tôi, đó sẽ là tệp âm thanh hoặc âm thanh, như .wav) trước tiên hãy lọc âm thanh với phần đệm không ở cuối chừng nào bạn mong đợi đáp ứng xung của bộ lọc chuyển tiếp. làm kéo dài tập tin, nhưng đầu ra gần như bằng không. sau đó chạy tệp kết quả thông qua bộ lọc ngược.
robert bristow-johnson

Có một cách sử dụng khác, dựa trên một bài báo của Powell và Chau thực hiện filtfilttrong thời gian thực bằng cách chia đầu vào thành các khối mẫu, đệm không cho mỗi khối, lọc các khối về phía sau nhưng giữ "đuôi" lật ngược về hướng về phía trước và thêm chồng chéo. Powell-Chau đã không làm điều này, nhưng tôi nghĩ rằng đây là một ứng dụng tốt của các bộ lọc Truncated IIR, vì vậy bạn biết khi nào đầu ra khối phân rã kết thúc.
robert bristow-johnson

1
@ robertbristow-johnson: Tôi tình cờ thấy bản sao của bài báo Gustafsson này .
djvg

Câu trả lời:


5

Đối với bất kỳ ai quan tâm, tôi tình cờ tìm thấy một bài viết mô tả phương pháp được triển khai trong bộ lọc của matlab. Một liên kết đến giấy được đính kèm. Ít nhất theo sự hiểu biết của tôi, bộ lọc của matlab không thực hiện thuật toán Gustafson.

Sadovsky, P.; Bartusek, K: Tối ưu hóa đáp ứng nhất thời của bộ lọc kỹ thuật số, Radioengineering Vol. 9, số 2, 2000


Cũng xem scipy tài liệu cho lfilter_zi, đó là mặc định scipy.signal.filtfiltđể xác định các điều kiện ban đầu, như bạn có thể thấy trong nguồn . Trong trường hợp này, phần đệm 'lẻ' được sử dụng theo mặc định, nhưng nó có thể sử dụng phương thức của Gustafsson làm tùy chọn (xem xét định nghĩa _filtfilt_gusttrong nguồn).
djvg

0

Các zi = (...)\(...)dòng trong câu hỏi của OP xác định tình trạng ban đầu của bộ lọc. Tôi tin rằng cách tiếp cận chính xác tương tự được sử dụng bởi Python scipy. Theo các tài liệu scipy :

Một bộ lọc tuyến tính có thứ tự m có biểu diễn không gian trạng thái (A, B, C, D), trong đó đầu ra y của bộ lọc có thể được biểu thị như sau:

z (n + 1) = A z (n) + B x (n)

y (n) = C z (n) + D x (n)

Trong đó z (n) là vectơ có chiều dài m, A có hình dạng (m, m), B có hình dạng (m, 1), C có hình dạng (1, m) và D có hình dạng (1, 1) (giả sử x (n) là một vô hướng). lfilter_zi giải quyết:

zi = A * zi + B

Nói cách khác, nó tìm thấy điều kiện ban đầu mà đáp ứng cho đầu vào của tất cả các điều kiện là một hằng số .

(nhấn mạnh của tôi)

Lưu ý rằng filtfilttính toán trạng thái ban đầu zi, chia tỷ lệ theo giá trị mẫu đầu tiên, sau đó chuyển nó sang filter, thực sự áp dụng nó ( tài liệu ).

Một ví dụ cơ bản về cách trạng thái ban đầu này zicó thể được áp dụng trong bộ lọc, sử dụng biểu diễn không gian trạng thái, được cung cấp ở đây .

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.