関数のソース(CMSIS 2.0以上をダウンロード・インストールする必要あり)
CMSIS_2_00\CMSIS\DSP_Lib\Source\Cortex-M4-M3\FilteringFunctions\arm_fir_fast_q15.c
サンプルソース(DFFSKN40基板付属CD-ROMに収録)
IARprojects\src\projects\arm_fir_fast
引数と戻り値
説明(イメージ)
使用例(サンプルソースの一部)
|
#define numTaps 90
q15_t firCoeff [] = { -11, -4, -3, 0, 3, 10, 19, 31,
44, 59, 74, 88, 99, 107, 108, 101,
85, 60, 24, -21, -75, -136, -199, -260,
-316, -360, -386, -391, -367, -312, -222, -95,
66, 261, 486, 734, 998, 1269, 1537, 1792,
2023, 2221, 2378, 2486, 2541, 2541, 2486, 2378,
2221, 2023, 1792, 1537, 1269, 998, 734, 486,
261, 66, -95, -222, -312, -367, -391, -386,
-360, -316, -260, -199, -136, -75, -21, 24,
60, 85, 101, 108, 107, 99, 88, 74,
59, 44, 31, 19, 10, 3, 0, -3,
-4, -11 };
q15_t firStateL[N];
q15_t firStateR[N];
arm_fir_instance_q15 firInstanceL;
arm_fir_instance_q15 firInstanceR;
: 中略
arm_fir_init_q15(&firInstanceL, numTaps, firCoeff, firStateL, 1);
arm_fir_init_q15(&firInstanceR, numTaps, firCoeff, firStateR, 1);
: 中略
ADCからのデータをinL, inRに入れる
arm_fir_fast_q15(&firInstanceL, &inL, &outL, 1);
arm_fir_fast_q15(&firInstanceR, &inR, &outR, 1);
outL, outRのデータをDACに渡す
|
ステレオ2chの場合はL/R別インスタンスで宣言し別々に実行する。
実験
上記のサンプルソースをDFFSKN40基板(デジタルフィルター社)にて実験した。Cortex-M4マイコンはPK40X256VMD100(Kinetis,
フリースケール社)搭載。
@ステレオ2chそれぞれOPアンプで振幅調整・高周波カット。
Aマイコン内蔵のADCで16ビットデジタル化。
Barm_fir_fast_q15関数でデジタルフィルタリング。
Cマイコン内蔵のDACでアナログ化。
DOPアンプで振幅調整、その後PCで波形観測。
入力が白色雑音の場合の出力をPCで観測(SoftOscillo2 Standard Edition)。LPFで3kHz以上がカットされている。
まめ知識
arm_fir_q15関数のアキュムレータが64ビットなのに対し、この関数は32ビットしかない分高速化される。ただし、係数のボリュームがあまり大きいと以下のようにラップアラウンドする(サイン波の上の部分が下から出てくる)ので注意。
開発環境はIAR Workbench 6.0 Kickstart、コンパイラの最適化は「高」でFIRの最大タップ数は92。その他のオプションでは以下の通り。(チャネル数2、サンプリング周波数48kHz)。
最適化 |
なし |
低 |
中 |
高 |
最大タップ数 |
40 |
72 |
86 |
92 |
arm_fir_q15関数と比較すると、最適化低レベルで効果がある。「高」だとそれほど効果はないと思われる。
これらのタップ数を超えると出力が出なくなる。チャネル数が1ならば倍のタップ数、サンプリング周波数が半分でも倍のタップ数まで可能になる。
|