ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

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

この例では、オクターブバンド フィルターと分数オクターブバンド フィルターの設計法を示します。オクターブバンド フィルターおよび分数オクターブバンド フィルターは、スペクトル解析のためのノイズ制御など、音響分野で一般的に使用されています。音響技師は、さまざまな周波数帯域における有意義なノイズ パワーとして、オクターブまたは分数 (たいてい 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)
 
f =
 
               Response: 'Octave and Fractional Octave'            
         BandsPerOctave: 1                                         
                   Mask: 'Class 1'                                 
          Specification: 'N,F0'                                    
            Description: {'Filter Order';'Exact Midband Frequency'}
    NormalizedFrequency: false                                     
                     Fs: 48000                                     
            FilterOrder: 6                                         
                     F0: 1000                                      
                                                                   

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

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 ベースの) パワー スペクトルを計算します。

rng(0,'twister'); Nx = 100000;
xw = randn(Nx,1);
[Syyw, fPyyw] = pwelch(xw,hamming(64),[],[],Fs,'power');

次に、1/3 オクターブ フィルター バンクでホワイト ノイズ信号をフィルター処理し、各フィルターの出力の平均強度を計算します。

yw = zeros(Nx,Nfc);
Pyyw = zeros(1,Nfc);
for i=1:Nfc,
    yw(:,i) = filter(Hd3(i),xw);
    [pPwr, pFreq] = pwelch(yw(:,i),hamming(64),[],[],Fs);
    Pyyw(i) = bandpower(pPwr, pFreq,'psd');
end

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

figure('Color','white')
semilogx(fPyyw,10*log10(Syyw),'o')
axis([20 20000 -60 0])
title('Welch Power Spectrum Estimate of White Noise')
xlabel('Frequency (Hz)');ylabel('Power (dB)')
figure('Color','white')
semilogx(F0,10*log10(Pyyw),'o')
axis([20 20000 -60 0])
title('1/3-Octave Spectrum of White Noise')
xlabel('Frequency (Hz)');ylabel('Power (dB)')

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

ホワイト ノイズ信号はすべての周波数で同じ強度分布になりますが、ピンク ノイズ信号は各オクターブで同じ強度分布になるため、0.5Hz ~ 1Hz の強度は 5,000Hz ~ 10,000Hz の強度と同じになります。ここでも、ウェルチ法を使用してピンク ノイズ信号の (DFT ベースの) パワー スペクトルを計算します。

load pinknoise;
[Syy, fPyy] = pwelch(x,hamming(64),[],[],Fs,'power');

次に、1/3 オクターブ フィルター バンクでピンク ノイズ信号をフィルター処理し、各フィルターの出力の平均強度を計算します。

Pyy = zeros(1,Nfc);
for i=1:Nfc,
    y = zeros(Nx,Nfc);
    y(:,i) = filter(Hd3(i),x);
    [pPwr, pFreq] = pwelch(y(:,i),hamming(64),[],[],Fs);
    Pyy(i) = bandpower(pPwr, pFreq, 'psd');
end

ウェルチ パワー スペクトル推定に示されているように、高い周波数ではピンク ノイズ信号の強度がオクターブごとに約 -3dB のレートで減少します。しかし、人間の耳には "一定" に聞こえ、1/3 オクターブバンド スペクトルがフィルター バンクの出力で一定になっています。

figure('Color','white')
semilogx(fPyy,10*log10(Syy),'o')
axis([20 24000 -80 -20])
title('Welch Power Spectrum Estimate of Pink Noise')
xlabel('Frequency (Hz)');ylabel('Power (dB)')
figure('Color','white')
semilogx(F0,10*log10(Pyy),'o')
axis([20 24000 -80 -20])
title('1/3-Octave Spectrum of Pink Noise')
xlabel('Frequency (Hz)');ylabel('Power (dB)')

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