ドキュメンテーション

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

間引き設計/内挿設計

この例では、間引きと内挿のためのフィルターの設計法を示します。通常、ローパス フィルターは、間引きおよび内挿に使用されます。間引きする場合、ローパス フィルターは、サンプルレートを減らす前に信号のバンド幅を減らすために使用されます。これは、サンプルレートの減少によるエイリアシングを最小化するために実行されます。内挿する場合、ローパス フィルターは、ローレート信号からのスペクトル画像を削除するために使用されます。ローパス フィルターの設計に関する一般的なメモについては、「ローパス FIR フィルターの設計」の例を参照してください。

入力信号

作業を始める前に、まずこの例で使用する信号を定義します。使用する信号のサンプルはフラット スペクトルをもつように標準正規分布から作成されています。

HSource = dsp.SignalSource('SamplesPerFrame', 500);
HSource.Signal = randn(1e6,1);      % Gaussian white noise signal

間引き設計

間引きの場合、信号のバンド幅を適切な値に減らして、サンプルレートを減らす際に最低限のエイリアシングが発生するようにします。ナイキストの全区間を占める信号には (すなわち、大きくサンプリングされている)、800 Hz のサンプルレートがあることを前提とします。信号のエネルギーは、400 Hz まで拡張します。サンプルレートをファクター 4 で 200 Hz に減らす場合、信号の帯域幅もファクター 4 で減らさない限り、有意のエイリアシングが発生します。理想的には、100 Hz でのカットオフのある完全なローパス フィルターを使用します。実際には、以下が発生します。0 から 100 Hz の間の信号成分は、非理想的なローパス フィルターの通過帯域リップルによってわずかに歪みます。フィルターの有限の阻止帯域の減衰により、エイリアシングが発生します。フィルターは信号をこのような帯域で歪める遷移帯域をもちます。これらの効果のそれぞれによってもたらされた歪みの量は、適切なフィルターを設計することにより制御できます。通常、良いフィルターを取得するには、より高い次数が必要です。

まず、間引き係数 4 をもつ簡単なローパス間引きを設計してみましょう。

M   = 4;   % Decimation factor
Fp  = 80;  % Passband-edge frequency
Fst = 100;  % Stopband-edge frequency
Ap  = 0.1; % Passband peak-to-peak ripple
Ast = 80;  % Minimum stopband attenuation
Fs  = 800; % Sampling frequency
HfdDecim = fdesign.decimator(M,'lowpass',Fp,Fst,Ap,Ast,Fs)
 
HfdDecim =
 
          MultirateType: 'Decimator'    
               Response: 'Lowpass'      
       DecimationFactor: 4              
          Specification: 'Fp,Fst,Ap,Ast'
            Description: {4x1 cell}     
    NormalizedFrequency: false          
                     Fs: 800            
                  Fs_in: 800            
                 Fs_out: 200            
                  Fpass: 80             
                  Fstop: 100            
                  Apass: 0.1            
                  Astop: 80             
                                        

フィルターの仕様によって、20 Hz の遷移帯域が 80 から 100 Hz の間で受け入れられ、帯域成分からの最小減衰が 80 dB であることが決定されます。また、対象成分の最大歪みは 0.05 dB (通過帯域のピーク間リップルの半分)であることも決定されます。これらの仕様に準拠した等リップル フィルターは、次のようにして取得できます。

HDecim = design(HfdDecim,'equiripple', 'SystemObject', true);
measure(HDecim)

HSpec = dsp.SpectrumAnalyzer(...                    % Spectrum scope
                    'PlotAsTwoSidedSpectrum', false, ...
                    'SpectralAverages', 50, 'OverlapPercent', 50, ...
                    'Title', 'Decimator with equiripple lowpass filter',...
                    'YLimits', [-50, 0], 'SampleRate', Fs/M*2);

while ~isDone(HSource)
    inputSig = step(HSource);   % Input
    decimatedSig = step(HDecim, inputSig);  % Decimator
    step(HSpec, upsample(decimatedSig,2));  % Spectrum
    % The upsampling is done to increase X-limits of SpectrumAnalyzer
    % beyond (1/M)*Fs/2 for better visualization
end
release(HSpec);
reset(HSource);
 
ans =
 
Sample Rate      : 800 Hz     
Passband Edge    : 80 Hz      
3-dB Point       : 85.621 Hz  
6-dB Point       : 87.8492 Hz 
Stopband Edge    : 100 Hz     
Passband Ripple  : 0.092414 dB
Stopband Atten.  : 80.3135 dB 
Transition Width : 20 Hz      
 

測定値から明らかなように、設計は仕様に準拠しています。

ナイキスト フィルターの使用

ナイキスト フィルターは係数の数の 1/M がゼロであるため、間引きおよび内挿に最適です。ナイキスト フィルターの帯域は、通常、間引き係数に等しく設定されています。これにより、カットオフ周波数は (1/M)*Fs/2 になります。この例では、遷移帯域の中心は (1/4)*400 = 100 Hz のあたりになります。

