Ho lavorato su un semplice filtro passa basso per una misurazione <100 Hz nella mia applicazione. Ma finora, sto lottando con la teoria alla base di tutto. È bello che l'ho fatto funzionare, ma mi piacerebbe davvero se sapessi come / perché funziona.
Ho trovato il seguente codice:
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;
}
Per calcolare i coefficienti. Quindi, nei campioni audio, li passo in basso in questo modo:
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];
Per ottenere un design passa-basso.
Mi chiedo alcune cose:
- Ricevo i campioni audio in un semplice array float *. Cos'è quel numero float? L'unica cosa che vedo è un numero, come è un suono?
- Il codice utilizza i calcoli precedenti (tre di essi) nel nuovo calcolo per campione. Ciò significa che i primi 2 campioni di dati non sono stati filtrati correttamente? (non che importerebbe perché sono solo 2 campioni, ma solo chiedersi)
- Cercando di imparare tutto, ho trovato un paio di formule per il filtro Butterworth (2nd Pole). Come si riflettono quelle formule in questo codice? Nessuna delle formule che ho trovato ha questi calcoli che puoi vedere nella funzione 'getLPCoefficientsButterworth2Pole ()'.