Main Content

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

dsp.FourthOrderSectionFilter

4 次セクション フィルターのカスケードの実装

説明

dsp.FourthOrderSectionFilter オブジェクトは 4 次セクション フィルターのカスケードを実装します。

作成

説明

fos = dsp.FourthOrderSectionFilter は、4 次フィルター セクションのカスケードを実装する FourthOrderSectionFilter オブジェクト fos を返します。

fos = dsp.FourthOrderSectionFilter(num,den) は、Numerator プロパティが num に設定され、Denominator プロパティが den に設定された FourthOrderSectionFilter オブジェクトを返します。

fos = dsp.FourthOrderSectionFilter(Name,Value) は、指定した各プロパティ名が指定の値に設定された FourthOrderSectionFilter オブジェクトを返します。追加の名前と値のペアの引数を任意の順番で指定できます。

例: fos = dsp.FourthOrderSectionFilter('Numerator',num,'Denominator',den)

プロパティ

すべて展開する

フィルターの分子係数。L 行 5 列の行列として指定します。ここで、L はフィルター セクションの数です。オブジェクトがロックされている場合はこのプロパティのサイズを変更することはできません。ただし、値の変更は可能です。

調整可能: Yes

データ型: single | double
複素数のサポート: あり

フィルターの分母係数。L 行 5 列の行列または L 行 4 列の行列として指定します。ここで、L はフィルター セクションの数です。最初の分母係数は常に 1 と見なされます。分母のサイズが L 行 4 列の場合、サイズが L 行 5 列 になるように (1 つ以上の) 1 が追加されます。分母のサイズが L 行 5 列の場合、最初の列の値は無視され、1 が追加されます。オブジェクトがロックされている場合はこのプロパティのサイズを変更することはできません。ただし、値の変更は可能です。

調整可能: Yes

データ型: single | double
複素数のサポート: あり

使用法

説明

y = fos(x) は指定された 4 次セクション フィルターを使用して入力信号をフィルター処理し、フィルター処理された出力 y を生成します。

入力引数

すべて展開する

ベクトルまたは行列として指定される入力信号。

入力は可変サイズ信号にすることができます。つまり、オブジェクトがロックされた後でも各チャネルのフレーム サイズ (行数) を変えることができます。ただし、チャネル数 (列数) を変えることはできません。

データ型: single | double
複素数のサポート: あり

出力引数

すべて展開する

フィルター処理された出力。ベクトルまたは行列として返されます。出力は入力信号と同じサイズ、データ型および実数/複素数となります。

データ型: single | double
複素数のサポート: あり

オブジェクト関数

すべて展開する

fvtoolDSP フィルターの周波数応答の可視化
freqz離散時間フィルター System object の周波数応答
impz離散時間フィルター System object のインパルス応答
infoInformation about filter System object
coeffsフィルター System object 係数を構造に返します。
costEstimate cost of implementing filter System object
grpdelay離散時間フィルター System object の群遅延応答
outputDelayDetermine output delay of single-rate or multirate filter
stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット
cloneSystem object の複製
isLockedSystem object が使用中かどうかの判定

すべて折りたたむ

dsp.FourthOrderSectionFilter オブジェクトを使用して、ノイズを含む正弦波信号をフィルター処理します。スペクトル アナライザーを使用して元の信号とフィルター処理された信号を可視化します。

入力信号

入力信号は、周波数が 100 Hz と 350 Hz の 2 つの正弦波の和です。標準偏差 1e-4 でゼロ平均のホワイト ガウス ノイズを正弦波の和に付加します。サンプル レートは 1000 Hz です。

frameSize = 1024;
fs = 1000;
Sine1 = dsp.SineWave(5,100,'SamplesPerFrame',1024,'SampleRate',fs);
Sine2 = dsp.SineWave(2,350,pi/2,'SamplesPerFrame',1024,...
    'SampleRate',fs);
x = Sine1()+Sine2()+1e-4.*randn(Sine1.SamplesPerFrame,1);

4 次セクション (FOS) フィルター係数

FOS フィルターの分子と分母の係数は、Audio Toolbox に含まれる designParamEq を使用することで得られます。

%N = [2,4];
%gain = [5,10];
%centerFreq = [0.025,0.75];
%bandwidth = [0.025,0.35];
%mode = 'fos';
%[num,den] = designParamEQ(N,gain,centerFreq,bandwidth,mode,'Orientation','row');

num = [1.0223   -1.9368    0.9205         0         0
    1.5171    2.3980    1.4317    0.6416    0.2752];

den = [-1.9368    0.9428         0         0
    2.0136    1.9224    1.0260    0.3016];

フィルターとスペクトル アナライザー の初期化

num 係数と den 係数を使用して FOS IIR フィルターを作成します。スペクトル アナライザーを作成して元の正弦波信号とフィルター処理された信号を可視化します。

