Saya telah mengerjakan filter low pass sederhana untuk pengukuran <100 Hz dalam aplikasi saya. Namun sejauh ini, saya berjuang dengan teori di balik itu semua. Sangat keren saya membuatnya bekerja, tetapi saya akan benar-benar menikmatinya jika saya tahu bagaimana / mengapa itu bekerja.
Saya menemukan kode berikut:
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;
}
Untuk menghitung Koefisien. Kemudian, dalam sampel audio, saya 'lulus rendah' dengan cara ini:
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];
Untuk mendapatkan desain lowpass.
Saya bertanya-tanya beberapa hal:
- Saya menerima sampel audio dalam float * array sederhana. Berapa nomor float itu? Satu-satunya hal yang saya lihat adalah angka, bagaimana itu sepotong suara?
- Kode menggunakan perhitungan sebelumnya (tiga di antaranya) dalam perhitungan baru per sampel. Apakah itu berarti bahwa 2 sampel data pertama tidak difilter dengan benar? (Bukan berarti itu penting karena hanya 2 sampel, tetapi hanya ingin tahu)
- Mencoba mempelajari semuanya, saya menemukan beberapa formula untuk filter Butterworth (2nd Pole). Bagaimana rumus-rumus itu tercermin dalam kode ini? Tidak ada rumus yang saya temukan memiliki perhitungan ini yang dapat Anda lihat di fungsi 'getLPCoefficientsButterworth2Pole ()'.