TW = 20; % Transition width of 20 Hz
HfdNyqDecim = fdesign.decimator(M,'nyquist',M,TW,Ast,Fs)
 
HfdNyqDecim =
 
          MultirateType: 'Decimator'                                     
               Response: 'Nyquist'                                       
       DecimationFactor: 4                                               
          Specification: 'TW,Ast'                                        
            Description: {'Transition Width';'Stopband Attenuation (dB)'}
                   Band: 4                                               
    NormalizedFrequency: false                                           
                     Fs: 800                                             
                  Fs_in: 800                                             
                 Fs_out: 200                                             
        TransitionWidth: 20                                              
                  Astop: 80                                              
                                                                         

カイザー ウィンドウの設計は、簡単な方法で取得できます。

HNyqDecim = design(HfdNyqDecim,'kaiserwin','SystemObject', true);

HSpec2 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
                          'SpectralAverages', 50, 'OverlapPercent', 50, ...
                          'Title', 'Decimator with Nyquist filter',...
                          'YLimits', [-50, 0],...
                          'SampleRate', Fs/M*2);       % Spectrum scope
while ~isDone(HSource)
    inputSig = step(HSource);   % Input
    decimatedSig = step(HNyqDecim, inputSig);   % Decimator
    step(HSpec2, upsample(decimatedSig,2));  % Spectrum
    % The upsampling is done to increase X-limits of SpectrumAnalyzer
    % beyond (1/M)*Fs/2 for better visualization
end
release(HSpec2);
reset(HSource);

ナイキスト フィルターでのエイリアシング

フィルター処理される信号がフラット スペクトルであると仮定します。フィルター処理された後で、フィルターのスペクトル形状を取得します。サンプルレートを減らした後、このスペクトルは、新しいサンプリング低周波数の倍数である複製で繰り返されます。間引き信号のスペクトルの図は、以下にあります。

NFFT = 4096;
[H,f] = freqz(HNyqDecim,NFFT,'whole',Fs);
figure;
plot(f-Fs/2,20*log10(abs(fftshift(H))))
grid on
hold on
plot(f-Fs/M,20*log10(abs(fftshift(H))),'r-')
plot(f-Fs/2-Fs/M,20*log10(abs(fftshift(H))),'k-')
legend('Baseband spectrum', ...
    'First positive replica', 'First negative replica')
title('Alisasing with Nyquist filter');
set(gcf,'Color','White');
hold off

複製は重複するため、エイリアシングが導入されます。ただし、エイリアシングは遷移帯域のみで発生します。つまり、最初の複製からの有意のエネルギー (指定された 80 dB 以上) は、90 から 100 Hz までのベースバンドのみにエイリアシングします。フィルターはこの地域に遷移していたため、信号はその帯域で歪み、エイリアシングは重要ではありません。

一方で、上記のローパス設計と同じ遷移幅を使用したにもかかわらず、このナイキスト設計を元のローパス設計と比較すると、使用可能な帯域は以前よりも広く維持されている (80 Hz ではなく 90 Hz) ことに注目してください。これを説明するために、上記のローパス設計が使用される場合、間引き信号のスペクトルをプロットする同じ過程に従います。

[H,f] = freqz(HDecim,NFFT,'whole',Fs);
figure;
plot(f-Fs/2,20*log10(abs(fftshift(H))))
grid on
hold on
plot(f-Fs/M,20*log10(abs(fftshift(H))),'r-')
plot(f-Fs/2-Fs/M,20*log10(abs(fftshift(H))),'k-')
legend('Baseband spectrum', ...
    'First positive replica', 'First negative replica')
title('Alisasing with lowpass filter');
set(gcf,'Color','White');
hold off

この場合、複製間では有意のオーバーラップ (80 dB 以上) はありませんが、遷移領域は 80 Hz から開始されたため、結果の間引き信号の使用可能な帯域幅は小さくなります。

2 による間引き:ハーフバンド フィルター

間引き係数が 2 の場合、ナイキスト フィルターはハーフバンド フィルターになります。これらのフィルターは、係数の約半分がゼロに等しくなるため、非常に便利です。帯域が偶数でナイキスト フィルターを設計する場合、ある段階またはすべての段階でハーフバンド フィルターを使用する多段設計の実行を推奨します。

HfdHBDecim = fdesign.decimator(2,'halfband');
HHBDecim = design(HfdHBDecim,'equiripple','SystemObject', true);
HSpec3 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
                          'SpectralAverages', 50, 'OverlapPercent', 50, ...
                          'Title', 'Decimator with halfband filter',...
                          'YLimits', [-50, 0],...
                          'SampleRate', Fs);         % Spectrum scope
while ~isDone(HSource)
    inputSig = step(HSource);   % Input
    decimatedSig = step(HHBDecim, inputSig);   % Decimator
    step(HSpec3, upsample(decimatedSig,2));  % Spectrum
end
release(HSpec3);
reset(HSource);

他のナイキスト フィルターに関しては、ハーフバンドが間引きに使用される場合、エイリアシングは遷移領域にのみ発生します。

内挿