fos = dsp.FourthOrderSectionFilter('Numerator',num,...
    'Denominator',den);

scope = spectrumAnalyzer(...
    'SampleRate',fs,...
    'PlotAsTwoSidedSpectrum',false,...
    'FrequencyScale','linear',...
    'Method','welch',...
    'Title','Original and Filtered Signals',...
    'ShowLegend',true,...
    'ChannelNames',{'Original Signal','Filtered Signal'});

入力信号をフィルター処理し、元のスペクトルとフィルター処理されたスペクトルを可視化します。

for i = 1:10000
    y = fos(x);
    scope([x,y]);
end
release(scope);

関数 fdesign を使用してローパス 4 次セクション (FOS) フィルターを設計します。このフィルターを使用し、3 kHz と 12 kHz の 2 つのトーンをもつノイズを含む正弦波信号をフィルター処理します。

'df2tsos' 構造体で楕円法を使用して 5 次フィルターを再設計します。周波数領域で L-無限大ノルム スケーリングを使用します。通過帯域周波数が 0.15π ラジアン/サンプル、阻止帯域周波数が 0.25π ラジアン/サンプルになるように指定します。許容通過帯域リップルを 1 dB に、阻止帯域の減衰量を 60 dB に指定します。

Fp = 0.15; 
Fst = 0.25;
Ap = 1; 
Ast = 60;

フィルター係数は fdopts.sosscaling オブジェクトを使用してスケーリングされます。スケーリング オブジェクトは分子の制約がないように定義されています。また、ScaleValueConstraint'unit' に設定することにより、スケーリングを 1 のスケーリングに指定します。

fdo = fdopts.sosscaling;
fdo.NumeratorConstraint='none';
fdo.ScaleValueConstraint='unit';

f = fdesign.lowpass('Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast);
hFilter = design(f,'ellip','SystemObject',true,...
    'FilterStructure','df2tsos','SOSScaleNorm','Linf',...
    'SOSScaleOpts',fdo)
hFilter = 
  dsp.SOSFilter with properties:

            Structure: 'Direct form II transposed'
    CoefficientSource: 'Property'
            Numerator: [3x3 double]
          Denominator: [3x3 double]
       HasScaleValues: true
          ScaleValues: [1 1 1 1.0000]

  Use get to show all properties

fvtool を使用して、設計したフィルターのローパス周波数応答を可視化します。

fvtool(hFilter)

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Magnitude (dB) contains 2 objects of type line.

関数 iirlp2bp を使用してローパス フィルターをバンドパス フィルターに変換します。

[num,den] = iirlp2bp(hFilter.Numerator,hFilter.Denominator,Fp,[0.25,0.75])
num = 3×5

    0.2456         0   -0.2456         0         0
    0.4175   -0.0000   -0.4206   -0.0000    0.4175
    0.4281   -0.0000   -0.6433   -0.0000    0.4281

den = 3×5

    1.0000   -0.0000    0.5088         0         0
    1.0000   -0.0000    0.0060   -0.0000    0.8657
    1.0000   -0.0000    0.5160   -0.0000    0.5283

これらの分子と分母の係数を使用して 4 次セクション フィルターを作成します。

fos = dsp.FourthOrderSectionFilter(num,den)
fos = 
  FourthOrderSectionFilter with properties:

      Numerator: [3x5 double]
    Denominator: [3x5 double]

fvtool を使用して、4 次セクション フィルターの周波数応答を可視化します。

fvtool(fos);

Figure Figure 2: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Magnitude (dB) contains an object of type line.

4 次セクション フィルターでノイズを含む入力信号をフィルター処理します。スペクトル アナライザーを使用して、元の信号のスペクトルとフィルター処理された信号のスペクトルを可視化します。

入力は、周波数がそれぞれ 3 kHz と 12 kHz の 2 つの正弦波の和です。入力サンプル レートは 44.1 kHz で、フレーム サイズは 1024 サンプルに設定されます。

fs = 44100;
FrameLength = 1024;

SINE1 = dsp.SineWave('SamplesPerFrame',FrameLength,'SampleRate',fs,'Frequency',3000);
SINE2 = dsp.SineWave('SamplesPerFrame',FrameLength,'SampleRate',fs,'Frequency',12000);

スペクトル アナライザーを初期化して信号のスペクトルを可視化します。

scope = spectrumAnalyzer(...
    'SampleRate',fs,...
    'PlotAsTwoSidedSpectrum',false,...
    'Title','Original and Filtered Signals',...
    'ShowLegend',true,...
    'YLimits',[-180 50],...
    'ChannelNames',{'Original Signal','Filtered Signal'});
for index = 1:1000    
    x = SINE1() + SINE2()+ 0.001*randn(FrameLength,1);    
    y = fos(x);
    scope([x,y]);    
end

バージョン履歴

R2019a で導入