SDRトランシーバー4号機(SDR#4)の製作「FIRフィルタの検討」


写真はSDR#4で使用予定のSTM32マイコンボードでFIRフィルターの検討

2024.5.08

はじめに
 新たな製作プロジェクト「お気に入りのSDRトランシーバー4号機の製作」、今回はCICフィルターの後に配置するFIRフィルターについて検討します。
 FIRフィルターの理論的な解説は他のHPで沢山紹介されていますので、このページでは実際にSDRに組み込む場合の特性や、考え方についてまとめてみます。
まずはエクセルで動作や特性確認からスタートです。

FIRフィルター目標仕様
 今回SDR#4に組み込むFIRフィルターは、CICフィルター特性を補完し、エリアシングの除去を目的とします。
帯域外の減衰は、CICと合わせて60db以上確保したいので、FIR単体では30db以上を目標とします。叉通過帯域は、サンプリング周波数を40kとしたので 20k以上はカットします。今回は通過帯域をDCから16kHzとしました。
 フィルター次数とタップ数は、多いほど帯域外の減衰は大きく出来ますが計算時間もかかるので、必要最小限にしておき18次、タップ数19としました。
 フィルターのタップ数を奇数にとっておくと参考にしている「ARMマイコンでつくるダイレクトサンプリングSDR」(CQ出版)のソースコードが利用できます。

フィルター設計ツール
 FIRフィルターの設計法には何種類かあり、設計ツールはWeb上でも見つけられます。代表的なHPとして石川高専フィルターデザイン や「ARMマイコンでつくるダイレクトサンプリングSDR」の記事で紹介されているCQ出版D/L等からD/L出来ます。

 今回は、CQ出版からD/Lしたツールを使ってFIRフィルターを設計してみます。
 窓関数の設計法の係数の求め方は、他HPでも紹介されていますが、後者の設計法については、理解できていませんが、帯域特性や帯域外特性等の重みづけを変えることにより、 特性を微調整できる点が特徴でしょうか。  詳しくを「Interface 2023.6月 CQ出版」で紹介されています。 

設計してみる

 まずは、練習とFIR組み込み確認のExcel作成を兼ねて、少ない次数で設計してみます、高次数で設計すると後で確認するExcel表が大きくなり大変です。
仕様として、次数6 タップ数7、サンプリング周波数40kHz、通過帯域0から15kHz、重みづけ1、阻止帯域19〜20kHz、重みづけ3として設計すると左図(クリックで拡大) のフィルター係数と特性が表示されます。
 通過帯域内でリプルが出ていますが重みづけを変えることで少なく出来ます。

Excel表の作成

 FIRフィルター特性は左図のようなExcelで簡単に確認でき、プログラム組み込みの際やデバッグ時の計算結果確認にも有効です。(図はクリックで拡大)
 表では、入力信号をサンプリング間隔でADした値を、6次のFIRフィルターに通した結果をシミュレートしています。
 C2セルに入力信号1の周波数 3000、C3セルに振幅 1、C4セルに入力信号2の周波数 18000、C5セルに振幅 0.2、G1セルにサンプリング周波数 40000、 G2セルにサンプリング間隔 0.000025(25us)、I2セルからO2セルに係数を入力
 A列に番号0〜適当に20まで、B列にサンプリング間隔で0から500usまで、C8セルに =$C$3*SIN(2*PI()*$C$2*B8)、D8セルに$C$5*SIN(2*PI()*$C$4*B8)、 E8セルに =C8+D8、F8セルに =$I$2*E8、G9セルに =$J$2*E8、H10 =$K$2*E8、I11 =$L$2*E8、J12 =$M$2*E8、K13 =$N$2*E8、L$14 =$O$2*E8、 M8セルに =SUM(F8:L8)、を入力し各列を下へオートフィルします。
 係数をみると、係数0と係数6は同じて、同様に係数1と係数5、係数2と係数4が同じになっています。したがってh[0] * X[n] + h[6] * X[n-6]は、h[0] * (X[n] + X[n-6]) と書き換えることができ、プログラムを組む際の計算回数を減らせます。

特性の確認

 左図は(クリックで拡大)、横軸に時間、縦軸に振幅を表示
 C列入力信号1とD列入力信号2の合成信号E列をグラフにしたもので、入力信号が歪んでいるのが確認できます。

 

 

 左図は(クリックで拡大)、横軸に時間、縦軸に振幅を表示
 M列のFIR出力をグラフにしたもので、入力信号2の成分が減衰され、入力信号1波形が表示されています。
 波形の最初の部分は、波形データを暗黙的に0としているため、正確な出力にはなりません。実動作ではこの部分が遅延時間となります。

 

 

 左図は(クリックで拡大)、横軸に周波数、縦軸にdbを表示
 入力信号2を0とし、入力信号1の周波数を変化させ、出力振幅を読み取りグラフにしたもので、先に設計ツールで得られた特性が再現できています。

 

  今後の予定
 FIRフィルターの組み方について判ったところで、次回は実際にプログラムを作成して実行時間などを確認していきます。

FIRフィルターのソースコード

   Top Menu