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

デジタル ダウン コンバーターのフィルター チェインの HDL への実装

この例では、DSP System Toolbox™ および Fixed-Point Designer™ を使用して、Global System for Mobile (GSM) 仕様を満たす、デジタル ダウン コンバーター (DDC) のフィルター チェインを実装する 3 ステージのマルチレート固定小数点フィルターを設計する方法を示します。

Filter Design HDL Coder™ を使用して、同じ 3 ステージのマルチレート固定小数点フィルターの合成可能な HDL コードを生成します。最後に、Simulink® と HDL Verifier™ MS を使用して固定小数点フィルターを同時にシミュレーションし、生成された HDL コードで同等の Simulink 動作モデルと同じ結果が得られることを確認します。

デジタル ダウン コンバーター

デジタル ダウン コンバーター (DDC) は、デジタル ラジオの主要な要素です。DDC は、デジタル ラジオの高い入力サンプルレートを処理が容易な低いサンプルレートに変換するために必要な周波数変換を実行します。この例では、DDC は約 70 MHz で動作し、レートを 270 KHz に減少させなければなりません。

問題をさらに制約するために、Graychip の GC4016 Multi-Standard Quad DDC Chip の DDC の 1 つをモデル化します。GC4016 は、他の機能と共に、次のフィルターを提供します。プログラム可能な間引き係数 (8-4096) を含む 5 ステージ CIC フィルター、2 で間引きし、プログラム可能な 16 ビット係数をもつ 21 タップ FIR フィルター、および 2 で間引きし、プログラム可能な 16 ビット係数をもつ 63 タップ FIR フィルター。

DDC は、数値制御発振器 (NCO) と、入力信号をベースバンドに直交ダウン コンバートする混合器で構成されます。次に、カスケード接続積分器櫛形 (CIC) フィルターによってベースバンド信号がローパス フィルター処理された後、2 つの FIR 間引きフィルターが適用されて追加処理用に約 270 KHz の低いサンプルレートが達成されます。最終段階では、用途に応じて、目的のサンプルレートを達成するために信号を内挿または間引きするリサンプラーを使用する場合もあります。リサンプラーを使用することで、フィルター処理をさらに実行することもできます。標準の DDC のブロック線図を以下に示します。

この例では 3 ステージのマルチレート間引きフィルターを紹介します。このフィルターは CIC フィルターと 2 つの間引き FIR フィルターで構成されます。

GSM 仕様

目的の GSM 帯域幅は 160 KHz です。したがって、DDC の 3 ステージのマルチレート フィルター応答は、0.1 dB のピーク ツー ピーク以下の通過帯域リップル内において、この帯域幅で平坦でなければなりません。次に示すバンド拒否マスクの GSM では、フィルターは 100 KHz で 18 dB の減衰を達成しなければならないことがわかります。

さらに、GSM では、270.833 Ksps のシンボル レートが求められます。Graychip の入力サンプルレートは 69.333 MHz のクロック レートと同じなので、入力を 270.833 KHz にダウンサンプリングしなければなりません。そのためには、256 で間引きされた 3 ステージのマルチレート フィルターが必要です。

カスケード接続積分櫛形 (CIC) フィルター

CIC フィルターは、高い間引き (または内挿) レートを達成することができ、乗数なしで実装されるので、非常に便利なマルチレート フィルターです。CIC は、アップサンプラーまたはダウンサンプラーで再帰的にカスケードされた実装ボックスカー フィルターです。これらの特性により、CIC は高いレートで稼働するデジタル システム (特にシステムを ASIC や FPGA に実装する場合) で非常に便利です。

CIC には望ましい特性がありますが、いくつかの欠点もあります。最も顕著な点は、sinc に似た応答が原因で通過帯域領域で減衰が発生することです。その理由から、CIC の後に補正フィルターが使用されることがあります。CIC によって発生した低下を補正するために、補正フィルターは通過帯域領域に逆 sinc 応答をもたなければなりません。

これらのフィルターの設計とカスケードは、グラフィカル ユーザー インターフェイスのフィルター デザイナーで実行できます。

しかし、ここではコマンド ライン機能を使用します。

次のように CIC を定義します。

R    = 64; % Decimation factor
D    = 1;  % Differential delay
Nsecs = 5;  % Number of sections

OWL = 20; % Output word length

