Main Content

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

ピーク フィルターとノッチ フィルターの設計

この例では、ピーク フィルターとノッチ フィルターの設計法を示します。特定の周波数でピークに達するまたは刻むフィルターは、信号の特定の周波数コンポーネントを保持または削除します。このようなフィルターで設定できる設計パラメーターは、ピークまたはノッチを得る周波数、および 3-dB の帯域幅または Q 係数です。これらの仕様を使用し、フィルター次数を増やすことで、理想フィルターに密接に近似するフィルターを設計することが可能です。

二次型ノッチ フィルター

3000 Hz で抽出された信号の 60 Hz の干渉を排除するとします。この場合、二次型ノッチ フィルターを使用し、関数designNotchPeakIIRを使用してフィルターの係数を計算することができます。関数には、正規化単位での周波数が必要です。それに応じて設計パラメーターをスケーリングし、それらを関数に指定します。ノッチ フィルターを設計する場合は Response="notch" オプションを使用し、ピーク フィルターを設計する場合は Response="peak" オプションを使用します。

Fs = 3000;   % Sampling frequency is 3000 Hz
Fnyq = Fs/2; % Nyquist frequency is half the sampling frequency

F0 = 60;   % Interference is at 60 Hz
BW = 6;    % Choose a bandwidth factor of 6Hz
[num1,den1] = designNotchPeakIIR(Response="notch",CenterFrequency=F0/Fnyq,Bandwidth=BW/Fnyq,FilterOrder=2);
filterAnalyzer({num1,den1,1},SampleRates=Fs)

品質係数を指定してフィルターを設計することもできます。品質係数は、ノッチ周波数またはピーク周波数 F0 と帯域幅 BW の比率 Q=F0/BW として定義されます。品質係数は、他の周波数から目的の周波数を分離する性能を示す尺度です。フィルター次数を固定する場合、極を零点に近づけることでより高い Q を得ることができます。ただし、設計されたフィルターに最適な形状を実現するためには、帯域幅を指定する方が便利です。

品質係数を指定し、それを使用して 3-dB 帯域幅を計算することで、別の二次型フィルターを設計します。関数 designNotchPeakIIR を使用してフィルター係数を計算します。フィルターの振幅応答を可視化します。

Q2 = 100;    % Choose a Q factor of 100
[num2,den2] = designNotchPeakIIR(Response="notch",CenterFrequency=F0/Fnyq,QualityFactor=Q2,FilterOrder=2);
filterAnalyzer({num1,den1,1}, {num2,den2,1}, SampleRates=Fs, FilterNames=["notchQ10","notchQ100"])

二次型ピーク フィルター

ピーク フィルターは、信号から単一の周波数 (または狭い周波数帯域) の成分のみを保持するために使用されます。同じ関数 designNotchPeakIIR を使用して、ピーク フィルターの係数を計算します。

Fs = 3000;   % Sampling frequency is 3000 Hz
Fnyq = Fs/2; % Nyquist frequency is half the sampling frequency

F0 = 1000;   % Interference is at 60 Hz

Q1 = 10;
[num1, den1] = designNotchPeakIIR(Response="peak",CenterFrequency = F0/Fnyq,QualityFactor=Q1,FilterOrder=2);

Q2 = 100;
[num2, den2] = designNotchPeakIIR(Response="peak",CenterFrequency = F0/Fnyq,QualityFactor=Q2,FilterOrder=2);

filterAnalyzer({num1,den1,1}, {num2,den2,1}, SampleRates=Fs, FilterNames=["peakQ10","peakQ100"])

時変二次型ノッチ フィルターの実装

時変フィルターを使用するには、シミュレーションの実行中にフィルターの係数を変更しなければなりません。これは、実行中にパラメーターを変化させながら関数 designNotchPeakIIR を呼び出すことで実現できます。また、DSP System Toolbox™ は、(調整可能な) 時変二次型のノッチ フィルターおよびピーク フィルターの設計と実装を行うためのdsp.NotchPeakFilterオブジェクトを提供しています。

静的フィルターによる動的シミュレーション

時変フィルターを実装するには、フィルターをシミュレートする動的設定を作成して、時変設計パラメーターをもつフィルターを実装します。

