Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

最適化された固定小数点 FIR フィルター

この例では、固定小数点 FIR フィルターを最適化する方法を示します。最適化には、阻止帯域の減衰や、特定仕様を満たすために必要なビット数など、フィルター応答の特性が含まれます。この機能は、特定の語長の設定可能な係数をいくつかもつハードウェアの作業を行うユーザーや、研究対象に大規模な設計スペースがある ASIC や FPGA などのケースで特に有益です。ハードウェア設計者は、通常係数とビットのトレードオフを検討して、各種の ASIC または FPGA を最適化することができます。

この例では、最適な固定小数点 FIR フィルター係数を得るための、ノイズ シェーピングに基づく各種方法について説明します。以下の操作について説明します。

  • 係数の語長の最小化

  • 係数の語長の制約

  • 阻止帯域の減衰の最大化

理論的背景

ノイズ シェーピング アルゴリズムは、本質的に固定小数点 FIR フィルターの他の帯域の量子化ノイズを増加させる一方で、臨界周波数帯域 (通常阻止帯域) から量子化ノイズを排除します。以下のブロック線図には、ノイズ シェーピングのプロセスを示しています。本質的にフィルター係数は、デジタル フィルターに似ているものの、中央に量子化器のあるシステムを通過します。システムは、各係数の量子化誤差を計算してから、b1、b2、および b3 の係数により定義されるシンプルな IIR ハイパス フィルターに誤差を通過させます。'丸め' ブロックは入力を量子化された近似値に丸めます。この後、量子化された値が元の浮動小数点値から減算されます。各遅延ブロックの初期状態値は、-LSB と +LSB の間のランダム ノイズに設定することができます。

システムの出力は、量子化とノイズ シェーピングが行われた新しいフィルター係数です。遅延ブロックに異なるランダムな初期状態を使用してこの手順を何度か繰り返すことにより、異なるフィルターを作成できます。

係数の語長の最小化

最初に、単一ステージまたは多段の設計仕様を満たす最小語長の固定小数点 FIR フィルターを判定します。ここでは、正規化された遷移幅 .08、阻止帯域の減衰 59dB のハーフバンド フィルターの例を使用します。カイザー ウィンドウ設計を使用すると、仕様を満たす 91 の倍精度浮動小数点係数が得られます。

TW = .08;   % Transition Width
Astop = 59; % Stopband Attenuation (dB)
f  = fdesign.halfband('TW,Ast', TW, Astop);
Hd = design(f, 'kaiserwin');

ベースラインを確立するために、'Arithmetic' プロパティを 'fixed' に設定し、仕様を満たす最小値が見つかるまで係数の語長を反復することにより、フィルターを量子化します。あるいは、minimizecoeffwl() を使用してこのプロセスを高速化できます。ベースラインの固定小数点フィルターには、91 の 17 ビット係数が含まれます。

Hqbase = minimizecoeffwl(Hd,...
    MatchRefFilter=true, NoiseShaping=false, ...
    Astoptol=0);       % 91 17-bit coefficients, Astop = 59.1 dB

17 ビット語長は、多くのハードウェア ターゲットに不向きです。特定の状況では、16 ビットのみの係数を使用することで妥協することができます。しかし、フィルターの最大の阻止帯域の減衰が望まれる 59dB ではなく、わずか 58.8dB であることから、元の仕様を厳格に満たしていないことに注意してください。

Hq1 = copy(Hqbase);
Hq1.CoeffWordLength = 16; % 91 16-bit coefficients, Astop = 58.8 dB
m1 = measure(Hq1) 
m1 = 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.46                      
3-dB Point       : 0.49074                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.54                      
Passband Ripple  : 0.017157 dB               
Stopband Atten.  : 58.8741 dB                
Transition Width : 0.08                      
 

あるいは、阻止帯域の誤差を許容誤差に制御するための許容値を設定できます。たとえば、阻止帯域の許容誤差を .15dB とすると、3 ビット短縮して、91 の 14 ビット係数をもつフィルターを得ることができます。

Hq2 = minimizecoeffwl(Hd,...
                      MatchRefFilter=true, NoiseShaping=false, ...
                      Astoptol=.15);      % 91 14-bit coefficients, Astop = 58.8 dB

