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

説明(イメージ)

使用例(サンプルソースの一部)
|
#define numTaps 28
#define blockSize 50
#define L 2
q15_t inData[blockSize];
q15_t outData[blockSize*L];
q15_t firState[numTaps/L+blockSize-1];
arm_fir_interpolate_instance_q15 firInstance;
// FIRフィルタの係数
q15_t firCoeff[] = {
72, -1, -239, -136, 388, 272, -699, -576,
1171, 1143, -2080, -2554, 5039, 14482, 14482, 5039,
-2554, -2080, 1143, 1171, -576, -699, 272, 388,
-136, -239, -1, 72 }
: 中略
arm_fir_interpolate_init_q15(&firInstance, L, numTaps, firCoeff, firState,
blockSize);
: 中略
void initWave() {
// 入力データの初期化
inData [ 0 ] = 28415 ;
inData [ 1 ] = 26196 ;
inData [ 2 ] = 12790 ;
inData [ 3 ] = 12402 ;
inData [ 4 ] = 25732 ;
: 中略
inData [ 47 ] = 29066 ;
inData [ 48 ] = 25082 ;
inData [ 49 ] = 11923 ;
}
: 中略
arm_fir_interpolate_q15(&firInstance, inData, outData, blockSize);
|
入力は50個のデータ列。あらかじめプログラムに埋め込んである。
2倍オーバサンプリングの結果、出力は100個のデータ列になる。
実験
上記のサンプルソースをDFFSKN40基板(デジタルフィルター社)にて実験した。Cortex-M4マイコンはPK40X256VMD100(Kinetis,
フリースケール社)搭載。
@50個の入力データ列を2倍オーバサンプリングして100個の出力データ列を得る。
A入出力データをUSB経由でパソコンに送る。
BWindowsアプリケーションで波形観測。

KnInterp.exe(DFFSKN40基板付属CD-ROMに収録)を実行してbefore Over Samplingボタンを押すと入力データ列(inData)が描画される。

after Over Samplingボタンを押すと出力データ列(outData)が描画される。滑らかに2倍補間されている。

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