スポンサーリンク
はじめに
フィルタは、”聴覚補正フィルタ”や”A特性フィルタ”といった用語を聴いたことがあると思います。
このフィルタは人間の聴感を模擬(モデル化?)するための補正フィルタです。
騒音計の”騒音値”と呼ばれるものはA特性を考慮した音圧値を使います。
通常、音圧の単位はPaもしくはdBですが、A特性を考慮した単位はdB(A)もしくはdBAと表記することが多いです。
今回は聴覚補正フィルタの紹介・説明をして、プログラムを公開します。
聴覚補正フィルタ
意外と知られていませんが、聴覚補正フィルタは関数で表されます。なので、だれでも簡単にフィルタを作ることができます。
ちなみに、Wikipediaに載っています。

A-weighting - Wikipedia
A特性
B特性
C特性
D特性
スポンサーリンク
各フィルタの比較
MATLABプログラム
実行コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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初心者の方には参考になるかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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 |
コメント