Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

複素マルチレート フィルターを使用する IF サブサンプリング

この例では、デジタル ダウンコンバーター (DDC) の実装で複素マルチレート フィルターを使用する方法を示します。DDC は、デジタル無線の主要な構成要素です。DDC は、通常はアナログ デジタル (A/D) コンバーターの出力で見られる高い入力サンプル レートを、低いサンプル レートに変換するために必要な周波数変換を実行して、その後の処理を容易にします。この例では、450 kHz 搬送周波数で変調された音声信号を 20 kHz のサンプリング周波数に下げる方法を見てみます。従来の DDC アーキテクチャについて簡単に復習した後、中間周波数 (IF) サブサンプリングと呼ばれる別のソリューションについて説明し、これら 2 つのソリューションの実装コストを比較します。この例には Fixed-Point Designer™ のライセンスが必要です。

従来のデジタル ダウン コンバーター

従来のダウン コンバーターのプロセスは、搬送波のナイキスト基準を満たすアナログ信号レートでアナログ信号をサンプリングすることから開始します。可能なオプションとして、450 kHz の入力信号を 2.0 MHz でサンプリングしてから、デジタル ダウン コンバーターを使用してベースバンドへの複素変換を実行し、カスケード接続積分器櫛形 (CIC) フィルターを適用して 25 でダウン サンプリングし、1 組のハーフバンド フィルターを使って 4 でダウン サンプリングします。以下に、このような実装を示します。

ddc1.png

CIC フィルター設計

従来の DDC の最初のフィルターは通常 CIC フィルターです。CIC フィルターは、高い間引きまたは内挿のあるシステムで使用される、効率性が高く乗算器のない構造です。ここでは、2 MHz の信号を 2.0 MHz/25 = 80 kHz に低減します。

Fs_normDDC = 2e6;          % Sampling frequency
R          = 25;           % Decimation factor
Fpass      = 10e3;         % Passband Frequency
Astop      = 60;           % Aliasing Attenuation(dB)
D          = 1;            % Differential delay
dcic = fdesign.decimator(R,'cic',D,Fpass,Astop,Fs_normDDC);
cic = design(dcic,'SystemObject',true);
cicgain = dsp.FIRFilter('Numerator',1/gain(cic)); % Normalize gain of CIC

補償 FIR 間引き設計

従来の DDC の 2 番目のフィルターは CIC によって引き起こされる通過帯域の低下を補正します。CIC は sinc に似た応答をもつので、通過帯域で逆 sinc 応答をもつローパス フィルターで低下を補正できます。

Nsecs = cic.NumSections;       % Number of sections
Fpass  = 10e3;                 % Passband Frequency
Fstop  = 25e3;                 % Stopband Frequency
Apass  = 0.01;                 % Passband Ripple (dB)
Astop  = 80;                   % Stopband Attenuation (dB)
dcp = fdesign.decimator(2,'ciccomp', ...
    D,Nsecs,Fpass,Fstop,Apass,Astop,dcic.Fs_out);
cfir = design(dcp,'equiripple', ...
    'StopBandShape','linear','StopBandDecay',60,'SystemObject',true);

ハーフバンド フィルター設計

最後に、20 番目の次数のハーフバンド フィルターを使用して 40 kHz の信号を 20 kHz に低減します。

dhbfilter = fdesign.decimator(2,'halfband','N',20,dcp.Fs_out);
hbfilter = design(dhbfilter,'SystemObject',true);

従来の DDC フィルターは、前に設計した 3 段階をカスケードすると得られます。

normDDCFilter = cascade(cicgain,cic,cfir,hbfilter);

IF サブサンプリング

搬送周波数は信号抽出の一部として破棄されるため、データサンプリングのプロセス中に保持する必要がありません。実際には、複素エンベロープの帯域幅のナイキスト基準が満たされる限り、搬送波のナイキスト基準には違反してもかまいません。

ナイキスト基準をこのような狭帯域で解釈すると、IF サブサンプリングと呼ばれる別のデータ収集プロセスにつながります。このプロセスでは、A/D コンバーターのサンプル レートは、中心周波数を意図的にエイリアシングするために、信号の中心周波数より少なくなるように選択されます。ナイキスト基準に意図的に違反しているので、複数の周波数範囲が目的の信号コンポーネントと同じ周波数位置にエイリアシングしないように、アナログ信号を調整しなければなりません。

変数 y は、450 kHz の搬送周波数で変調された約 3 秒の音声信号を表します。離散信号 ys は、120 kHz A/D コンバーターの出力を表します。

[y,ys,Fs] = loadadcio;
Fs_altDDC = 1.2e5;   % Sampling frequency

