Vẽ sơ đồ đáp ứng cường độ của bộ lọc biquad


7

Tôi đã kết hợp EQ âm thanh đa băng tần bằng các bộ lọc biquad. Tôi đang nhận được các hệ số bằng các phương pháp từ sách dạy nấu ăn RBJ .

Bây giờ tôi muốn vẽ đường cong cho thấy phản ứng cường độ. Tôi đang sử dụng một phương trình từ nguồn này

Đây là chức năng của tôi để có được các hệ số và nhận được phản hồi cường độ tại các điểm quan tâm.

void GetCoefficients (double samplerate = 44100.0) {

    //from the rbj biquad coefficient cookbook by Robert Bristow-Johnson
    long double SR = (long double)samplerate;
    long double A = powl(10.0L, dBGain/40.0L);
    long double W0 = 2.0L * PI * Center / SR;
    long double alpha = sinl(W0)*sinhl( LN2/2.0L * WidthInOctaves * W0/sinl(W0));

    if (Type == "peaking") {
        b0 = 1.0L + alpha * A;
        b1 = -2.0L * cosl(W0);
        b2 = 1.0L - alpha * A;
        a0 = 1.0L + alpha / A;
        a1 = -2.0L * cosl(W0);
        a2 = 1.0L - alpha / A;
    }

    long double w;
    long double numerator;
    long double denominator;
    long double magnitude;

    for (int i = 0; i < 59; ++ i) {
        w = 2.0L*PI*FreqPoints[i] / SR;  
        numerator = b0*b0 + b1*b1 + b2*b2 + 2.0L*(b0*b1 + b1*b2)*cosl(w) + 2.0L*b0*b2*cosl(2.0L*w);
        denominator = 1.0L + a1*a1 + a2*a2 + 2.0L*(a1 + a1*a2)*cosl(w) + 2.0L*a2*cosl(2.0L*w);
        magnitude = sqrtl(numerator / denominator);
        FrequencyResponse[i] = magnitude;   
    }
}

Bộ lọc của tôi nghe có vẻ đúng, nhưng đường nối âm mưu của tôi sai. Ví dụ: khi tôi đã tính các hệ số cho bộ lọc tạo đỉnh có chiều rộng là2 quãng tám, tập trung tại 4398 Hz, với 3 dBthu được; đáp ứng cường độ của tôi bằng cách sử dụng các hệ số đó tại349 Hz nói về 12.

Tôi phải làm điều gì đó sai, nhưng tôi không thể tìm ra nó.


1
Điều đó có vẻ đúng với tôi. Rõ ràng không có gì sai. Gợi ý gỡ lỗi: thử bộ lọc bỏ qua, tử số và mẫu số sẽ xuất hiện giống nhau và a & b nên được xóa, tức là b2 = a0, b1 = a1, b0 = a2
Hilmar

1
Sẽ là tốt nhất nếu bạn đưa ra một ví dụ hoàn chỉnh, có thể biên dịch được. Chẳng hạn, bạn có thể gặp vấn đề khi khởi tạo FreqPointsmảng hoặc PIhằng số.
Jason R

Câu trả lời:


4

Một người nào đó tại diễn đàn KRV đã chỉ ra rằng tôi cần bình thường hóa các hệ số của mình sao cho a0 = 1.

b0 /= a0;
b1 /= a0;
b2 /= a0;
a1 /= a0;
a2 /= a0;
a0 = 1;

Giải quyết vấn đề của tôi.


hey hãy xem câu trả lời này . nó cho thấy một cách tốt hơn về mặt số để vẽ đáp ứng cường độ nếu bạn bị mắc kẹt với việc sử dụng các phao chính xác đơn.
robert bristow-johnson
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.