cic = dsp.CICDecimator('DecimationFactor',R,'NumSections',Nsecs,...
    'FixedPointDataType','Minimum section word lengths',...
    'OutputWordLength',OWL);

info メソッドを呼び出して CIC の詳細を表示できます。

info(cic)
ans =

  9x56 char array

    'Discrete-Time FIR Multirate Filter (real)               '
    '-----------------------------------------               '
    'Filter Structure    : Cascaded Integrator-Comb Decimator'
    'Decimation Factor   : 64                                '
    'Differential Delay  : 1                                 '
    'Number of Sections  : 5                                 '
    'Stable              : Yes                               '
    'Linear Phase        : Yes (Type 2)                      '
    '                                                        '

69.333 MHz の入力レートで動作する CIC フィルターの論理的な振幅応答をプロットして分析します。

Fs_in = 69.333e6;
fvt = fvtool(cic,'Fs',Fs_in);
fvt.Color = 'White';

最初に目に付くのは、CIC フィルターに大きな通過帯域ゲインがあることです。これは、構造体内の追加とフィードバックが原因です。CIC の振幅応答は、FVTool で対応する設定を使用して正規化することができます。CIC フィルター応答を DC におけるゲインが 0 dB になるよう正規化すると、次ステージのフィルターの重ね合わされたフィルター応答の解析が容易になります。

fvt.NormalizeMagnitudeto1 = 'on';

注意すべきもう 1 つの点は、通過帯域領域をズームすると、CIC に 80 KHz における約 -0.4 dB の減衰 (低下) が見られます。これは、目的の帯域幅内です。本質的に、CIC フィルターはボックスカー フィルターのカスケードなので、低下を招く sinc に似た応答をもちます。この低下は、次のステージで FIR フィルターによって補正する必要があります。

axis([0 .1 -0.8 0]);

補正 FIR 間引き

DDC フィルター チェインの第 2 段階では、CIC によって生じた通過帯域の低下を補正して、2 で間引く必要があります。CIC は sinc に似た応答をもつので、通過帯域で逆 sinc 応答をもつローパス フィルターで低下を補正できます。このフィルターは、1/64 の入力サンプルレート (69.333 MHz) で動作するので、そのレートは 1.0833MHz です。逆 sinc 通過帯域応答でローパス フィルターを最初から設計する代わりに、CIC 補正 (逆 sinc) 応答で直接間引きを設計できる関数を使用します。

% Filter specifications
Fs     = 1.0833e6; % Sampling frequency 69.333MHz/64
Apass  = 0.01;     % dB
Astop  = 70;       % dB
Fpass  = 80e3;     % Hz passband-edge frequency
Fstop  = 293e3;    % Hz stopband-edge frequency

% Design decimation filter. D and Nsecs have been defined above as the
% differential delay and number of sections, respectively.
compensator = dsp.CICCompensationDecimator('SampleRate',Fs,...
    'CICRateChangeFactor',R,'CICNumSections',Nsecs,...
    'CICDifferentialDelay',D,'PassbandFrequency',Fpass,...
    'StopbandFrequency',Fstop,'PassbandRipple',Apass,...
    'StopbandAttenuation',Astop);

% Now we have to define the fixed-point attributes of our multirate filter.
% By default, the fixed-point attributes of the accumulator and multipliers
% are set to ensure that full precision arithmetic is used, i.e. no
% quantization takes place. By default, 16 bits are used to represent the
% filter coefficients. Since that is what we want in this case, no changes
% from default values are required.

info コマンドを使用して、アキュムレータと製品の語長 (自動的に決定されます) を含む FIR 補正フィルターの包括的なレポートを取得できます。

info(compensator)
ans =

  10x56 char array

    'Discrete-Time FIR Multirate Filter (real)               '
    '-----------------------------------------               '
    'Filter Structure   : Direct-Form FIR Polyphase Decimator'
    'Decimation Factor  : 2                                  '
    'Polyphase Length   : 11                                 '
    'Filter Length      : 21                                 '
    'Stable             : Yes                                '
    'Linear Phase       : Yes (Type 1)                       '
    '                                                        '
    'Arithmetic         : double                             '

逆 sinc フィルターで CIC をカスケードすると、CIC によって発生した通過帯域の低下が除去されたかどうかを確認できます。

