DSP & chỉnh âm

Biquad và bộ lọc IIR: nền tảng của mọi bộ EQ số

Cimo 8 phút đọc

Giải thích biquad và bộ lọc IIR trong EQ số: phương trình Direct Form I, cách tính hệ số theo RBJ Audio EQ Cookbook kèm ví dụ tính tay, cascade nhiều band và vấn đề ổn định số.

Biquad và bộ lọc IIR: nền tảng của mọi bộ EQ số
Mục lục
  1. IIR là gì, khác FIR ở điểm nào?
  2. Biquad và phương trình Direct Form I
  3. Từ 5 hệ số tạo ra nhiều dạng lọc
  4. Cascade: nối tiếp nhiều biquad
  5. Tính hệ số theo RBJ Audio EQ Cookbook
  6. Công thức peaking đầy đủ
  7. Ví dụ tính tay peaking
  8. Ổn định số: fixed-point, float và cấu trúc lọc
  9. Code C minh họa xử lý một mẫu
  10. Câu hỏi thường gặp
  11. Biquad là bộ lọc hoàn chỉnh hay chỉ là khối xây dựng?
  12. Một band EQ tham số dùng mấy biquad?
  13. Vì sao phải chuẩn hóa hệ số theo a0?
  14. Dùng fixed-point cho biquad có được không?
  15. Đổi hệ số giữa chừng có gây tiếng bụp không?

Biquad là khối lọc số bậc 2 chạy một phương trình hồi tiếp ngắn với 5 hệ số, và gần như mọi band (dải chỉnh) của EQ (equalizer — bộ cân bằng tần số) số đều được xây từ khối này. Chỉ thay 5 hệ số, cùng một đoạn code có thể thành low-pass, high-pass, peaking hay shelf. Bài này thuộc cụm DSP & EQ; nếu mới bắt đầu, hãy đọc trước bài tổng quan DSP âm thanh là gì và cách chọn nền tảng xử lý.

IIR là gì, khác FIR ở điểm nào?

IIR (Infinite Impulse Response — đáp ứng xung vô hạn) là họ lọc mà mẫu ra hiện tại phụ thuộc vào mẫu vào hiện tại, các mẫu vào trước và cả các mẫu ra trước đó. Phần phụ thuộc vào đầu ra cũ gọi là hồi tiếp (feedback). FIR (Finite Impulse Response — đáp ứng xung hữu hạn) thì không có hồi tiếp: đầu ra chỉ là tổng có trọng số của một số hữu hạn mẫu vào gần nhất.

Tiêu chíIIRFIR
Hồi tiếpCó, dùng lại đầu ra trướcKhông
Chi phí tínhÍt phép tínhThường cần nhiều hệ số hơn
PhaPhi tuyếnCó thể tuyến tính pha nếu hệ số đối xứng
Độ trễThấp(N − 1)/2 mẫu, N là số taps
Ổn địnhPhải kiểm tra, hồi tiếp có thể gây mất ổn địnhVốn ổn định với hệ số hữu hạn

Ví dụ độ trễ FIR: FIR tuyến tính pha 128 taps ở sample rate (tần số lấy mẫu) 48 kHz trễ (128 − 1)/2 = 63,5 mẫu, khoảng 1,32 ms — kết quả tính toán, không phải kết quả đo. Đổi lại, pha của IIR phi tuyến: khi cascade nhiều tầng hoặc cắt tần cho loa, thay đổi pha ở vùng giao nhau cần được tính cùng đáp tuyến biên độ.

Biquad và phương trình Direct Form I

Biquad là bộ lọc IIR bậc 2: phương trình của nó dùng tới mẫu trễ hai bước, hàm truyền có đa thức bậc 2 ở tử và mẫu. Nó là đơn vị xây dựng cơ bản của EQ số vì linh hoạt, ngắn, dễ chạy thời gian thực và dễ nối tiếp thành hệ lớn. Dạng Direct Form I viết trực tiếp phương trình sai phân, đã chuẩn hóa a0 = 1:

y[n] = b0 × x[n] + b1 × x[n−1] + b2 × x[n−2] − a1 × y[n−1] − a2 × y[n−2]

  • x[n]: mẫu vào hiện tại; x[n−1], x[n−2]: một và hai mẫu vào trước đó.
  • y[n]: mẫu ra hiện tại; y[n−1], y[n−2]: một và hai mẫu ra trước đó — chính hồi tiếp này tạo nên IIR.
  • b0, b1, b2: hệ số phía đầu vào; a1, a2: hệ số hồi tiếp. Dấu trừ trước a1, a2 là quy ước của phương trình, chép hệ số phải giữ đúng dấu.

