arm_lms_q15関数
LMS(Least Mean Square)アルゴリズムを実行する

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

サンプルソース(DFFSKN40基板付属CD-ROMに収録) 2011/09/04追加
IARprojects\src\projects\arm_lms

引数と戻り値


説明(イメージ)


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

#define numTaps 100

q15_t lmsCoeff[numTaps];
q15_t lmsState[numTaps];
arm_lms_instance_q15 lmsInstance;
q15_t Delay[16];
int SftBits = 0;

 : 中略

arm_lms_init_q15(&lmsInstance, numTaps, lmsCoeff, lmsState, 2048, 1, SftBits);

 : 中略

ADCからのデータをinRに入れる
Delay[1] = Delay[0];
Delay[0] = inR;
src = Delay[1];
ref = Delay[0];
arm_lms_q15(&lmsInstance, &src, &ref, &outR, &errorno, 1);
outRのデータをDACに渡す

RchのみLMSアルゴリズムをかける。Lchはスルーで出す。

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

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


入力が1kHzサイン波+白色雑音の場合。Lch(赤)は入力をそのままスルー。Rch(青)はLMSアルゴリズムにより白色雑音が取り除かれている。


入力が3kHzサイン波+白色雑音の場合。周波数が上がったがサイン波は残り、白色雑音が取り除かれている。


入力が300Hzサイン波+白色雑音の場合。周波数が下がってもサイン波が残り、白色雑音が取り除かれている。


入力が1kHz矩形波+白色雑音の場合。矩形波が残り、白色雑音が減衰している。


上図の際のスペクトル。Lch(赤)とRch(青)を比較すると、スペクトルのピークはそのまま、裾野はぐっと下がっている。それゆえ「線スペクトル強調器」と呼ばれる。


まめ知識
入力遅延量は1サンプルとしたが、これは入力信号の品質によるので試行錯誤的に決めると良い。
mu = 2048としたが、これも試行錯誤的に決める。小さいと収束に時間がかかり、大きいと発散しやすい。
あまりにもノイズレベルが大きいと機能しない。
通常のFIRフィルタより演算量が多いので処理はRchのみ、またサンプリング周期も長く(1/24kHz)した。
IAR Embedded Workbenchの最適化レベルは「低」とした。それより上のレベルではうまくコンパイルされなかった。
戻る

Top Page