cicCompCascade = cascade(cic,compensator);
fvt = fvtool(cic,compensator,cicCompCascade,'Fs',[Fs_in,Fs_in/64,Fs_in]);
fvt.Color = 'White';
fvt.NormalizeMagnitudeto1 = 'on';
axis([0 .1 -0.8 0.8]);
legend(fvt,'cic','compensator','cascade');

2 つのフィルターのカスケードのフィルター応答 (CIC 応答および対応する FIR 応答の間) に見られるように、通過帯域の低下が除去されています。

3 ステージ FIR 間引き

前に示したように、GSM スペクトル マスクでは、100 KHz での 18 dB の減衰が要求されます。したがって、最後の第 3 ステージでは、シンプルな等リップル ローパス フィルターを試します。再度、係数を 16 ビット (既定) に量子化する必要があります。このフィルターも 2 で間引きする必要があります。

N = 62;       % 63 taps
Fs = 541666;  % 541.666 kHz
Fpass = 80e3;
Fstop = 100e3;

spec = fdesign.decimator(2,'lowpass','N,Fp,Fst',N,Fpass,Fstop,Fs);
% Give more weight to passband
decimator = design(spec,'equiripple','Wpass',2,'SystemObject',true);

既定でマルチレート フィルターを定義するとき、完全精度を維持するためにアキュムレータのワード サイズが自動的に決定されます。しかし、ここでは 20 ビットの出力しかないので、出力形式を 20 ビットの語長と -12 の小数部の長さに設定します。最初に、FullPrecisionOverride プロパティの既定値を true から false に変更しなければなりません。

decimator.FullPrecisionOverride = false;
decimator.OutputDataType = 'custom';
decimator.RoundingMethod = 'nearest';
decimator.OverflowAction = 'Saturate';
decimator.CustomOutputDataType = numerictype([],20,-12);

info メソッドを使用して、フィルターの詳細を表示できます。

info(decimator)
ans =

  10x56 char array

    'Discrete-Time FIR Multirate Filter (real)               '
    '-----------------------------------------               '
    'Filter Structure   : Direct-Form FIR Polyphase Decimator'
    'Decimation Factor  : 2                                  '
    'Polyphase Length   : 32                                 '
    'Filter Length      : 63                                 '
    'Stable             : Yes                                '
    'Linear Phase       : Yes (Type 1)                       '
    '                                                        '
    'Arithmetic         : double                             '

多段のマルチレート DDC フィルター チェイン

3 つのフィルターを設計して量子化したので、正規化された CIC と 2 つの FIR フィルターをカスケードして、全体的なフィルター応答を取得できます。ここでも、正規化された振幅を使用して、カスケードされたフィルター応答が必ず 0 dB となるよう正規化します。

ddc = cascade(cic,compensator,decimator);
fvt = fvtool(ddc,'Fs',Fs_in);
fvt.Color = 'White';
fvt.NormalizeMagnitudeto1 = 'on';
fvt.NumberofPoints = 8192*3;
axis([0 1 -200 10]);  % Zoom-in

全体的なフィルター応答が GSM 仕様を満たすことを確認するために、GSM スペクトル マスクをフィルター応答に重ねて表示できます。

drawgsmmask;

全体的なフィルター応答は GSM スペクトル マスクの制約内にあることがわかります。また、通過帯域リップルが 0.1 dB のピーク ツー ピーク未満という要件も満たす必要があります。このことは、axis コマンドを使用してズーム インすることによって確認できます。

axis([0 .09 -0.08 0.08]);

通過帯域リップルが 0.1 dB ピーク ツー ピークの GSM 要件を満たしていることがわかります。

VHDL コードの生成

フィルター デザイナーは、以下のダイアログからの HDL コードの生成もサポートします。

フィルター デザイナーとコマンド ラインから VHDL または Verilog コードを生成して、VHDL または Verilog ファイルのベンチマークをテストすることができます。また、多くのオプションを指定して独自のコード記述の標準とガイドラインを満たし、生成された HDL コードをカスタマイズすることもできます。

しかし、ここでは、コマンド ライン機能を使用して HDL コードを生成します。

仕様を満たす 3 ステージのマルチレート固定小数点フィルターが作成されたので、HDL コードを生成できます。

CIC と 2 つの FIR フィルターをカスケードして VHDL を生成します。

