ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

楕円 IIR フィルターの固定小数点スケーリング

この例では、固定小数点フィルター オブジェクトをオートスケールする方法を示します。オートスケール メソッドでは、フィルターの各ノードに対してダイナミック レンジ スケーリングが使用できます。このメソッドは、フィルターを浮動小数点で実行し、シミュレーションで取得された最大および最小データを使用して、シミュレーション範囲がカバーされ、精度が最大となるように小数部の長さを設定します。語長は変化しません。

フィルターの設計

ここでは、最小次数の楕円設計を使用します。楕円設計には、'Linf' 2 次セクション型スケーリング規則が使用された場合、比較的良好なスケーリングが行われるという特長があります。

f = fdesign.lowpass('Fp,Fst,Ap,Ast',.48,.52,1,60);
Hd = design(f, 'ellip', 'FilterStructure', 'df1sos', ...
    'SOSScaleNorm', 'Linf');
hfvt = fvtool(Hd,'legend','on');
hfvt.SosviewSettings.View = 'Cumulative';

各セクションのフィルターへの入力からさまざまな状態までの間で測定された累積内部周波数応答で、0 dB を超えるものがないことに注意してください。したがって、この設計は、固定小数点実装のための適切な候補であることがわかります。

入力スティミュラス

正確性のみを評価することが目的であるため、フィルター処理し、比較対照するデータとして乱数データを使用します。範囲 [-1,1) で量子化器を作成して、10 ビットの語長を使用した一様分布するランダムなホワイト ノイズ データを生成します。モンテ カルロ シミュレーションで使用する 5 つの独立したチャネルを生成して、固定小数点フィルターのスケーリングを行います。

rng(5,'twister');
q = quantizer([10,9],'RoundMode','round');
xq = randquant(q,100,5);
x = fi(xq,true,10,9);

フィルターのスケーリング

ハードウェアが 14 ビットの係数、入力と状態用の 10 ビットのバスをサポートし、24 ビットの MAC ユニットをもっていることを前提としています。また、フィルターの出力では 12 ビットのみを維持できることも前提としています。

Hd.Arithmetic = 'fixed';
set(Hd, 'CoeffWordLength', 14, ...
    'InputWordLength', 10, 'InputFracLength', 9, ...
    'NumStateWordLength', 10, 'DenStateWordLength', 10, ...
    'AccumWordLength', 24, ...
    'OutPutWordLength', 12);
setfilter(hfvt,Hd)

14 ビットの語長は、係数を表すために十分であることがわかります。ここで、フィルター内部をオートスケールします。

Hd = autoscale(Hd,x);

固定小数点設定の確認

フィルターを以下のように固定小数点で実行することで、設定が適切であることを確認できます。

fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');
y = filter(Hd,x);
fipref('LoggingMode', 'off');
R = qreport(Hd)
 
R =
 
 
                                                  Fixed-Point Report                                          
                 ---------------------------------------------------------------------------------------------
                      Min              Max       |              Range              |      Number of Overflows
                 ---------------------------------------------------------------------------------------------
         Input:              -1       0.99414063 |             -1       0.99804688 |               0/500 (0%)
        Output:      -1.0507813         0.984375 |             -2        1.9990234 |               0/500 (0%)
    Num States:              -1       0.99414063 |             -1       0.99804688 |              0/4000 (0%)
    Den States:      -1.0507813         0.984375 |             -2        1.9960938 |              0/4000 (0%)
      Num Prod:     -0.58339119       0.58061314 |             -2        1.9999998 |              0/6000 (0%)
      Den Prod:     -0.93431282       0.89060783 |             -8         7.999999 |              0/4000 (0%)
       Num Acc:      -1.1353083        1.1596537 |             -2        1.9999998 |              0/4000 (0%)
       Den Acc:      -1.3415079        1.3543978 |             -8         7.999999 |              0/4000 (0%)

オーバーフローがないこと、つまり、すべての信号が使用可能なダイナミック レンジ内にあることを確認します。

DF1SOS と DF2SOS の比較

直接型 I の実装と直接型 II の実装によって追加された量子化ノイズを比較できます。いずれの実装も、以下のように 'Linf' スケール済みの2 次セクション型のカスケードを使用しています。

Hd2 = design(f, 'ellip', 'FilterStructure', 'df2sos', ...
    'SOSScaleNorm', 'Linf');
Hd2.Arithmetic = 'fixed';
set(Hd2, 'CoeffWordLength', 14, ...
    'InputWordLength', 10, 'InputFracLength', 9, ...
    'SectionInputWordLength', 10, 'SectionOutputWordLength', 10, ...
    'StateWordLength', 10, 'AccumWordLength', 24, ...
    'OutPutWordLength', 12);
Hd2 = autoscale(Hd2,x);
close(hfvt)
hfvt = fvtool(Hd, Hd2,'Analysis','magestimate','ShowReference','off');
legend(hfvt,'DF1SOS','DF2SOS')

close(hfvt)
hfvt = fvtool(Hd, Hd2,'Analysis','noisepower','ShowReference','off');
legend(hfvt,'DF1SOS','DF2SOS')

両方の実装に対して通過帯域内の平均ノイズ パワーを計算します。

df1sosnoisepsd = noisepsd(Hd,100);
df1sos_pb_avg_noisepwr = db(avgpower(df1sosnoisepsd,[0 .48]*pi),'power')
df1sos_pb_avg_noisepwr =

  -43.6182

df2sosnoisepsd = noisepsd(Hd2,100);
df2sos_pb_avg_noisepwr = db(avgpower(df2sosnoisepsd,[0 .48]*pi),'power')
df2sos_pb_avg_noisepwr =

  -41.1892

df1sos のノイズ パワーの方が弱いことがわかります。特に、通過帯域でのノイズ パワーの差異は 2.4 dB と顕著です。ただし、df1sos でのノイズ パワーは、遷移バンド内で強くなり、振幅応答推定からその否定的な結果がはっきりとわかります。

df1sos_tw_avg_noisepwr = db(avgpower(df1sosnoisepsd,[.48 .52]*pi),'power')
df1sos_tw_avg_noisepwr =

  -48.2869

df2sos_tw_avg_noisepwr = db(avgpower(df2sosnoisepsd,[.48 .52]*pi),'power')
df2sos_tw_avg_noisepwr =

  -54.5424

この df2sos では、遷移バンドに平均で約 6.25 dB のノイズがあります。最後に、以下のように阻止帯域での平均ノイズ パワーを計算します。

df1sos_sb_avg_noisepwr = db(avgpower(df1sosnoisepsd,[.52 1]*pi),'power')
df1sos_sb_avg_noisepwr =

  -61.9340

df2sos_sb_avg_noisepwr = db(avgpower(df2sosnoisepsd,[.52 1]*pi),'power')
df2sos_sb_avg_noisepwr =

  -60.6869

阻止帯域内では、通過帯域内と同様に、df1sos のノイズ パワーがわずかに弱くなっています。阻止帯域での強度の差異は、約 1.25 dB です。

この情報は役に立ちましたか?