[Hys,Fys] = periodogram(ys,[],[],Fs,'power','centered');
N = length(Fys);

figure('color','white')
periodogram(y,[],[],Fs,'power','centered');
clear y;
hold on;
plot((-(ceil(N/2*9)-1):floor(N/2*9))/N*Fs_altDDC/1000, ...
        repmat(10*log10(Hys),9,1),'r:');
axis([-50 500 -160 0])
legend('Input of A/D Converter','Aliased Output of A/D Converter', ...
    'Location','NorthEast');

Figure contains an axes object. The axes object with title Periodogram Power Spectrum Estimate, xlabel Frequency (kHz), ylabel Power (dB) contains 2 objects of type line. These objects represent Input of A/D Converter, Aliased Output of A/D Converter.

約 450 kHz の周波数帯域は約 -30 kHz でエイリアシングしました。サンプリング周波数の 4 分の 1 までエイリアシングすると、正の周波数エイリアスと負の周波数エイリアスの分離を最大化できます。これによってアナログ バンドパス フィルターの遷移帯域幅を最大化できるので、そのコストが最小化されます。

また、サンプリング周波数に 120 kHz を選択すると、ファクター 6 のダウン サンプリングによって達成される次の 20 kHz へのダウン コンバージョン タスクが容易になります。ダウン コンバージョンは 2 段階で行います。まず、複素バンドパス フィルターによって 3 から 1 へのダウン サンプリングを実行してから、ハーフバンド フィルターで 2 から 1 への変換を実行します。以下に、このエイリアシング DDC の構造を示します。

複素バンドパス フィルター設計

複素バンドパス フィルターを得るには、フィルター係数に周波数変換式の項 exp(-j*pi/2*n) を乗算してローパス間引きプロトタイプを 4 分の 1 のサンプル レートに変換します。ローパス フィルターの係数は実数ですが、変換後のフィルターの係数は複素数です。下の図は、これらのフィルターの振幅応答を表しています。

M = 3;               % Decimation Factor
TW   = Fstop-Fpass;  % Transition Width (Hz)
designLowpass = fdesign.decimator(M,'nyquist',M,TW,Astop,Fs_altDDC);
lpfilter = design(designLowpass,'SystemObject',true); % Lowpass prototype
n = 0:length(lpfilter.Numerator)-1;
complexBPFilter = dsp.FIRDecimator(M,lpfilter.Numerator.*exp(-1i*pi/2*n));
fvt = fvtool(lpfilter,complexBPFilter,'Fs',Fs_altDDC,'Color','White');
legend(fvt,'Lowpass Decimator','Complex Bandpass Decimator', ...
    'Location','NorthEast')

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line. These objects represent Lowpass Decimator, Complex Bandpass Decimator.

次に、複素バンドパスの間引きを A/D コンバーターの出力に適用します。4 分の 1 のサンプルレートの信号は、間引きの下ではどの整数ファクターでも常に 4 分の 1 のサンプルレートの倍数にエイリアシングすることがわかります。この例では、-30 kHz の中心の信号は 40/4 = 10 kHz にエイリアシングします。

ycbp = complexBPFilter(ys);
figure('color','white')
periodogram(ycbp,[],[],designLowpass.Fs_out,'power','centered');
legend('Output of Complex Bandpass Decimator')

Figure contains an axes object. The axes object with title Periodogram Power Spectrum Estimate, xlabel Frequency (kHz), ylabel Power (dB) contains an object of type line. This object represents Output of Complex Bandpass Decimator.

次に、出力シーケンス ycbp がヘテロダイン効果でゼロになります。

yht = ycbp.*(-1i).^(0:length(ycbp)-1).';
figure('color','white')
periodogram(yht,[],[],designLowpass.Fs_out,'power','centered');
legend('Heterodyned Sequence')

Figure contains an axes object. The axes object with title Periodogram Power Spectrum Estimate, xlabel Frequency (kHz), ylabel Power (dB) contains an object of type line. This object represents Heterodyned Sequence.

最後に、ヘテロダインを発生させたシーケンスが入力としてハーフバンド フィルターに渡され、2 で間引きされます。従来の DDC と同様に、同じハーフバンド フィルターを再利用できます。

yf = hbfilter(yht);
figure('color','white')
periodogram(yf,[],[],dhbfilter.Fs_out,'power','centered');
legend('Output of Aliasing DDC')

Figure contains an axes object. The axes object with title Periodogram Power Spectrum Estimate, xlabel Frequency (kHz), ylabel Power (dB) contains an object of type line. This object represents Output of Aliasing DDC.

「エイリアシング」DCC の出力で音声信号を再生します。(Copyright 2002 FingerBomb)

