DSP System Toolbox


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

オクターブバンド フィルターおよび分数オクターブバンド フィルター

この例では、オクターブバンド フィルターと分数オクターブバンド フィルターの設計法を示します。オクターブバンド フィルターおよび分数オクターブバンド フィルターは、スペクトル解析のためのノイズ制御など、音響分野で一般的に使用されています。音響技師は、さまざまな周波数帯域における有意義なノイズ パワーとして、オクターブまたは分数 (たいてい 1/3) オクターブのフィルター バンクを使用することを好みます。

フル オクターブバンドと 1/3 オクターブバンドのフィルター バンクの設計

オクターブとは 2:1 の比率をもつ 2 つの周波数間の間隔です。オクターブバンド フィルターまたは分数オクターブバンド フィルターはその中心周波数と次数により決定されるバンドパス フィルターです。ANSI® S1.11-2004 規格では、クラス 0、クラス 1、およびクラス 2 の 3 クラスのフィルターに対する振幅の減衰限界が定義されています。クラス 0 では、通過帯域で ±15dB のリップルのみが認められ、クラス 1 フィルターでは ±3dB、クラス 2 フィルターでは ±5dB がそれぞれ認められています。フィルターのクラスにより、阻止帯域の減衰のレベルは 60dB から 75dB まで変化します。

フル オクターブバンド フィルター バンクの設計:

BandsPerOctave = 1;
N = 6;           % Filter Order
F0 = 1000;       % Center Frequency (Hz)
Fs = 48000;      % Sampling Frequency (Hz)
f = fdesign.octave(BandsPerOctave,'Class 1','N,F0',N,F0,Fs);

フィルター バンクを設計するために、オーディオ範囲内のすべての有効な中心周波数を取得します。

F0 = validfrequencies(f);
Nfc = length(F0);
for i=1:Nfc,
    f.F0 = F0(i);
    Hd(i) = design(f,'butter');
end

次に 1/3 オクターブバンド フィルター バンクを設計します。各フィルターの次数を 8 に増加します。

f.BandsPerOctave = 3;
f.FilterOrder = 8;
F0 = validfrequencies(f);
Nfc = length(F0);
for i=1:Nfc,
    f.F0 = F0(i);
    Hd3(i) = design(f,'butter');
end

2 つのフィルター バンクの振幅応答を可視化します。1/3 オクターブ フィルター バンクを使用すると詳細なスペクトル解析が可能になるものの、フル オクターブ フィルター バンクではオーディオ範囲 [20 20000Hz] をカバーするために 10 フィルターが必要になるのに対し、1/3 オクターブ フィルター バンクでは 30 フィルターが必要になるため、コストが増加します。

hfvt = fvtool(Hd,'FrequencyScale','log','color','white');
axis([0.01 24 -90 5])
title('Octave-Band Filter Bank')
hfvt = fvtool(Hd3,'FrequencyScale','log','color','white');
axis([0.01 24 -90 5])
title('1/3-Octave-Band Filter Bank')

ホワイト ノイズのスペクトル解析

人間の耳は、線形スケールよりも対数スケールに近いスケールで音の大きさを解釈しますが、DFT ベースの周波数解析では線形周波数スケールを使用します。スペクトル アナライザーを使用してホワイト ノイズ信号の (DFT ベースの) パワー スペクトルを計算します。

Nx = 100000;
SA = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'YLimits', [-80 20]);
tic,
while toc < 15
    % Run for 15 seconds
    xw = randn(Nx,1);
    step(SA,xw);
end

次に、1/3 オクターブ フィルター バンクでホワイト ノイズ信号をフィルター処理し、各フィルターの出力の平均強度を計算します。ホワイト ノイズ信号のパワー スペクトルは一定でも、高周波数はより大きく認識されます。1/3 オクターブ スペクトルは、人の聴力に近いグラフを形成します。各帯域 (すなわち、フィルター) が前のオクターブの 2 倍の周波数範囲を取るため、スペクトルは、1 つのオクターブあたりで 3 dB のパワーレベル上昇を示します。

SA2 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'RBWSource','Property','RBW',2000);
yw = zeros(Nx,Nfc);
tic,
while toc < 15
    % Run for 15 seconds
    xw = randn(Nx,1);
    for i=1:Nfc,
        yw(:,i) = filter(Hd3(i),xw);
    end
    step(SA2,yw);
end

ピンク ノイズのスペクトル解析

ホワイト ノイズ信号はすべての周波数で同じ強度分布になりますが、ピンク ノイズ信号は各オクターブで同じ強度分布になるため、0.5Hz ~ 1Hz の強度は 5,000Hz ~ 10,000Hz の強度と同じになります。

Hpink = dsp.ColoredNoise(1,Nx,1);
SA3 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'YLimits', [-80 20]);
tic,
while toc < 15
    % Run for 15 seconds
    x = step(Hpink);
    step(SA3,x);
end

次に、1/3 オクターブ フィルター バンクでピンク ノイズ信号をフィルター処理し、各フィルターの出力の平均強度を計算します。高い周波数ではピンク ノイズ信号の強度がオクターブごとに約 -3dB のレートで減少します。しかし、人間の耳には "一定" に聞こえ、1/3 オクターブバンド スペクトルがフィルター バンクの出力で一定になっています。

SA4 = dsp.SpectrumAnalyzer('SpectralAverages',50,'SampleRate',Fs,...
    'PlotAsTwoSidedSpectrum',false,'FrequencyScale','Log',...
    'RBWSource','Property','RBW',2000);
y = zeros(Nx,Nfc);
tic,
while toc < 15
    % Run for 15 seconds
    x = step(Hpink);
    for i=1:Nfc,
        y(:,i) = filter(Hd3(i),x);
    end
    step(SA4,y);
end