Je travaille sur un simple filtre passe-bas pour une mesure <100 Hz dans mon application. Mais jusqu'à présent, je lutte avec la théorie derrière tout cela. C'est cool que je l'ai fait fonctionner, mais je l'apprécierais vraiment si je savais comment / pourquoi cela fonctionne.
J'ai trouvé le code suivant:
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;
}
Pour calculer les coefficients. Ensuite, dans les échantillons audio, je les «passe-bas» de cette façon:
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];
Pour obtenir une conception passe-bas.
Je me pose quelques questions:
- Je reçois les échantillons audio dans un simple tableau flottant *. Quel est ce nombre flottant? La seule chose que je vois est un nombre, comment est-ce un morceau de son?
- Le code utilise des calculs antérieurs (trois d'entre eux) dans le nouveau calcul par échantillon. Est-ce à dire que les 2 premiers échantillons de données ne sont pas filtrés correctement? (ce n'est pas important car ce ne sont que 2 échantillons, mais je me demande simplement)
- En essayant de tout apprendre, j'ai trouvé quelques formules pour le filtre Butterworth (2e pôle). Comment ces formules sont-elles reflétées dans ce code? Aucune des formules que j'ai trouvées n'a ces calculs que vous pouvez voir dans la fonction 'getLPCoefficientsButterworth2Pole ()'.