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

間引き設計/内挿設計

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

ハーフバンドの内挿と間引き

まず、係数 2 で信号のレートを変更する場合について検討します。これにはハーフバンド フィルターを使用すると効率的です。ハーフバンド FIR フィルターは、dsp.FIRHalfbandInterpolatordsp.FIRHalfbandDecimator に実装されています。これらの IIR バージョンである dsp.IIRHalfbandInterpolatordsp.IIRHalfbandDecimator を使用すると、さらに効率的に 2 による内挿/間引きが可能です。

Fs = 1e6;
hbInterp = dsp.FIRHalfbandInterpolator('TransitionWidth',Fs/10,...
    'SampleRate',Fs);
fvtool(hbInterp) % Notice gain of 2 (6 dB) in the passband
hbDecim  = dsp.FIRHalfbandDecimator('TransitionWidth',Fs/10,...
    'SampleRate',Fs);
fvtool(hbDecim)

サンプリング レート Fs は入力信号を指します。内挿の場合、このフィルターでは、スペクトル画像を減衰させながら 0 ~ Fs/2 の大半のスペクトルを維持します。間引きの場合は、約半分の帯域 (0 ~ Fs/4) を通過させ、エイリアシングを最小化するために残りの半分を減衰させます。減衰量は、内挿と間引きのどちらについても、望ましい任意の値に設定できます。指定しない場合の既定値は 80 dB です。

多段設計

ハーフバンド フィルターは、効率的な多段レート変換のためにカスケードできます。たとえば、8 による内挿/間引きは、ハーフバンドの内挿/間引きを 3 つカスケードして実行できます。3 つのフィルターを手作業で設計しなくても、dsp.SampleRateConverter を使用すれば、3 つすべてのフィルターが非常に効率よく設計されます。dsp.SampleRateConverter はハーフバンド フィルターの使用を超えた設計に使用できます。詳細については、任意の係数による効率的なサンプルレート変換を参照してください。

src = dsp.SampleRateConverter('InputSampleRate',10e3,...
    'OutputSampleRate',8*10e3,'Bandwidth',9e3);
info(src)
ans =

    'Overall Interpolation Factor    : 8
     Overall Decimation Factor       : 1
     Number of Filters               : 3
     Multiplications per Input Sample: 96.000000
     Number of Coefficients          : 66
     Filters:                         
        Filter 1:
        dsp.FIRInterpolator  - Interpolation Factor: 2 
        Filter 2:
        dsp.FIRInterpolator  - Interpolation Factor: 2 
        Filter 3:
        dsp.FIRInterpolator  - Interpolation Factor: 2 
     '

任意のレート変換の簡単な設計

実際のサンプリング周波数に関係なく、有理ファクターでレートを変更するフィルターを設計した方が望ましい場合があります。designMultirateFIR(L,M) では、整数ファクター L による内挿と整数ファクター M による間引きの FIR フィルターを設計します。designMultirateFIR ではフィルター係数が返されます。これらの係数は、dsp.FIRDecimator (L=1)、dsp.FIRInterpolator (M=1)、dsp.FIRRateConverter (一般的なケース) で使用されます。

L         = 5;
M         = 1;
b         = designMultirateFIR(L,M);
firInterp = dsp.FIRInterpolator(L,b);
fvtool(firInterp) % Notice gain of L in the passband

designMultirateFIR のオプションの入力により、遷移を急峻にして、阻止帯域の減衰量を改善することができます。遷移を急峻にするには、より大きな半分のポリフェーズの長さ (既定値は 12) を指定します。

hpl        = 20;
b2         = designMultirateFIR(L,M,hpl);
firInterp2 = dsp.FIRInterpolator(L,b2);
fvtool(firInterp,firInterp2)
legend('Polyphase length = 24','Polyphase length = 40')

間引きの詳細な設計

間引きの場合、信号のバンド幅を適切な値に減らして、サンプリング レートを減らす際に最低限のエイリアシングが発生するようにします。ナイキストの全区間を占める信号には (すなわち、大きくサンプリングされている)、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
fdDecim = fdesign.decimator(M,'lowpass',Fp,Fst,Ap,Ast,Fs) %#ok
fdDecim = 

  decimator with properties:

          MultirateType: 'Decimator'
               Response: 'Lowpass'
       DecimationFactor: 4
          Specification: 'Fp,Fst,Ap,Ast'
            Description: {4x1 cell}
    NormalizedFrequency: 0
                     Fs: 800
                  Fs_in: 800
                 Fs_out: 200
                  Fpass: 80
                  Fstop: 100
                  Apass: 0.1000
                  Astop: 80

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

decimFilter = design(fdDecim,'equiripple', 'SystemObject', true);
measure(decimFilter)
specScope1 = dsp.SpectrumAnalyzer(...
    'PlotAsTwoSidedSpectrum', false, ...
    'SpectralAverages', 50, 'OverlapPercent', 50, ...
    'Title', 'Decimator with equiripple lowpass filter',...
    'YLimits', [-50, 0], 'SampleRate', Fs/M*2);