まず、フィルターの係数が変化せず、動的でストリーミング処理されるシミュレーションを作成します。2 つの二次型ノッチ フィルターを作成します。1 番目はdsp.SOSFilterオブジェクトを使用し、2 番目は dsp.NotchFilter オブジェクトを使用します。最初のフィルターでは、中心周波数を 1 kHz、-3 dB における帯域幅を 500 Hz に設定します。関数 designNotchPeakIIR を使用して、このフィルターの係数を直接計算します。2 番目のフィルターでは、中心周波数を 3 kHz、-3 dB における帯域幅を 500 Hz に設定します。両フィルターのサンプル レートは 8 kHz です。Verbose=true オプションを使用して、未指定のパラメーターの既定値を出力します。この場合、FilterOrder は指定されておらず、既定の 2 になります。

Fs = 8e3;    % 8 kHz sampling frequency
Fnyq = Fs/2; % Nyquist frequency

% Input parameters
samplesPerFrame = 256;
nFrames = 8192;

F01 = 1e3;   % Notch at 1 kHz for Filter 1
BW = 500;    % 500 Hz bandwidth for both filters
[b, a] = designNotchPeakIIR(Response="notch",CenterFrequency=F01/Fnyq,Bandwidth=BW/Fnyq,Verbose=true) % Filter 1 coefficients
designNotchPeakIIR(FilterOrder=2, CenterFrequency=0.25, Bandwidth=0.125, HasScaleValues=false, Response="notch")
b = 1×3

    0.8341   -1.1796    0.8341

a = 1×3

    1.0000   -1.1796    0.6682

sosFilter = dsp.SOSFilter(b,a);

F02 = 3e3;    % Notch at 3 kHz for Filter 2

npFilter = dsp.NotchPeakFilter(CenterFrequency=F02,Bandwidth=BW,SampleRate=Fs);

scope = spectrumAnalyzer(PlotAsTwoSidedSpectrum=false, ...
    SampleRate=Fs, ...
    AveragingMethod="exponential",...
    ForgettingFactor=.95,...
    ChannelNames=["Filter 1","Filter 2"],...
    ShowLegend=true);

for k = 1:nFrames
   x = randn(samplesPerFrame, 1);
   y1 = sosFilter(x);
   y2 = npFilter(x);
   scope([y1,y2]);
end

時変フィルターによるシミュレーション

時変フィルターの設計パラメーター (ノッチ フィルターの中心周波数など) は実行時に変化するため、その係数は時間経過とともに変化します。時変設計パラメーターをもつ 2 つの二次型ノッチ フィルターを作成します。静的フィルターと同様に、関数 designNotchPeakIIRdsp.SOSFilter オブジェクトを使用して最初のフィルターを実装し、dsp.NotchPeakFilter オブジェクトを使用して 2 番目のフィルターを実装します。時間経過とともに 2 つのフィルターの設計パラメーターを変化させます。

% Notch filter parameters - how they vary over time
Fs = 8e3;                       % 8 kHz sampling frequency
F01 = 1e3 * [0.5, 1, 1.5, 3];   % Notch frequencies for Filter 1
F02 = 1e3 * [3.5, 3, 2.5, 2];   % Notch frequencies for Filter 2
BW = 500 * ones(1,4);           % 500 Hz bandwidth for both filters

myChangingParams1 = struct(f0=num2cell(F01/(Fs/2)),bw=num2cell(BW/(Fs/2)));
myChangingParams2 = struct(F0=num2cell(F02),BW=num2cell(BW));
paramsChangeTimes = [0, 70, 140, 210]; % in seconds

% Simulation time management
nSamplesPerFrame = 256;
tEnd = 300;
nSamples = ceil(tEnd * Fs);
nFrames = floor(nSamples / nSamplesPerFrame);

% Object creation
sosFilter = dsp.SOSFilter; %Filter 1 object
npFilter = dsp.NotchPeakFilter(SampleRate=Fs);
scope = spectrumAnalyzer(PlotAsTwoSidedSpectrum=false, ...
    SampleRate=Fs, ...
    AveragingMethod="exponential",...
    ForgettingFactor=.75,...
    ChannelNames=["Filter 1","Filter 2"],...
    ShowLegend=true);
paramtbl1 = ParameterTimeTable(Time=paramsChangeTimes, ...
    Values=myChangingParams1, ...
    SampleRate=Fs/nSamplesPerFrame);
paramtbl2 = ParameterTimeTable(Time=paramsChangeTimes, ...
    Values=myChangingParams2, ...
    SampleRate=Fs/nSamplesPerFrame);

