ほっしくんに指摘されたので、間違った情報(10月13日のエントリー後半)を修正すべく、プログラムを書きました。残響時間(RT60)は、「信号のエネルギーが60dB減衰するまでの時間」と定義されています。ISOではその定義を発展させて?現実の測定に即した形にしてあるようです。-5dB〜-35dBの部分に直線をあてはめて、そこから外挿して-60dBに相当する時間を求めるやり方が使われるのだとか。プログラムは以下の通り。
function rt = reverb_time(x, fs) %REVERB_TIME Compute Reverberation Time (RT60) % Compute RT60 from T30 (least square fit between reverberation % envelope at -5dB and -35dB). % % 2008-11-17 T1 = -5; T2 = -35; T3 = -60; re = reverb_envelope(x); mm = max(10*log10(re)); t = ([0:length(re)-1]/fs)'; z = 10*log10(re)-mm; ind = [sum(z >= T1) sum(z >= T2)]; p = polyfit(z(ind(1):ind(2)), t(ind(1):ind(2)), 1); rt = polyval(p, T3);
僕はpolyfitで近似曲線を作ってpolyvalで外挿してますが、-5から-35までが30dBぶんの減衰なので、その時間を2倍しちゃってもいいようです。ただ、残響曲線に直線的な減衰が始まるのが-5dBより後の場合はどうするんでしょう? -10dB〜-40dBの外挿でも、-10dB〜-30dBの外挿でも、最終的に-60dBまでの時間が求まれば良いんでしょうか? それともISOに従って-5dB〜-35dBを使わないといけないのかなぁ。