関数のソース(CMSIS 2.0以上をダウンロード・インストールする必要あり)
CMSIS_2_00\CMSIS\DSP_Lib\Source\Cortex-M4-M3\FilteringFunctions\arm_fir_decimate_q15.c
サンプルソース(DFFSKN40基板付属CD-ROMに収録) 2011/09/04追加
IARprojects\src\projects\arm_decim
引数と戻り値

説明(イメージ)

使用例(サンプルソースの一部)
|
#define numTaps 56
#define blockSize 100
#define M 2
q15_t inData[blockSize];
q15_t outData[blockSize/M];
q15_t firState[numTaps+blockSize-1];
arm_fir_interpolate_instance_q15 firInstance;
// FIRフィルタの係数
q15_t firCoeff[] = {
-13, -80, -66, 35, 98, -9, -145, -50,
181, 147, -185, -277, 133, 426, -3, -567,
-226, 663, 573, -664, -1059, 492, 1743, 7,
-2852, -1414, 5986, 13408, 13408, 5986, -1414, -2852,
7, 1743, 492, -1059, -664, 573, 663, -226,
-567, -3, 426, 133, -277, -185, 147, 181,
-50, -145, -9, 98, 35, -66, -80, -13 };
: 中略 arm_fir_decimate_init_q15(&firInstance, numTaps, M, firCoeff, firState, blockSize);
: 中略 void initWave() {
// 入力データの初期化
inData [ 0 ] = 27961 ;
inData [ 1 ] = 20017 ;
inData [ 2 ] = 27640 ;
inData [ 3 ] = 13183 ;
inData [ 4 ] = 14752 ;
: 中略
inData [ 97 ] = 6272 ;
inData [ 98 ] = 14917 ;
inData [ 99 ] = 14951 ;
}
: 中略
arm_fir_decimate_q15(&firInstance, inData, outData, blockSize);
|
入力は100個のデータ列。あらかじめプログラムに埋め込んである。
1/2ダウンサンプリングの結果、出力は50個のデータ列になる。
実験
上記のサンプルソースをDFFSKN40基板(デジタルフィルター社)にて実験した。Cortex-M4マイコンはPK40X256VMD100(Kinetis,
フリースケール社)搭載。
@100個の入力データ列を1/2ダウンサンプリングして50個の出力データを得る。
A入出力データをUSB経由でパソコンに送る。
BWindowsアプリケーションで波形観測。

KnDecim.exe(DFFSKN40基板付属CD-ROMに収録)を実行してbefore Down Samplingボタンを押すと入力データ列(inData)が描画される。低い周波数と高い周波数が混在している。

after Down Samplingボタンを押すと出力データ列(outData)が描画される。FIRフィルタで高い周波数が除去された後に間引かれている。

「単純間引き」ボタンを押すと、arm_fir_decimate_q15無しで単純に間引きを行う。その場合、高い周波数成分が低域に引っ越してきて以下のように「うねり」を持った波形となる(正しいダウンサンプリングがされていない)。

まめ知識
FIRフィルタでフィルタリングしているのでその分遅延する。56タップなので入力の28サンプル分遅延、すなわち出力の最初の14サンプルがほぼゼロになる。
1/2ダウンサンプリングの場合、blockSizeは2の倍数にする必要あり。
blockSizeとは、一度に処理する入力データの数であることに注意。
遅延器の長さはnumTaps+blockSize-1必要。
|