係数の語長を短縮すると、固定小数点設計が仕様を満たさなくなります。許容誤差はアプリケーションによって異なりますが、この方法は多くの状況で制限があります。'MatchRefFilter' の制約を緩和することで、別の自由度を使用することができます。''MatchRefFilter' プロパティを false に設定することで、フィルターの次数 (最小次数設計の場合) またはフィルターの遷移幅 (固定次数設計の場合) Hd を一致させようとしていません。中間浮動小数点フィルターの再設計を許可することにより、93 の 13 ビット係数の仕様を満たす固定小数点フィルターが得られます。参照固定小数点設計に比べ、4 ビット短縮しましたが、係数が 2 つ (1 つは非ゼロ) 追加されています。

Hq3 = minimizecoeffwl(Hd,...
                      MatchRefFilter=false, NoiseShaping=false); % 93 13-bit coefficients

これよりも優れた解決策は、ノイズ シェーピングを使用して量子化フィルターの阻止帯域の減衰を最大化することです。ノイズ シェーピング手順は確率的です。'NTrials' オプションを試したり、RAND を初期化して以下の結果を再現することもできます。'MatchRefFilter' は既定で false に設定され、'NoiseShaping' は true であるため、両者を省略できます。最適化された固定小数点フィルターは、91 の 13 ビット係数の仕様を満たします。これにより、同じ数の係数をもつ参照固定小数点設計よりも、4 ビット短縮したことになります。

Hq4 = minimizecoeffwl(Hd, Ntrials=10);  % 91 13-bit coefficients
hfvt = fvtool(Hqbase,Hq4, ShowReference='off',Color='white');
legend(hfvt, '17-bit Reference Filter', '13-bit Noise-Shaped Filter');

{"String":"Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 3 objects of type line. These objects represent 17-bit Reference Filter, 13-bit Noise-Shaped Filter.","Tex":"Magnitude Response (dB)","LaTex":[]}

ノイズ シェーピングにより阻止帯域からノイズを排除するトレードオフとして、ノイズ シェーピングされたフィルターの通過帯域リップルが多少増加しますが、これは通常問題になりません。また、ノイズ シェーピングを適用した後の通過帯域リップルと周波数の間は単純な関係にないことに注意してください。

zoom(hfvt,[0 0.5060 -0.0109 0.0109])

{"String":"Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 3 objects of type line. These objects represent 17-bit Reference Filter, 13-bit Noise-Shaped Filter.","Tex":"Magnitude Response (dB)","LaTex":[]}

係数の語長の制約

前のデモでは、minimizecoeffwl() メソッドの 'MatchRefFilter' パラメーターを false に設定することにより、多くの係数 (固定フィルター次数の設計では大きな遷移幅) を短い係数の語長とトレードオフする方法を確認しました。ここでは、この制約を緩和することによって、このトレードオフをさらに制御する方法を示します。

fm = fdesign.lowpass('Fp,Fst,Ap,Ast',0.1,0.12,1,70);
Hm  = design(fm);

最初に浮動小数点設計の次数を一致させ、語長 20 ビットの係数 237 個という仕様を満たすノイズ シェーピングされた固定小数点フィルターを取得します。

Hmref = minimizecoeffwl(Hm, MatchRefFilter=true);
disp(Hmref)
     FilterStructure: 'Direct-Form FIR'
          Arithmetic: 'fixed'          
           Numerator: [1x237 double]   
    PersistentMemory: false            
                                       
     CoeffWordLength: 20             
      CoeffAutoScale: true           
              Signed: true           
                                     
     InputWordLength: 16             
     InputFracLength: 15             
                                     
     FilterInternals: 'FullPrecision'
                                     

マッチング要件を緩和する (したがってフィルターの次数を増加させる) ことによって、語長が 15 ビットに減少した 247 個の係数 (前のケースよりやや増加) を取得します。

Hq5 = minimizecoeffwl(Hm, MatchRefFilter=false); 
disp(Hq5);
     FilterStructure: 'Direct-Form FIR'
          Arithmetic: 'fixed'          
           Numerator: [1x247 double]   
    PersistentMemory: false            
                                       
     CoeffWordLength: 15             
      CoeffAutoScale: true           
              Signed: true           
                                     
     InputWordLength: 16             
     InputFracLength: 15             
                                     
     FilterInternals: 'FullPrecision'
                                     

最終的な語長の制御を向上させるためには、constraincoeffwl() メソッドを使用します。たとえば、設計を 16 ビットの係数に制限します。

WL = 16;
Hqc = constraincoeffwl(Hm,WL);
disp(Hqc)
     FilterStructure: 'Direct-Form FIR'
          Arithmetic: 'fixed'          
           Numerator: [1x243 double]   
    PersistentMemory: false            
                                       
     CoeffWordLength: 16             
      CoeffAutoScale: true           
              Signed: true           
                                     
     InputWordLength: 16             
     InputFracLength: 15             
                                     
     FilterInternals: 'FullPrecision'
                                     

