ベースレベルがかなりバタつくので、平均化処理を入れてみた
やっていることは、過去の平均値の重み付け0.9、最新の計算値の重み付け0.1で加算していくだけ、ベースレベルが暴れなくなるので視覚上の効果は結構大きい改善、スペアナ的になるという意味でね
/* 5. 平均化と実効値計算(振幅スペクトル : db) */
for (uint32_t i = 0; i < FFT_LEN / 2; i++) {
float32_t real = fft_out[2 * i];
float32_t imag = fft_out[2 * i + 1];
cur[i] = (real * real + imag * imag) * HANN_GAIN_CORRECTION + 1e-12f;
// averaging
if (first) {
fft_ave[i] = cur[i];
} else {
fft_ave[i] = fft_ave[i] * 0.9f + cur[i] * 0.1f;
}
fft_rms[i] = (int16_t) (10.0f * log10f(fft_ave[i]));
}
first = false; // to set first flag to false
<写真>
<条件>
以前の記事と変わらずですが、
・入力は5KHzのduty50%のPWM
・ADCサンプリング周波数 200KHzで一次IIRフィルタ(cut off 20KHz)処理後に1/5 decimation
・Hann windows処理
・FFT実行後に平均化処理後に対数スケール変換
前の記事の補足でも書いたけど、一次IIRフィルタにすることで15KHzの第三高調波はほぼ理論通りのおよそ10db(正確には9db)に収まってる、ただし20KHzに近づくとノイズレベルが落ちているのはフィルターの影響です
admin

