He estado trabajando en un filtro de paso bajo simple para la medición de <100 Hz en mi aplicación. Pero hasta ahora, estoy luchando con la teoría detrás de todo. Es genial que lo haya hecho funcionar, pero realmente lo disfrutaría si supiera cómo / por qué está funcionando.
Encontré el siguiente código:
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;
}
Para calcular los coeficientes. Luego, en las muestras de audio, las 'paso bajo' de esta manera:
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];
Para obtener un diseño de paso bajo.
Me pregunto algunas cosas:
- Recibo las muestras de audio en una simple matriz flotante *. ¿Cuál es ese número flotante? Lo único que veo es un número, ¿cómo es ese sonido?
- El código está usando cálculos pasados (tres de ellos) en el nuevo cálculo por muestra. ¿Eso significa que las primeras 2 muestras de datos no se filtran correctamente? (No es que importe porque son solo 2 muestras, pero me pregunto)
- Intentando aprender todo, encontré un par de fórmulas para el filtro Butterworth (2º Polo). ¿Cómo se reflejan esas fórmulas en este código? Ninguna de las fórmulas que encontré tiene estos cálculos que puede ver en la función 'getLPCoefficientsButterworth2Pole ()'.