arm_fir_decimate_q15関数
デシメーション(ダウンサンプリング)を行う

関数のソース(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必要。

戻る

Top Page