Làm thế nào để xếp tầng biquad cho bộ lọc bậc cao hoạt động?


20

Tôi đang cố gắng triển khai bộ lọc IIR thứ 8 và mọi ghi chú ứng dụng và sách giáo khoa mà tôi đã đọc nói rằng tốt nhất là thực hiện bất kỳ bộ lọc nào có thứ tự nhiều hơn 2 như phần thứ hai. Tôi đã sử dụng tf2sostrong MATLAB để lấy các hệ số cho các phần thứ tự thứ hai, cho tôi một hệ số 6x4 cho 4 phần thứ tự thứ hai, như mong đợi. Trước khi triển khai dưới dạng SOS, bộ lọc thứ tự 8 yêu cầu 7 giá trị mẫu trước đó được lưu trữ (và cả giá trị đầu ra). Bây giờ khi thực hiện như các phần thứ tự thứ hai, luồng hoạt động từ đầu vào đến đầu ra như thế nào, tôi có cần chỉ lưu trữ 2 giá trị mẫu trước đó không? Hoặc đầu ra của nguồn cấp dữ liệu bộ lọc đầu tiên như x_introng bộ lọc thứ hai, v.v.


bạn cần lưu trữ các trạng thái trước đó cho mọi giai đoạn, tùy thuộc vào thứ tự của bộ lọc trong giai đoạn đó để nó không chỉ là 2 như bạn đã đề cập

Câu trả lời:


13

Đó là điều cuối cùng bạn nói ("Hoặc đầu ra của nguồn cấp dữ liệu bộ lọc đầu tiên là x_in vào bộ lọc thứ hai, v.v."). Ý tưởng rất đơn giản: bạn coi các biquads như các bộ lọc bậc hai riêng biệt nằm trong tầng. Đầu ra từ bộ lọc đầu tiên là đầu vào thứ hai, v.v., do đó, các dòng trễ được trải ra giữa các bộ lọc. Nếu bạn cần tối ưu hóa cấu trúc trong môi trường bị giới hạn bộ nhớ, bạn có thể lưu ý rằng các biquad liền kề có bộ nhớ trễ dự phòng (tức là một vài mẫu đầu ra cuối cùng của giai đoạn 1 giống như một vài mẫu đầu vào cuối của giai đoạn 2, vì vậy bạn không Sẽ không phải lưu trữ chúng một cách riêng biệt như bạn muốn nếu bạn chỉ thực hiện các bộ lọc một cách cô lập).


Cảm ơn! Tôi chỉ quản lý để nhanh chóng làm điều đó trong MATLAB. Nguyên nhân của sự nhầm lẫn trước đó là do tôi quên nhân hệ số khuếch đại (ugh!) Và do đó tất cả các loại ý tưởng bắt đầu len vào.
anasimtiaz

Nếu bạn không yêu cầu mức tăng như một đầu ra arg từ tf2sos (như trong mã ví dụ của tôi được đăng) thì bạn không cần phải nhân lại lần nữa.
học

9

Thực tế có hai cách để thực hiện các phần thứ hai: song song và nối tiếp. Trong phiên bản nối tiếp, đầu ra của phần N là đầu vào của phần N + 1. Trong phiên bản song song, tất cả các phần có cùng một đầu vào (và chỉ có một số 0 thực thay vì một cặp số không phức tạp liên hợp) và mỗi đầu ra của từng phần được tóm tắt đơn giản. Hai phương thức có liên quan thông qua việc mở rộng một phần của hàm truyền Z-domain. CẢNH BÁO: đây là một vấn đề phức tạp về số lượng và việc thực hiện Matlab tiêu chuẩn có thể có các lỗi số rất lớn đối với các bộ lọc âm thanh điển hình có cực gần với vòng tròn đơn vị.


6

Dưới đây là một chút mã trình diễn để cho thấy lý do tại sao bạn nên xếp tầng thứ 2 tốt hơn.

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

Đối với bộ lọc thông thấp được đưa ra trong ví dụ trên, theo các đơn hàng khoảng 12 đến 13, các lỗi số được xây dựng để đưa ra một phản ứng xung rõ ràng khác nhau cho việc triển khai không sử dụng các phép chia tầng. Tùy thuộc vào bộ lọc, số dặm của bạn sẽ thay đổi.

ĐẶT HÀNG = 10

nhập mô tả hình ảnh ở đây

ĐẶT HÀNG = 13

nhập mô tả hình ảnh ở đây


@learvst Sửa lỗi cho tôi nếu tôi sai, nhưng mã của bạn bị mất lợi nhuận. Không nên là:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
user915783 30/03/2015
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.