Tôi đã làm việc trên một bộ lọc thông thấp đơn giản để đo sáng <100 Hz trong ứng dụng của mình. Nhưng cho đến nay, tôi đang vật lộn với lý thuyết đằng sau tất cả. Thật tuyệt khi tôi làm cho nó hoạt động, nhưng tôi thực sự thích nó nếu tôi biết làm thế nào / tại sao nó hoạt động.
Tôi tìm thấy đoạn mã sau:
void getLPCoefficientsButterworth2Pole(const int samplerate, const double cutoff, double* const ax, double* const by)
{
double PI = M_PI;
double sqrt2 = sqrt(2);
double QcRaw = (2 * PI * cutoff) / samplerate; // Find cutoff frequency in [0..PI]
double QcWarp = tan(QcRaw); // Warp cutoff frequency
double gain = 1 / ( 1 + sqrt2 / QcWarp + 2 / ( QcWarp * QcWarp ) );
by[2] = ( 1 - sqrt2 / QcWarp + 2 / ( QcWarp * QcWarp ) ) * gain;
by[1] = ( 2 - 2 * 2 / ( QcWarp * QcWarp ) ) * gain;
by[0] = 1;
ax[0] = 1 * gain;
ax[1] = 2 * gain;
ax[2] = 1 * gain;
}
Để tính hệ số. Sau đó, trong các mẫu âm thanh, tôi 'vượt qua' chúng theo cách này:
xv[2] = xv[1];
xv[1] = xv[0];
xv[0] = pData[j];
yv[2] = yv[1];
yv[1] = yv[0];
yv[0] = (ax[0] * xv[0] + ax[1] * xv[1] + ax[2] * xv[2]
- by[1] * yv[0]
- by[2] * yv[1]);
pData[j] = yv[0];
Để có được một thiết kế đường thấp.
Tôi đang tự hỏi một vài điều:
- Tôi nhận được các mẫu âm thanh trong một mảng float * đơn giản. Số phao đó là gì? Điều duy nhất tôi thấy là một con số, đó là một đoạn âm thanh như thế nào?
- Mã đang sử dụng các tính toán trong quá khứ (ba trong số chúng) trong tính toán mới trên mỗi mẫu. Điều đó có nghĩa là 2 mẫu dữ liệu đầu tiên không được lọc chính xác? (không phải là vấn đề vì nó chỉ là 2 mẫu, nhưng chỉ cần tự hỏi)
- Cố gắng học mọi thứ, tôi tìm thấy một vài công thức cho bộ lọc Butterworth (Cực 2). Làm thế nào là những công thức được phản ánh trong mã này? Không có công thức nào tôi tìm thấy có những tính toán này mà bạn có thể thấy trong hàm 'getLPCoefficentsButterworth2Pole ()'.