Mỗi mẫu chỉ cần lưu hai mẫu vào cũ và hai mẫu ra cũ cho mỗi kênh. Một biquad Direct Form I cần 5 phép nhân và 4 phép cộng cho mỗi mẫu mỗi kênh — đếm trực tiếp từ phương trình. Chi phí thấp này giúp nhiều biquad chạy thời gian thực được trên DSP và vi điều khiển.

Ảnh khái niệm trừu tượng về đường cong lọc tần số phát sáng trên nền tối, minh họa hình dạng đáp tuyến của một band EQ

Từ 5 hệ số tạo ra nhiều dạng lọc

Người dùng chỉ chỉnh tần số, độ rộng và mức tăng giảm; firmware âm thầm tính lại hệ số.

Dạng lọcTác dụngỨng dụng
Low-passQua tần thấp, giảm tần caoCắt trên cho sub
High-passQua tần cao, giảm tần thấpCắt rumble, bảo vệ loa nhỏ
PeakingTăng/giảm quanh tần số trung tâmBand EQ tham số
Low-shelfTăng/giảm vùng dưới một tần sốChỉnh ấm, giảm bass
High-shelfTăng/giảm vùng trên một tần sốChỉnh sáng, giảm chói
NotchGiảm sâu, hẹp tại một tần sốTriệt điểm hú, nhiễu hẹp

Với peaking và shelf, ba thông số điều khiển chính là tần số trung tâm f0, hệ số Q và gain; xem giải thích chi tiết trong bài về tần số trung tâm, hệ số Q và gain trong EQ.

Cascade: nối tiếp nhiều biquad

Nối tiếp (cascade) nhiều biquad sẽ tạo bộ lọc bậc cao hoặc EQ nhiều band: đầu ra của tầng trước thành đầu vào của tầng sau. EQ tham số 5 band thường là 5 biquad peaking nối tiếp. Đáp tuyến tổng bằng tổng dB của từng tầng tại mỗi tần số, nên các band lân cận luôn chồng lấp và ảnh hưởng lẫn nhau. Cách chia gain cũng ảnh hưởng headroom (khoảng dự trữ trước quá tải số): một tầng tăng mạnh có thể làm tín hiệu vượt mức ngay giữa chuỗi, nên cần kiểm tra mức sau các tầng quan trọng.

Tính hệ số theo RBJ Audio EQ Cookbook

Bộ công thức phổ biến nhất cho việc này là RBJ Audio EQ Cookbook của Robert Bristow-Johnson, tài liệu tham chiếu chuẩn cho từng dạng lọc theo Fs, f0, Q và gain. Quy ước chung: tính 6 hệ số chưa chuẩn hóa b0, b1, b2, a0, a1, a2, rồi chia tất cả cho a0 để về dạng a0 = 1.

Công thức peaking đầy đủ

A = 10^(gain/40); ω0 = 2π × f0/Fs; α = sin(ω0)/(2Q)

b0 = 1 + αA; b1 = −2cos(ω0); b2 = 1 − αA

a0 = 1 − αA; a1 = −2cos(ω0); a2 = 1 + αA

Trong đó Fs là sample rate (Hz), f0 là tần số trung tâm (Hz), ω0 là tần số góc chuẩn hóa (rad/mẫu), α là hệ số trung gian theo Q, A là gain tuyến tính từ gain dB. Lưu ý peaking dùng A = 10^(gain/40), không phải /20.

Ví dụ tính tay peaking

Giả định: Fs = 48 kHz, f0 = 1000 Hz, Q = 1,0, gain = +6 dB. Các số sau là kết quả tính toán theo công thức RBJ, không phải kết quả đo:

  • A ≈ 1,4125; ω0 ≈ 0,13090 rad; sin(ω0) ≈ 0,13053 nên α ≈ 0,06526; cos(ω0) ≈ 0,99144.
  • Chưa chuẩn hóa: b0 ≈ 1,09219; b1 ≈ −1,98289; b2 ≈ 0,90781; a0 ≈ 0,90781; a1 ≈ −1,98289; a2 ≈ 1,09219.
  • Chia tất cả cho a0: b0 ≈ 1,20310; b1 ≈ −2,18425; b2 = 1,00000; a1 ≈ −2,18425; a2 ≈ 1,20310.

Dấu hiệu kiểm tra: b2 sau chuẩn hóa bằng 1,00000 và a2 bằng b0; nếu lệch xa, rà lại dấu b1, a1, α và bước chia cho a0. Đối chiếu dạng khác: low-pass ở Fs = 48 kHz, f0 = 3000 Hz, Q = 0,7071 có hệ số đã chuẩn hóa b0 ≈ 0,02995; b1 ≈ 0,05991; b2 ≈ 0,02995; a1 ≈ −1,45424; a2 ≈ 0,57406 (theo RBJ).

