読者です 読者をやめる 読者になる 読者になる

インパルス応答の分析(残響時間)

ほっしくんに指摘されたので、間違った情報(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を使わないといけないのかなぁ。