% Actual simulation loop
for frameIdx = 1:nFrames
    % Get current F0 and BW
    [params1, update1] = paramtbl1();
    [params2, update2] = paramtbl2();
    if(update1)
        % Recompute filter coefficients if parameters changed
        [b, a] = designNotchPeakIIR(Response="notch",CenterFrequency=params1.f0,Bandwidth=params1.bw); 
        % Set filter coefficients to new values
        sosFilter.Numerator = b;
        sosFilter.Denominator = a;
    end
    if(update2)
        npFilter.CenterFrequency = params2.F0;
        npFilter.Bandwidth = params2.BW;
    end
    % Generate vector of white noise samples
    x = randn(nSamplesPerFrame, 1);
    % Filter noise
    y1 = sosFilter(x);
    y2 = npFilter(x);
    % Visualize spectrum
    scope([y1,y2]);
end

調整可能なピーク フィルターも、dsp.NotchPeakFilter オブジェクトを使用するか、関数 iirpeakdsp.SOSFilter オブジェクトを使用して同じように実装できます。

メモ: 調整可能なピーク フィルターおよびノッチ フィルターはコード生成をサポートします。

高次型のノッチ フィルターとピーク フィルター

フィルターの安定性に影響を与えずに特定の点を超えて極を動かすことはできないため、フィルターの急峻な特性をもつ近似を改良するためには、フィルターの次数を増加させなければなりません。FilterOrder 設計パラメーターを使用してノッチ フィルターやピーク フィルターの次数を設定し、SystemObject=true オプションを使用して dsp.SOSFilter System object を設計します。二次型ノッチ フィルターの設計を 6 次のノッチ フィルターと比較します。

notchfilt2 = designNotchPeakIIR(Response="notch",FilterOrder=2,CenterFrequency=0.4,QualityFactor=100,SystemObject=true);
notchfilt6 = designNotchPeakIIR(Response="notch",FilterOrder=6,CenterFrequency=0.4,QualityFactor=100,SystemObject=true);

filterAnalyzer(notchfilt2, notchfilt6, FilterNames=["notch2ndOrderFilter","notch6thOrderFilter"])

同様に、二次型ピーク フィルターの設計を 8 次のピーク フィルターと比較します。

peakfilt2 = designNotchPeakIIR(Response="peak",FilterOrder=2,CenterFrequency=0.6,QualityFactor=80,SystemObject=true);
peakfilt8 = designNotchPeakIIR(Response="peak",FilterOrder=8,CenterFrequency=0.6,QualityFactor=80,SystemObject=true);

filterAnalyzer(peakfilt2, peakfilt8, FilterNames=["peak2ndOrderFilter", "peak8thOrderFilter"])

通過帯域と阻止帯域のリップルが制御された高次型のノッチ フィルターとピーク フィルター

指定されたフィルター次数について、通過帯域リップルまたは阻止帯域リップル (あるいはその両方) を許容することで、遷移をより鋭くすることができます。これは、fdesign.notchおよびfdesign.peakフィルター仕様オブジェクトを使用することで実現できます。これまでに説明したすべての仕様およびトレードオフは、ノッチ フィルターとピーク フィルターに等しく適用されます。

N = 8; F0 = 0.4; BW = 0.1;
notchfilt = designNotchPeakIIR(Response="notch",FilterOrder=N,CenterFrequency=F0,Bandwidth=BW,SystemObject=true);

notchspec1 = fdesign.notch("N,F0,BW,Ap,Ast",N,F0,BW,0.5,60);
notchfilt1 = design(notchspec1,SystemObject=true);

filterAnalyzer(notchfilt, notchfilt1, FilterNames=["NotchMaximallyFlat8thOrderFilter",...
    "Notch8thOrderFilterWithPassbandorStopbandRipples"])

N = 6; 
F0 = 0.7; 
BW = 0.001;
peakfilt = designNotchPeakIIR(Response="peak",FilterOrder=N,CenterFrequency=F0,Bandwidth=BW,SystemObject=true);
peakspec1 = fdesign.peak("N,F0,BW,Ast",N,F0,BW,80);
peakfilt1 = design(peakspec1,SystemObject=true);
filterAnalyzer(peakfilt, peakfilt1, FilterNames=["PeakMaximallyFlat6thOrderFilter",...
    "Peak6thOrderFilterWith80dBStopbandAttenuation"])

参考

関数

オブジェクト

関連するトピック