for k = 1:1000
    inputSig = randn(500,1);            % Input
    decimatedSig = decimFilter(inputSig); % Decimator
    specScope1(upsample(decimatedSig,2)); % Spectrum
    % The upsampling is done to increase X-limits of SpectrumAnalyzer
    % beyond (1/M)*Fs/2 for better visualization
end
release(specScope1);
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 になります。ハーフバンド フィルターは M=2 の場合のナイキスト フィルターであることに注意してください。また、ナイキスト フィルターも designMultirateFIR で設計していることに注意してください。

この例では、遷移帯域の中心は 400/M = 100 Hz のあたりになります。

TW = 20; % Transition width of 20 Hz
fdNyqDecim = fdesign.decimator(M,'nyquist',M,TW,Ast,Fs) %#ok
fdNyqDecim = 

  decimator with properties:

          MultirateType: 'Decimator'
               Response: 'Nyquist'
       DecimationFactor: 4
          Specification: 'TW,Ast'
            Description: {2x1 cell}
                   Band: 4
    NormalizedFrequency: 0
                     Fs: 800
                  Fs_in: 800
                 Fs_out: 200
        TransitionWidth: 20
                  Astop: 80

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

nyqDecim   = design(fdNyqDecim,'kaiserwin','SystemObject', true);
specScope2 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
    'SpectralAverages', 50, 'OverlapPercent', 50, ...
    'Title', 'Decimator with Nyquist filter',...
    'YLimits', [-50, 0],...
    'SampleRate', Fs/M*2);

for k = 1:1000
    inputSig = randn(500,1);            % Input
    decimatedSig = nyqDecim(inputSig);    % Decimator
    specScope2(upsample(decimatedSig,2)); % Spectrum
    % The upsampling is done to increase X-limits of SpectrumAnalyzer
    % beyond (1/M)*Fs/2 for better visualization
end
release(specScope2);

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

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

NFFT = 4096;
[H,f] = freqz(nyqDecim,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('Aliasing with Nyquist filter');
fig = gcf;
fig.Color = 'White';
hold off

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

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

[H,f] = freqz(decimFilter,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('Aliasing with lowpass filter');
fig = gcf;
fig.Color = 'White';
hold off

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

内挿

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

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
fdInterp = fdesign.interpolator(L,'lowpass',Fp,Fst,Ap,Ast,Fs*L) %#ok
fdInterp = 

  interpolator with properties:

          MultirateType: 'Interpolator'
               Response: 'Lowpass'
    InterpolationFactor: 4
          Specification: 'Fp,Fst,Ap,Ast'
            Description: {4x1 cell}
    NormalizedFrequency: 0
                     Fs: 192
                  Fs_in: 48
                 Fs_out: 192
                  Fpass: 22
                  Fstop: 24
                  Apass: 0.1000
                  Astop: 80

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

EQRInterp  = design(fdInterp,'equiripple','SystemObject', true);
specScope4 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
    'SpectralAverages', 50, 'OverlapPercent', 50, ...
    'Title', 'Interpolator with equiripple lowpass filter', ...
    'SampleRate', Fs*L);

for k = 1:1000
    inputSig = randn(500,1);      % Input
    intrpSig = EQRInterp(inputSig); % Interpolator
    specScope4(intrpSig);           % Spectrum
end
release(specScope4);

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

release(EQRInterp);
sine = dsp.SineWave('Frequency', 18, 'SampleRate', Fs, ...
                    'SamplesPerFrame', 100);
intrpSig  = EQRInterp(sine());
arrayPlot = dsp.ArrayPlot('YLimits', [-2, 2], ...
                          'Title', 'Sine wave interpolated');
arrayPlot(intrpSig(200:300)) % Plot the output

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

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

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

TW = 2;
fdNyqIntrp = fdesign.interpolator(L,'nyquist',L,TW,Ast,Fs*L) %#ok
nyqInterp  = design(fdNyqIntrp,'kaiserwin', 'SystemObject', true);
specScope5 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ...
    'SpectralAverages', 30, 'OverlapPercent', 50, ...
    'Title', 'Interpolator with Nyquist filter',...
    'SampleRate', Fs*L);

for k = 1:1000
    inputSig = randn(500,1);      % Input
    intrpSig = nyqInterp(inputSig); % Decimator
    specScope5(intrpSig);           % Spectrum
end
release(specScope5);
fdNyqIntrp = 

  interpolator with properties:

          MultirateType: 'Interpolator'
               Response: 'Nyquist'
    InterpolationFactor: 4
          Specification: 'TW,Ast'
            Description: {2x1 cell}
                   Band: 4
    NormalizedFrequency: 0
                     Fs: 192
                  Fs_in: 48
                 Fs_out: 192
        TransitionWidth: 2
                  Astop: 80

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