スポンサーリンク
はじめに
フィルタは、”聴覚補正フィルタ”や”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
コメント