混合器から出力される 20 ビットの語長と 18 ビットの小数部の長さをもつ固定小数点データ (S20,18) が量子化されることを避けるために、CIC の入力語長と小数部の長さを同じ値の S20,18 に設定します。

%hcas = cascade(hcic,hcfir,hpfir);
workingdir = tempname;
inT = numerictype(1,20,18);
generatehdl(ddc,'InputDataType', inT,...
    'Name','filter','TargetLanguage','VHDL',...
    'TargetDirectory',fullfile(workingdir,'hdlsrc'));
### Starting VHDL code generation process for filter: filter
### Cascade stage # 1
### Starting VHDL code generation process for filter: filter_stage1
### Generating: <a href="matlab:edit('/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter_stage1.vhd')">/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter_stage1.vhd</a>
### Starting generation of filter_stage1 VHDL entity
### Starting generation of filter_stage1 VHDL architecture
### Section # 1 : Integrator
### Section # 2 : Integrator
### Section # 3 : Integrator
### Section # 4 : Integrator
### Section # 5 : Integrator
### Section # 6 : Comb
### Section # 7 : Comb
### Section # 8 : Comb
### Section # 9 : Comb
### Section # 10 : Comb
### Successful completion of VHDL code generation process for filter: filter_stage1
### Cascade stage # 2
### Starting VHDL code generation process for filter: filter_stage2
### Generating: <a href="matlab:edit('/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter_stage2.vhd')">/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter_stage2.vhd</a>
### Starting generation of filter_stage2 VHDL entity
### Starting generation of filter_stage2 VHDL architecture
### Successful completion of VHDL code generation process for filter: filter_stage2
### Cascade stage # 3
### Starting VHDL code generation process for filter: filter_stage3
### Generating: <a href="matlab:edit('/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter_stage3.vhd')">/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter_stage3.vhd</a>
### Starting generation of filter_stage3 VHDL entity
### Starting generation of filter_stage3 VHDL architecture
### Successful completion of VHDL code generation process for filter: filter_stage3
### Generating: <a href="matlab:edit('/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter.vhd')">/tmp/Bdoc19a_1054962_236380/tpd92222b5_35ec_4b39_9dea_236ee1e07b64/hdlsrc/filter.vhd</a>
### Starting generation of filter VHDL entity
### Starting generation of filter VHDL architecture
### Successful completion of VHDL code generation process for filter: filter
### HDL latency is 2 samples

Simulink における ModelSim を使用した HDL 同時シミュレーション

生成された HDL コードで Simulink モデルと同じ結果が得られることを確認するために、HDL Verifier MS を使用して Simulink で HDL コードの同時シミュレーションを行います。2 つの信号パスを含むビルド済みの Simulink モデルがあります。1 つの信号パスは、3 ステージのマルチレート フィルターの Simulink の動作モデル結果を生成します。もう 1 つのパスは、ModelSim® を使用して、生成した VHDL コードのシミュレーション結果を生成します。

open_system('ddcfilterchaindemo_cosim');

Simulink モデルのボタンをダブルクリックして、ModelSim を開始します。ModelSim をシステム パス上にインストールしなければならないことに注意してください。ModelSim によって HDL コードが自動的にコンパイルされてシミュレーションが初期化され、波形ビューアーが開きます。

ModelSim の準備ができたら、Simulink モデルを実行します。これにより、ModelSim を使用した同時シミュレーションが実行され、Time Scope が自動的に開いて結果が表示されます。

ロジック アナライザーを使用して、結果を表示します。

結果の検証

一番上のトレースは励起チャープ信号です。"ref" というラベルが付けられた次の信号は、3 ステージのマルチレート フィルターの Simulink 動作モデルによって生成された基準信号です。スコープで "cosim" というラベルが付けられた一番下のトレースは、3 ステージのマルチレート フィルターの生成された HDL コードの ModelSim シミュレーション結果です。最後のトレースは、Simulink の動作モデル結果と ModelSim の HDL コードのシミュレーションの間の誤差を示します。

まとめ

いくつかの MathWorks™ 製品を使用して、GSM アプリケーション用の DDC の 3 ステージ マルチレート固定小数点フィルター チェインを設計および分析しました。次に、フィルターを実装する HDL コードを生成して、Simulink の動作モデルと HDL Verifier MS 経由で ModelSim でシミュレートされた HDL コードを比較して、生成コードを検証しました。