私のアプリケーションでは、100 Hz未満の測定用のシンプルなローパスフィルターに取り組んでいます。しかし、これまでのところ、私はその背後にある理論に苦労しています。うまく動いたのはかっこいいですが、どのように/なぜ動いているのか知っていれば本当に楽しめます
私は次のコードを見つけました:
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;
}
係数を計算します。次に、オーディオサンプルで、次のように「ローパス」します。
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];
ローパス設計を取得します。
私はいくつかのことを考えています:
- オーディオサンプルを単純なfloat *配列で受け取ります。その浮動小数点数は何ですか?私が目にするのは数字だけですが、その音はどうですか?
- コードは、サンプルごとの新しい計算で過去の計算(そのうちの3つ)を使用しています。それは、最初の2つのデータサンプルが正しくフィルタリングされないことを意味しますか?(2つのサンプルしかないので問題になるわけではありませんが、疑問に思っています)
- すべてを学ぼうとしたところ、バターワース(第2極)フィルターの式がいくつか見つかりました。これらの数式はこのコードにどのように反映されますか?私が見つけた式には、「getLPCoefficientsButterworth2Pole()」関数で確認できるこれらの計算はありません。