Ổn định số: fixed-point, float và cấu trúc lọc

Biquad đúng về toán chưa chắc bền trong số học hữu hạn. Hai tình huống nhạy nhất là f0 rất thấp so với Fs và Q rất cao. Khi f0/Fs rất nhỏ, ω0 gần 0, cos(ω0) gần 1 và đáp tuyến chỉ còn dựa trên hiệu số rất nhỏ giữa các hệ số hồi tiếp: sai số làm tròn nhỏ cũng có thể dịch tần số hoặc đổi Q. Khi Q rất cao, vị trí cực nằm gần vòng tròn đơn vị; lượng tử hóa hệ số có thể đẩy cực ra ngoài, gây mất ổn định.

Rủi ro lớn hơn trong fixed-point (số dấu chấm cố định), nơi số bit cho phần lẻ bị giới hạn nên cùng một sai số làm tròn chiếm tỉ lệ lớn hơn. Vì vậy thực tế thường xử lý bằng float 32-bit, cho độ phân giải và dải động tốt hơn, hoặc dùng cấu trúc Direct Form II transposed — cách sắp xếp lại phép tính và biến trạng thái của cùng một hàm truyền, thường cho hành vi số học thuận lợi hơn. Cả hai không đổi đáp tuyến lý tưởng; chúng chỉ đổi cách sai số xuất hiện. Hãy kiểm tra trường hợp biên: f0 thấp nhất, Q cao nhất, gain lớn nhất.

Code C minh họa xử lý một mẫu

Code dưới đây viết bằng C cho môi trường C nhúng nói chung; đây là code minh họa chưa kiểm thử trên phần cứng cụ thể, chưa gắn với SDK hay chip nào. c[0..4] là b0, b1, b2, a1, a2 đã chuẩn hóa; m[0..3] giữ x[n−1], x[n−2], y[n−1], y[n−2], khởi tạo 0, giữ riêng từng kênh và từng biquad.

float biquad_process(float x, const float c[5], float m[4])
{
float y = c[0]*x + c[1]*m[0] + c[2]*m[1] - c[3]*m[2] - c[4]*m[3];
m[1] = m[0]; m[0] = x;
m[3] = m[2]; m[2] = y;
return y;
}

Gọi hàm một lần cho mỗi mẫu; khi cascade, lấy y của tầng trước làm x của tầng sau, mỗi tầng dùng trạng thái riêng. Đổi hệ số đột ngột khi đang phát có thể gây tiếng bụp ngắn — phải kiểm thử trên hệ thống đích.

Tóm lại, biquad là một phương trình hồi tiếp bậc 2 có thể tính hệ số bằng tay và chạy bằng vài phép nhân cộng. Nắm phương trình sai phân, công thức RBJ và giới hạn ổn định số là nền để đọc tài liệu EQ số.

Nếu đang chọn mạch DSP hoặc module có EQ cho loa DIY, hãy xem thông số sản phẩm tại cimo.vn và đối chiếu sample rate, nền tảng xử lý và khả năng chỉnh EQ trước khi quyết định.

Câu hỏi thường gặp

Biquad là bộ lọc hoàn chỉnh hay chỉ là khối xây dựng?

Cả hai: nó là bộ lọc bậc 2 hoàn chỉnh cho một nhiệm vụ, đồng thời là khối để cascade thành lọc bậc cao và EQ nhiều band.

Một band EQ tham số dùng mấy biquad?

Thường một band peaking dùng một biquad; EQ 5 band thường là 5 biquad nối tiếp, chưa kể high-pass hay shelf bổ sung.

Vì sao phải chuẩn hóa hệ số theo a0?

Công thức RBJ cho ra cả a0. Chia tất cả cho a0 đưa phương trình về a0 = 1, để code chỉ cần 5 hệ số.

Dùng fixed-point cho biquad có được không?

Được, nhưng rủi ro cao ở f0 rất thấp so với Fs hoặc Q rất cao; float 32-bit thường an toàn và dễ triển khai hơn.

Đổi hệ số giữa chừng có gây tiếng bụp không?

Có thể, vì trạng thái hồi tiếp vẫn giữ thông tin cấu hình cũ. Cần kiểm thử trên phần cứng đích và cân nhắc chuyển đổi mềm.

#biquad
Chia sẻ bài viết
Facebook
Cimo
Cimo
Cimo - Mọi thứ bạn cần với mức giá tốt nhất

Bài viết liên quan

Tất cả danh mục
Flash Sale
Ưu đãi hôm nay
Đấu giá