想定外のゲインが生じる理由
- インテル® FIR II IP コアや、ユーザー設計の固定小数点数 FIR フィルタにおいて、入出力の振幅を比較するなどゲインを評価すると、期待・想定と異なる値になる場合があります。
- 原因として下記の3点(およびその複合)が可能性として高いものになります。
- 固定小数点数の小数点位置についての誤解
- ツールのゲイン計算・表示機能によるもの
- フィルタ特性に対する誤解
- 固定小数点数の小数点位置についての誤解
- 単純なケアレスミスなどで入力・出力のどちらかで小数点位置を間違うと、ゲインの違いとして 2^N の掛け算をしたような値が生じます。(N は2進数の桁数としてのずれ、プラスマイナス両方がありえます)
- これは小数点位置の修正(シフト演算と等価)で解消することができます。
- ただしユーザー設計などで計算途中の一部の値で小数点位置の間違いがある場合は 2^N の掛け算にはならない狂いになってしまいます。間違った箇所を厳密に修正する必要があります
- ツールのゲイン計算・表示機能によるもの
- インテル® FIR II IP コアでは、Cofficient タブで周波数応答(振幅)特性がグラフ表示されますが、このとき通過帯域はほぼ "0dB" となるため、ゲイン1 が達成されている様に見えます。しかし、これはあくまで相対ゲインであり、通過域のゲイン1 は必ずしも達成されていません。
-
- 特に、設定が "Coefficient Scaling = Auto" の場合、計算精度を高くするためのオートスケーリングが行われており、計算に使われる係数は IP 生成時に与えた値から、2^N 倍以外の乗数でスケーリングされている可能性があります。その場合小数点位置修正でも解消できません。
- 上記オートスケーリング機能は "Coefficient Scaling = off" で解除することができます。
- 解除した場合、IP 生成時の係数がそのまま使用されるため、表現方法や値によっては、うまく認識されなくなる場合もありますので、そこから再確認、再調整が必要です。
- ユーザーが係数を準備するために使用したツールでも、上記の様に相対ゲイン表示を誤解したり、ゲインについて十分注意が払われていない結果、想定と異なるゲインになっている可能性があります。
- フィルタ特性に対する誤解
- 係数の設計方式や精度(bit数)、 Tap 数にもよりますが、通過帯域のゲインがフラットに近い場合でも若干のリップル分(誤差)を持つ場合があります。また抑制帯域でのゲインは通常目標のゲイン以下で非常に大きなリップルを持ちます。
-
- 設計方式によって、カットオフ周波数などの特性パラメータの扱い、定義(ゲイン値)が異なる場合があります。
ゲイン調整が必要なアプリケーションについて
- FIR フィルタが良くつかわれる無線・通信分野では、波形に伝送情報を持たせて絶対振幅はあまり意味を持たない場合が多いため、インテル® FIR II IP コアのデフォルト設定ではゲインを変更しても精度を重視するオートスケーリングが働くようになっています。
- 測定分野等、振幅や電力を重視する応用では情報を正確に伝える為、オートスケーリングは不要な機能と考えられますので off に設定してください。
- その場合、与えた係数が想定のゲインを実現できていれば問題ありませんが、相対ゲインは問題なくても絶対ゲインが上記の問題により想定と異なってしまっている場合があり、調整が必要になります。
ゲインの計算式
- ゲイン調整の根拠となる計算式をここに記載します。詳細はディジタル信号処理関係の教科書をご確認ください
- FIR フィルタの伝達関数:H(z) = Σ(k=0 to N-1)h(kT)z^(-k)
- ただし、T はサンプリング周期、h(kT)=h(k) はFIR タップ係数(実数)、"^"はべき乗を表すとします。
- FIR フィルタの DC ゲイン:|H(0)| = Σ(k=0 to N-1)h(k) <係数の総和>
- 単位ステップ入力の十分な時間経過後の出力つまり係数の総和が該当します
- LPF の場合、この値を調整対象とすると計算が簡単な面があります。(通過帯域のリップルに注意)
- FIR フィルタのゲイン(振幅周波数特性):|H(F)| = √( {HRe(F)}^2 + {HIm(F)}^2 )
- ただし、F は入力の周波数 f のサンプリグ周波数 Fs に対する比率 (正規化周波数 )で F = f/Fs
- HRe(F) = Σ(k=0 to N-1)h(k)cos(2πkF)
- HIm(F) = -Σ(k=0 to N-1)h(k)sin(2πkF)
- 式変形にこちらを適用: z=e^(jωT), ω=2πf, e^(jθ) = cosθ + j*sinθ (j は虚数単位)
ゲイン調整のための実際の計算のヒント
- ゲインを実際に上記式で計算してみて、目標値(Htargert、例: 1)と異なる場合、一般的には比率αを乗じることで調整とします。比率α = Htargert/|H(F)| (ユーザーによるスケーリング)
- FIR フィルタ部分はそのまま、αを出力に乗算し全体のゲインを Htargert にする方法も1つの選択です
- FIR フィルタを調整する場合はαを全係数に一律に乗じて h'(k) = α*h(k) を新たな係数セットとします
- DC ゲインを調整する場合係数の総和ですので比較的簡単な計算ですが、それでも総和を求め比率を全係数に乗算して更新する作業は手計算では Tap 数分の面倒な作業になりますので、Excel 等の表計算ツールを利用することがお勧めです。Tap 数が増えても SUM( ) を利用して比較的簡単に総和が求められますし、係数の一律更新も乗算式をコピーして対応できます。
- カットオフ周波数付近や、BPF や HPF の通過域のゲインを調整する場合、|H(F)| の計算が必要になりますが、やはり Excel 等の表計算ツールのご利用がお勧めになります。関数としてはさらに PI( ), SIN( ), COS( ), SUMPRODUCT( ), SQRT( ) を利用することになります。
- Excel ではグラフ表示機能がありますので、調整したい周波数付近のゲイン変化をプロットしての確認が可能です。
- Excel 等を利用して目標のゲインの精度をかなり高めることが可能(例: Htarget = 1.0000...)ですが、係数のビット数も有限のためいくらαを一律に乗じても取り切れない誤差が残る場合があり、その場合はそこで妥協するか、全係数にαを乗じるという原則からはずれますが特性の変化を許容して一部係数のみ LSB 程度の増減を行うという微調整を行う判断となります。