Làm cách nào tôi có thể vector hóa các tính toán cho bộ lọc đệ quy bậc nhất?


9

Tôi có một bộ lọc thông thấp cực đơn giản (để làm mịn tham số) có thể được giải thích bằng công thức sau:

y[n]=(1a)y[n1]+ax[n]

Kiến trúc mà tôi đang sử dụng có quyền truy cập vào các lệnh đơn hướng dẫn, nhiều dữ liệu (SIMD) có thể thực hiện song song nhiều phép tính vector hóa. Tôi muốn tận dụng khả năng này, nhưng tôi không chắc làm thế nào để làm điều đó cho một bộ lọc đệ quy như thế này. Vấn đề là mọi tính toán đều cần một kết quả trước đó.


Ai đó có thể vui lòng làm rõ lý do tại sao điều này đã bị đóng là "lạc đề"?
Paul R

Câu hỏi chồng chéo giữa đây và Stack Overflow. Câu hỏi ban đầu được hỏi cụ thể về cách triển khai nó bằng các phần mở rộng ARM NEON. Câu hỏi sẽ sống trên cả hai trang web; nó đã được chỉnh sửa ở đây để làm cho nó trở thành một cuộc thảo luận lý thuyết về cấu trúc vấn đề để tận dụng sự song song.
Jason R

@PaulR Tôi đã yêu cầu nó được di chuyển ở đây ngày hôm qua, nhưng phonon cảm thấy mạnh mẽ rằng nó thuộc về SO, và không phải ở đây. Tôi sẽ thừa nhận, tôi không biết cụ thể về ARM NEON, và anh ấy có lẽ đúng và tôi tôn trọng phán đoán của anh ấy. Xem câu hỏi meta này . Câu trả lời đã bị xóa của tôi về cơ bản nói rằng tôi đồng ý với Jason R và người dùng nên gắn cờ những câu hỏi như vậy để di chuyển
Lorem Ipsum

1
Cảm ơn cả hai đã làm rõ - Tôi đã cố gắng hết sức để SO đưa các câu hỏi liên quan đến DSP được di chuyển đến đây để nâng cao hồ sơ của chúng tôi, vì vậy tôi lo ngại liệu đây có phải là điều đúng đắn khi câu hỏi này bị đóng không - rất vui khi thấy nó mở lại bây giờ ở dạng tổng quát hơn.
Paul R

Câu trả lời:


7

Giả sử rằng bạn thực hiện các phép toán vectơ tại một thời điểm, bạn có thể hủy bỏ phương trình sai phân theo hệ số M khá dễ dàng cho bộ lọc đơn cực đơn giản. Giả sử rằng bạn đã tính tất cả các kết quả đầu ra lên đến y [ n ] . Sau đó, bạn có thể tính toán những cái tiếp theo như sau: y [ n + 1 ]MMy[n]

y[n+1]=(1a)y[n]+ax[n+1]y[n+2]=(1a)y[n+1]+ax[n+2]=(1a)((1a)y[n]+ax[n+1])+ax[n+2]=(1a)2y[n]+a(1a)x[n+1]+ax[n+2]

Nói chung, bạn có thể viết là:y[n+k]

y[n+k]= =(1-một)ky[n]+ΣTôi= =1kmột(1-một)k-Tôix[n+Tôi]

Đối với mỗi chỉ số mẫu , điều này trông giống như một bộ lọc FIR với k + 1 vòi: một lần nhấn nhân đầu ra của bộ lọc cuối cùng y [ n ] và các vòi k khác nhân với các đầu vào bộ lọc x [ n + 1 ] , , x [ n + k ] . Điều tuyệt vời là các hệ số được sử dụng cho tất cả các vòi này có thể được tính toán trước, cho phép bạn hủy đăng ký bộ lọc đệ quy vào M M + 1n+kk+1y[n]kx[n+1],,x[n+k]M M+1-tap song song bộ lọc không đệ quy (các bộ lọc này tính toán mẫu đầu ra ), cập nhật các thông tin phản hồi hạn mỗi M mẫu đầu ra. Vì vậy, với điều kiện ban đầu y [ n ] (được giả sử là đầu ra cuối cùng được tính trên lần lặp vectơ trước đó), bạn có thể tính song song các đầu ra M tiếp theo .y[n+1],,y[n+M]My[n]M

Có một số cảnh báo cho phương pháp này:

  • Nếu trở nên lớn, thì cuối cùng bạn sẽ nhân một loạt các số với nhau để có được hệ số FIR hiệu quả cho các bộ lọc không được kiểm soát. Tùy thuộc vào định dạng số của bạn và giá trị của a , điều này có thể có ý nghĩa chính xác về số.Ma

  • My[n+k]kMk2MMMM+1M

    R=M+12M=12(1+1M)

    MM=4M=8y[n]y[n1]. Hiệu ứng này rõ ràng là rất phụ thuộc vào nền tảng.


3

Nói chung, bạn chỉ có thể vector hóa các bộ tính toán hoàn toàn độc lập. Nhưng trong IIR pass thấp của bạn, mọi đầu ra đều phụ thuộc vào một cái khác (trừ cái thứ 1), vì vậy vector hóa là không thể.

Nếu biến "a" của bạn đủ lớn để (1-a) ^ n nhanh chóng phân rã xuống dưới mức tiếng ồn mong muốn hoặc lỗi được phép, bạn có thể thay thế một xấp xỉ bộ lọc FIR ngắn cho IIR của mình và thay vào đó là vectơ tích chập. Nhưng điều đó không có khả năng nhanh hơn.


2

Bạn chỉ có thể thực sự vector hóa hiệu quả này nếu bạn có nhiều tín hiệu mà bạn muốn áp dụng cùng một bộ lọc, ví dụ: nếu đó là tín hiệu âm thanh nổi thì bạn có thể xử lý song song kênh trái và phải. Bốn hoặc tám kênh song song rõ ràng sẽ tốt hơn nữa.


0

Làm thế nào về việc mở rộng phương trình lên 4 bước và sử dụng phép nhân ma trận? a là hằng số nên một ma trận có thể được tính toán trước


0

Hiệu quả nhất là vectơ lọc song song một số luồng độc lập.

Nếu bạn chỉ có một luồng dài duy nhất, bạn cũng có thể chia luồng thành nhiều phần chồng chéo và lọc chúng như thể chúng là các luồng độc lập.

Bạn muốn có sự trùng lặp vì một vài mẫu đầu tiên của mỗi luồng sẽ không chính xác. Lượng mẫu bạn cần loại bỏ sẽ phụ thuộc vào giá trị của a và độ chính xác mong muốn. Bạn sẽ muốn loại bỏ khoảng n mẫu trong đó (1 / a) (1-a) ** n <eps để kết quả sẽ chính xác với eps * max (| x [i] |).

Ví dụ: nếu a = 0,1, thì trong 128 mẫu, lỗi gây ra bởi (1 / a) (1-a) ^ n sẽ nhỏ hơn LSB trong số nguyên 16 bit, trong khi với a = 0,9, bạn chỉ cần loại bỏ khoảng 6 mẫu.

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.