信号を内挿する場合、信号のベースバンド応答はできる限り変換しないようにします。サンプルレートの増大時にスペクトル複製を削除することにより、内挿を取得できます。

48 Hz でサンプリングされた信号があると仮定します。大きくサンプリングされている場合、24 Hz までの信号に意味のあるエネルギーがあります。4 のファクターによって内挿する場合、24 Hz でのカットオフで 192 Hz で実行されるローパス フィルターを設計することが理想です。間引きの場合、実際の許容遷移幅は、内挿で使用されるローパス フィルターの設計に、通過帯域リップルおよび有限の阻止帯域の減衰を統合する必要があります。たとえば、以下の仕様を考えます。

L   = 4;   % Interpolation factor
Fp  = 22;  % Passband-edge frequency
Fst = 24;  % Stopband-edge frequency
Ap  = 0.1; % Passband peak-to-peak ripple
Ast = 80;  % Minimum stopband attenuation
Fs  = 48;  % Sampling frequency
HfdInterp = fdesign.interpolator(L,'lowpass',Fp,Fst,Ap,Ast,Fs*L)
 
HfdInterp =
 
          MultirateType: 'Interpolator' 
               Response: 'Lowpass'      
    InterpolationFactor: 4              
          Specification: 'Fp,Fst,Ap,Ast'
            Description: {4x1 cell}     
    NormalizedFrequency: false          
                     Fs: 192            
                  Fs_in: 48             
                 Fs_out: 192            
                  Fpass: 22             
                  Fstop: 24             
                  Apass: 0.1            
                  Astop: 80             
                                        

仕様に準拠した等リップル設計は、間引きと同じ方法で見つかります。

HInterp = design(HfdInterp,'equiripple','SystemObject', true);

HSpec4 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
                 'SpectralAverages', 50, 'OverlapPercent', 50, ...
                 'Title', 'Interpolator with equiripple lowpass filter',...
                 'SampleRate', Fs*L);         % Spectrum scope
while ~isDone(HSource)
    inputSig = step(HSource);   % Input
    interpSig = step(HInterp, inputSig);   % Interpolator
    step(HSpec4, interpSig);  % Spectrum
end
release(HSpec4);
reset(HSource);

フィルターのゲインは 6 dBm であることに注目してください。通常、内挿には、内挿数に等しいゲインがあります。これは、内挿後に同じ範囲を維持するために内挿される信号に必要です。以下に例を示します。

release(HInterp);
HSin = dsp.SineWave('Frequency', 18, 'SampleRate', Fs, ...
                    'SamplesPerFrame', 100);
interpSig = step(HInterp,step(HSin));
HPlot = dsp.ArrayPlot('YLimits', [-2, 2], ...
                      'Title', 'Sine wave interpolated');
step(HPlot, interpSig(200:300)) % Plot the output

フィルターには 4 のゲインがあるにもかかわらず、内挿された信号には元の信号と同じ振幅があります。

内挿に対するナイキスト フィルターの使用

間引きの場合と同様、ナイキスト フィルターは内挿に便利です。さらに、L 個のサンプルごとにゼロに等しい係数があると仮定すると、ナイキスト フィルターを使用することにより、入力信号からのサンプルが出力で変更なしに保持されます。内挿に使用される際のローパス フィルターの場合は異なります (一方、他のフィルターでは歪みは最小になるため、大した問題ではありません)。

TW = 2;
HfdNyqInterp = fdesign.interpolator(L,'nyquist',L,TW,Ast,Fs*L)
HNyqInterp = design(HfdNyqInterp,'kaiserwin', 'SystemObject', true);

HSpec5 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
                          'SpectralAverages', 30, 'OverlapPercent', 50, ...
                          'Title', 'Interpolator with Nyquist filter',...
                          'SampleRate', Fs*L);         % Spectrum scope
while ~isDone(HSource)
    inputSig = step(HSource);   % Input
    interpSig = step(HNyqInterp, inputSig);   % Decimator
    step(HSpec5, interpSig);  % Spectrum
end
release(HSpec5);
reset(HSource);
 
HfdNyqInterp =
 
          MultirateType: 'Interpolator'                                  
               Response: 'Nyquist'                                       
    InterpolationFactor: 4                                               
          Specification: 'TW,Ast'                                        
            Description: {'Transition Width';'Stopband Attenuation (dB)'}
                   Band: 4                                               
    NormalizedFrequency: false                                           
                     Fs: 192                                             
                  Fs_in: 48                                              
                 Fs_out: 192                                             
        TransitionWidth: 2                                               
                  Astop: 80                                              
                                                                         

内挿に使用される際、ナイキスト フィルターは、間引きと類似した方法で、ある程度のイメージングを許容します。つまり、カットオフ周波数以上の周波数は、Ast の値によって減衰しません。ただし、フィルターの遷移帯域でのみ発生します。一方で、両方のフィルターが同じ遷移幅の場合、理想的なカットオフ周波数での阻止帯域エッジをもつローパス フィルターと比較すると、元の信号のベースバンドの広い部分は変化しません。

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