Eu tenho trabalhado em um filtro passa-baixo simples para medição <100 Hz em meu aplicativo. Mas até agora, estou lutando com a teoria por trás de tudo. É legal que eu tenha funcionado, mas eu realmente apreciaria se soubesse como / por que está funcionando.
Encontrei o seguinte 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 os coeficientes. Então, nas amostras de áudio, eu as transmito da seguinte maneira:
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 obter um design lowpass.
Estou pensando em algumas coisas:
- Eu recebo as amostras de áudio em uma matriz float * simples. Qual é esse número flutuante? A única coisa que vejo é um número, como isso é uma peça de som?
- O código está usando cálculos anteriores (três deles) no novo cálculo por amostra. Isso significa que as 2 primeiras amostras de dados não foram filtradas corretamente? (não que isso importe porque são apenas 2 amostras, mas apenas imaginando)
- Tentando aprender tudo, encontrei algumas fórmulas para o filtro Butterworth (2º pólo). Como essas fórmulas são refletidas neste código? Nenhuma das fórmulas que encontrei possui esses cálculos que você pode ver na função 'getLPCoefficientsButterworth2Pole ()'.