阻止帯域の減衰の最大化

特定語長の設計可能な係数をいくつかもつシェルフ フィルタリング エンジン (ASSP) を設計する場合、指定の次数と抑制された語長のフィルターの阻止帯域の減衰を最大化することが望まれます。次の例では、係数の表現に 14 ビットを使用しながら、70 次のハーフバンド間引きで阻止帯域の減衰 69dB を取得します。

fh = fdesign.halfband('N,Ast',70,69);
Hb1 = design(fh, 'equiripple');

14 ビット係数で単純にフィルターを量子化する場合に得られる減衰は、わずか 62.7dB です。

Hb1.Arithmetic= 'fixed';
Hb1.CoeffWordLength = 14;
mb1 = measure(Hb1)
mb1 = 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.44518                   
3-dB Point       : 0.48816                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.55482                   
Passband Ripple  : 0.010552 dB               
Stopband Atten.  : 62.7048 dB                
Transition Width : 0.10963                   
 

ノイズ シェーピングにより阻止帯域からノイズを排除することで、減衰を 1.5dB 近く向上して 64.18dB にすることができますが、まだ仕様を満たすことはできません。

Hbq1 = maximizestopband(Hb1, 14);
mq1 = measure(Hbq1)
mq1 = 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.44562                   
3-dB Point       : 0.48812                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.55367                   
Passband Ripple  : 0.010959 dB               
Stopband Atten.  : 63.8364 dB                
Transition Width : 0.10805                   
 

次の手順は、減衰 80dB の浮動小数点フィルターを設計することです。減衰を増加すると、遷移幅が増加するという代償があります。ノイズ シェーピングを行っていない 14 ビットのフィルターの減衰は 62.7dB から 66.2dB に向上しますが、それでも仕様を満たすことができません。

fh.Astop = 80;
Hb2 = design(fh,'equiripple');
Hb2.Arithmetic= 'fixed';
Hb2.CoeffWordLength = 14;
mb2 = measure(Hb2)
mb2 = 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.43464                   
3-dB Point       : 0.48704                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.56536                   
Passband Ripple  : 0.0076847 dB              
Stopband Atten.  : 66.2266 dB                
Transition Width : 0.13073                   
 

ノイズ シェーピング方法を使用すると、阻止帯域の減衰を 66.2dB から 3dB 以上向上し、69.4dB にすることで、ようやく仕様を満たすことができます。

Hbq2 = maximizestopband(Hb2,14);
mq2 = measure(Hbq2)
mq2 = 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.43584                   
3-dB Point       : 0.4871                    
6-dB Point       : 0.5                       
Stopband Edge    : 0.56287                   
Passband Ripple  : 0.0053253 dB              
Stopband Atten.  : 69.4039 dB                
Transition Width : 0.12703                   
 

浮動小数点設計に比べて、固定小数点フィルターの遷移幅が増加します。浮動小数点設計の遷移幅と阻止帯域の減衰を一致させるには、24 ビット係数が必要になるため、14 ビットのみの係数をもつ 69dB の減衰を取得するには、これが代償になります。

close(hfvt);
hfvt = fvtool(reffilter(Hb1),Hbq2, ShowReference='off', Color='white');
legend(hfvt,'Floating-Point Filter','14-bit Noise-Shaped Filter');

{"String":"Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Floating-Point Filter, 14-bit Noise-Shaped Filter.","Tex":"Magnitude Response (dB)","LaTex":[]}

close(hfvt)

まとめ

ここでは、ノイズ シェーピング方法を使用して、単一ステージまたは多段の固定小数点 FIR フィルターの係数語長を最小化したり、阻止帯域の減衰を増加させる方法を確認しました。さらに、最小次数設計でビットを多くの係数とトレードオフしたり、固定次数設計でビットを大きな遷移幅とトレードオフする方法を確認しました。

参照

[1] Jens Jorgen Nielsen, Design of Linear-Phase Direct-Form FIR Digital Filters with Quantized Coefficients Using Error Spectrum Shaping Techniques, IEEE® Transactions on Acoustics, Speech, and Signal Processing, Vol. 37, No. 7, July 1989, pp. 1020--1026.

[2] Alan V. Oppenheim and Ronald W. Schafer, Discrete-Time Signal Processing, 2nd edition, Prentice Hall, 1999, ISBN 0-13-754920-2.