ArmマイコンにTRY7 FIRフィルタ、ソースコードの作成。


写真はNECLEO STM32F446RE評価ボードで、プログラム作成にTRYの様子。

2024.06.14

はじめに
 「ARMマイコンにTRY7」では、FIRフィルターを作成してみます。
 今まで、STM32F446REのADやI2Cなど、各機能毎にソースコードを作成動作確認してきましたが、今回は前回検討したFIRフィルターを 実際のソースコードにまとめてみます。

作成するプログラムの概要
 入力信号として、配列(入力Buff)に入れた8kHzのsin波を、FIRローパスフィルタを通して、出力(出力Buff)に書き込んで、その結果をExcelで計算した結果と比較 しながら動作確認します。

フィルター設計仕様

 フィルター設計ツールは、CQ出版からD/Lしたツールを使ってFIRフィルターを設計します。
 仕様として、次数18、タップ数19、サンプリング周波数40kHz、通過帯域0から16kHz、重みづけ5、阻止帯域19〜20kHz、重みづけ10として設計すると左図(クリックで拡大) のフィルター係数と特性が表示されます。
 通過帯域内にリプルが有りますが、実用上問題なさそうです。また阻止域の減衰度が30db程度なので、CICフィルターと合わせてもやや不足気味ですが、実際の 動作確認で検証していきます。

プロジェクトの作成、コード生成
 プロジェクト名は適当にSDR4_FIRとして、sysclockは168MHz、デバック用にPA5をLED ON/OFF出力に設定。
その他の機能は今回使わないので、特に設定不要
 次にメニュー欄のコード生成ボタン(歯車マーク)をクリックで、ひな型コードが表示されます。

  ソースコードの記述1

 /* User code begin PV */ 〜 /* User code End PV */ の間に、左図ソースコード(クリックで拡大)を挿入。
 変数はフロート型とし、数値はfをつけています。
 index_ はin_buf[]の書き込み位置を示す変数とします。

 

ソースコードの記述2

 /* User code Begin2 */ 〜 /* User code End2 */ の間に、左図ソースコード(クリックで拡大)を挿入。
 ptrMとptrPは計算回数を減らす為、1つの係数に対して2つの入力Buf要素を計算するために利用します。具体的な方法は 前回検討したFIRフィルターを参照ください。
 配列は{256}にしているので、inbuf[256]はinbuf[0]にもどり、リングバッファの様な動作になります。
 109行目では、index_<125では、動作時間の確認の為125にしていますが、256にするとリング状になりこのループをぐるぐる続けます。
111行目でsin関数を呼び出しているので、プログラム冒頭で #include math.h の追加が必要です。
 プログラムの流れを、具体的に見ていきます、
-1.スタート時はindex、ptrは[0]、ptrMは[0-18]で、この場合[238]の配列を示します。
-2.次に、入力信号を作成してin_buf[0]に入れます。ここでは擬似的に入力信号を作成していますが、実際のSDR動作では、CICフィルター出力 に相当します。
-3.次に、フィルター係数hm[0]*(in_buf[0] + in_buf[18個前の入力])を計算、以下順次hm[1]*(in_buf[1] + in_buf[17個前の入力])を計算し
-4.最後にhm[9]*(in_buf[9])を計算し、fir_sum合計をout_buf[0]としてFIR出力とし、引き続きサンプリング時間を更新してループに戻ります。
 index_ が小さいと[18個前の入力]は暗黙的に0とみなします。途中のDelayはデバック用に挿入しています。

 

デバックしてみる

 左図はデバッグ計算確認用に作成したExcelの一部切り取り画面(クリックで拡大)。Excelの作成方法については前回検討したFIRフィルター の次数変更したものですが、作成しておくと転記ミスによる計算ミスなどの発見が容易です。

 

 左図はデバッグ計算確認用に作成したExcelの後半部分の切り取り画面(クリックで拡大)。FIR OUTがout_buf[]になります。
 プログラムをデバックモードで走らせ、変数確認でout_buf[]の値とExcelのFIR OUTを比較確認します。

結果確認

 左図はFIRフィルターの入力信号を8kHz 1Vppと18kHz 0.3Vppの合成信号をフィルターを通した波形グラフです。18kHz成分がカットされているのが 判ります。

今後の進め方
 FIR出力データをD/Aすれば、40kHzサンプリングのアナログ出力になる筈ですが、SDR#4ではFIR出力をシリアルデータとしてメインPCへ出力することを 計画しています、はたして処理時間が間に合うのか、まだまだ検討が続きます。

   Top Menu