arm_biquad_cascade_df1_q15関数
IIR(Infinite Impulse Response)フィルタを実行する

関数のソース(CMSIS 2.0以上をダウンロード・インストールする必要あり)
CMSIS_2_00\CMSIS\DSP_Lib\Source\Cortex-M4-M3\FilteringFunctions\arm_biquad_cascade_df1_q15.c

サンプルソース(DFFSKN40基板付属CD-ROMに収録)
IARprojects\src\projects\arm_biquaqd_df1

引数と戻り値


説明(イメージ)




使用例(サンプルソースの一部)

#define biquadN 3

// The order of coefficients is
// {b10, 0, b11, b12, a11, a12, b20, 0, b21, b22, a21, a22, ...}
q15_t iirCoeff [] = {
261, 0, 523, 261, 29662, -14326,
236, 0, 472, 236, 26752, -11313,
223, 0, 446, 223, 25318, -9828 };

q15_t iirStateL[biquadN*4];
q15_t iirStateR[biquadN*4];
arm_biquad_casd_df1_inst_q15 iirInstanceL;
arm_biquad_casd_df1_inst_q15 iirInstanceR;

 : 中略

arm_biquad_cascade_df1_init_q15(&iirInstanceL, biquadN, iirCoeff, iirStateL, 1);
arm_biquad_cascade_df1_init_q15(&iirInstanceR, biquadN, iirCoeff, iirStateR, 1);

 : 中略

ADCからのデータをinL, inRに入れる
arm_biquad_cascade_df1_q15(&iirInstanceL, &inL, &outL, 1); arm_biquad_cascade_df1_q15(&iirInstanceR, &inR, &outR, 1);
outL, outRのデータをDACに渡す

ステレオ2chの場合はL/R別インスタンスで宣言し別々に実行する。
係数の並び方に注意。bm0とbm1の間にダミーのゼロが入る。

実験
上記のサンプルソースをDFFSKN40基板(デジタルフィルター社)にて実験した。Cortex-M4マイコンはPK40X256VMD100(Kinetis, フリースケール社)搭載。

@ステレオ2chそれぞれOPアンプで振幅調整・高周波カット。
Aマイコン内蔵のADCで16ビットデジタル化。
Barm_biquad_cascade_df1_q15関数でデジタルフィルタリング。
Cマイコン内蔵のDACでアナログ化。
DOPアンプで振幅調整、その後PCで波形観測。


入力が白色雑音の場合の出力をPCで観測(SoftOscillo2 Standard Edition)。LPFで2kHz以上がカットされている。


まめ知識
高次のIIRフィルタを構成する場合、通常は2次IIRフィルタ(Biquad)を縦続接続する。IIRフィルタの係数は実数で1.0を超えることがよくあるため、通常は係数をすべて1/2倍してから量子化する。出力も1/2になるので、最終的にpostShift(arm_biquad_cascade_df1_init_q15参照)で2倍にして相殺する。

戻る

Top Page