MATLABで学ぶ信号処理  聴覚補正フィルタについて(A特性フィルタ~D特性フィルタまで)


スポンサーリンク

はじめに

フィルタは、”聴覚補正フィルタ”や”A特性フィルタ”といった用語を聴いたことがあると思います。

このフィルタは人間の聴感を模擬(モデル化?)するための補正フィルタです。

騒音計の”騒音値”と呼ばれるものはA特性を考慮した音圧値を使います。
通常、音圧の単位はPaもしくはdBですが、A特性を考慮した単位はdB(A)もしくはdBAと表記することが多いです。

今回は聴覚補正フィルタの紹介・説明をして、プログラムを公開します。

聴覚補正フィルタ

意外と知られていませんが、聴覚補正フィルタは関数で表されます。なので、だれでも簡単にフィルタを作ることができます。

ちなみに、Wikipediaに載っています。

A-weighting - Wikipedia

A特性

B特性

C特性

D特性

スポンサーリンク

各フィルタの比較

各フィルタの比較は以下です。

MATLABプログラム

実行コード

clear all;close all
freq=10:10*10^3;
filter_A=Audio_weighting_filter(freq,'A');
filter_B=Audio_weighting_filter(freq,'B');
filter_C=Audio_weighting_filter(freq,'C');
filter_D=Audio_weighting_filter(freq,'D');
figure
semilogx(freq,20*log10(filter_A),'b','linewidth',4)
grid on
hold on
semilogx(freq,20*log10(filter_B),'y','linewidth',4)
semilogx(freq,20*log10(filter_C),'r','linewidth',4)
semilogx(freq,20*log10(filter_D),'k','linewidth',4)
legend('A-weighting','B-weighting','C-weighting','D-weighting')
xlabel('Freq. Hz')
ylabel('Gain dB')

スポンサーリンク

functionファイル

個人的に、聴覚補正フィルタを使用する可能性があるので、いつもより綺麗にコードを書きました。MATLAB初心者の方には参考になるかもしれません。

function filter=Audio_weighting_filter(freq,option)

switch option
    case 'A'
        filter=A_filter(freq);
    case 'B'
        filter=B_filter(freq);
    case 'C'
        filter=C_filter(freq);
    case 'D'
        filter=D_filter(freq);
end


end

function filter=A_filter(freq)
RA=12194^2*freq.^4./.................
    ( (freq.^2+20.6^2).*( (freq.^2 + 107.7^2).*(freq.^2 + 737.9^2) ).^(1/2).*(freq.^2 + 12194^2) );
RA_1000=12194^2*1000.^4./.................
    ( (1000.^2+20.6^2).*( (1000.^2 + 107.7^2).*(1000.^2 + 737.9^2) ).^(1/2).*(1000.^2 + 12194^2) );
filter=RA./RA_1000;
end

function filter=B_filter(freq)
RB=12194^2*freq.^3./.................
    ( (freq.^2+20.6^2).*( (freq.^2 + 158.5^2) ).^(1/2).*(freq.^2 + 12194^2) );
RB_1000=12194^2*1000.^3./.................
    ( (1000.^2+20.6^2).*( (1000.^2 + 158.5^2) ).^(1/2).*(1000.^2 + 12194^2) );
filter=RB./RB_1000;
end

function filter=C_filter(freq)
RC=12194^2*freq.^2./.................
    ( (freq.^2+20.6^2).*(freq.^2 + 12194^2) );
RC_1000=12194^2*1000.^2./.................
    ( (1000.^2+20.6^2).*(1000.^2 + 12194^2) );
filter=RC./RC_1000;
end

function filter=D_filter(freq)
h=( (1037918.48 -freq.^2).^2 + 1080768.16*freq.^2 )./..................
    ( (9837328 - freq.^2).^2 + 11723776*freq.^2 );
filter=freq./(6.8966888496476*10^-5).*......................
    sqrt( h./( (freq.^2+79919.29).*(freq.^2+1345600) ) );
end

 

コメント