player = audioDeviceWriter('SampleRate',dhbfilter.Fs_out);
player(real(yf));

実装コストの比較

コスト分析に進む前に、2 つの DDC ソリューションのフィルターの振幅応答が同等であることを確認しましょう。従来の DDC ケースでのベースバンドへの複素変換と、IF サブサンプリング ケースのヘテロダインは除外します。さらに、遷移の幅、通過帯域のリップル、および阻止帯域の減衰量が複素バンドパスの間引きと同じであるため、後のケースではローパス プロトタイプの間引きを使用します。

altDDCFilter = cascade(lpfilter,hbfilter);

両ケースで使用されるフィルターの振幅応答が類似することを確認します。通過帯域リップルが 0.04 dB 未満、6 dB のカットオフ周波数 10 kHz、13.4 kHz での阻止帯域の減衰量が 55 dB となるため、コスト分析に進むことができます。

set(fvt, ...
    'Filters',{normDDCFilter,altDDCFilter}, ...
    'FrequencyRange','Specify freq. vector', ...
    'FrequencyVector',linspace(0,100e3,2048), ...
    'Fs',[Fs_normDDC,Fs_altDDC], ...
    'ShowReference','off', ...
    'Color','White');
legend(fvt,'Conventional DDC Filter', ...
    'Equivalent Digital IF Subsampling Filter', ...
    'Location','NorthEast');

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line. These objects represent Conventional DDC Filter, Equivalent Digital IF Subsampling Filter.

従来の DDC の場合は、最初にベースバンド変換のコストを考慮に入れなければなりません。これは、2 MHz で動作している乗算器 1 つだけで行うと想定しています。次に、CIC フィルターとハーフバンド フィルターのコストを足す必要があります。IF サブサンプリングの場合は、ヘテロダインのコストを考慮に入れなければなりません。これは、40 kHz で動作している乗算器 1 つだけで行うと想定しています。次に、複素バンドパス フィルターとハーフバンド フィルターのコストを足します。

% Cost of CIC and halfband filters
c_normDDC = cost(normDDCFilter);
% Cost of complex bandpass and halfband filters
c_altDDC  = cost(cascade(complexBPFilter,hbfilter));
ddccostcomp(Fs_normDDC,c_normDDC,Fs_altDDC,c_altDDC)
ans = 
    'Total Cost                      : Conventional DDC | IF subsampling
     -------------------------------------------------------------------
     Number of Coefficients          :               36 |             42
     Number of States                :               50 |             62
     Multiplications per microsecond :             5.18 |            1.5
     Additions per microsecond       :             9.44 |            1.4'

IF サンプリングの場合に必要な乗算器、加算器、および状態の数は、従来の DDC と同等ですが、1 秒間の乗算の数を 71%、1 秒間の加算の数を 85% 節約できるので、1 秒間の演算数が大幅に減少します。

dsp.ComplexBandpassDecimator の使用

dsp.ComplexBandpassDecimator System object を使用すると、複素バンドパス フィルターをさらに容易に設計できます。オブジェクトは、指定された間引き係数、中心周波数およびサンプル レートに基づいてバンドパス フィルターを設計します。上記の設計で行ったようにローパス係数をバンドパスに変換する必要はありません。オブジェクトが行います。さらに、オブジェクトは、フィルター処理された信号がエイリアスされる周波数を派生させ、それを混合してゼロに戻します。

% Design a complex bandpass filter. Include the decimate-by-2 halfband
% filter into the design by specifying a decimation factor of 2*M:
bp = dsp.ComplexBandpassDecimator(M*2 , -30e3, Fs_altDDC,...
                                  'TransitionWidth',TW);
% Visualize the filter response                              
visualizeFilterStages(bp); 

Figure Figure 2: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) (normalized to 0 dB) contains an object of type line. This object represents Filter #1.

% Filter the output of the 120 kHz A/D converter
yf = bp(ys);
figure('color','white')
periodogram(yf,[],[],dhbfilter.Fs_out,'power','centered');
legend('Output of complex bandpass decimator')

Figure contains an axes object. The axes object with title Periodogram Power Spectrum Estimate, xlabel Frequency (kHz), ylabel Power (dB) contains an object of type line. This object represents Output of complex bandpass decimator.

player(real(yf));

まとめ

この例では、IF サブサンプリングを基盤とするデジタル ダウン コンバーターの設計時に、複素マルチレート フィルターを使用する方法を紹介しました。IF サブサンプリング法は、従来の DDC に比べて多くの用途でコスト効率を向上できます。IF サブサンプリングの詳細については、『Multirate Signal Processing for Communication Systems』(fredric j harris, Prentice Hall, 2004) を参照してください。