Ich habe in meiner Anwendung an einem einfachen Tiefpassfilter für die Messung <100 Hz gearbeitet. Aber bis jetzt kämpfe ich mit der Theorie dahinter. Es ist cool, dass ich es zum Laufen gebracht habe, aber ich würde es wirklich genießen, wenn ich wüsste, wie / warum es funktioniert.
Ich habe folgenden Code gefunden:
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;
}
Berechnung der Koeffizienten. Dann 'passiere' ich sie in den Audio-Samples folgendermaßen:
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];
Um ein Tiefpass-Design zu erhalten.
Ich frage mich ein paar Dinge:
- Ich empfange die Audio-Samples in einem einfachen float * -Array. Was ist diese Float-Nummer? Das einzige was ich sehe ist eine Zahl, wie ist das ein Stück Klang?
- Der Code verwendet frühere Berechnungen (drei davon) in der neuen Berechnung pro Stichprobe. Bedeutet das, dass die ersten beiden Datenproben nicht richtig gefiltert werden? (nicht, dass es wichtig wäre, weil es nur 2 Proben sind, aber ich frage mich nur)
- Beim Versuch, alles zu lernen, fand ich einige Formeln für den Butterworth-Filter (2. Pol). Wie spiegeln sich diese Formeln in diesem Code wider? Keine der gefundenen Formeln enthält diese Berechnungen, die Sie in der Funktion 'getLPCoefficientsButterworth2Pole ()' sehen können.